• SLAM从入门到精通(rviz自定义形状)


    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

            rviz作为很好的上位机调试工具,它本身可以显示很多的传感器数据。比如说lidar、map、tf、camera、点云这些,在rviz上面显示都没有问题。但是有一些数据,我们其实是希望进行自定义显示的。以slam来讲,目前常见的slam就是激光slam和视觉slam。不管哪一种slam,环境的自然特征总没有人工设计的强特征来的稳定,激光slam的稳定特征就是反光柱,而视觉slam的稳定特征就是二维码。但是可惜的是,rviz本身并不支持反光柱的显示和二维码的显示,所以我们完全有必要通过自定义的方法来达成这一目的。

    1、rviz的显示方法

            实现的基本方法也是通过编程来实现的。主要是通过visualization_msgs::Marker消息的方法来实现rviz的自定义显示。等Marker定义好了之后,就可以通过marker_pub发布出去。rviz收到这个发布的消息之后,接着就可以在图形界面上显示出来。

    2、示例代码basic_shapes.cpp

    1. #include <ros/ros.h>
    2. #include <visualization_msgs/Marker.h>
    3. int main( int argc, char** argv )
    4. {
    5. ros::init(argc, argv, "basic_shapes");
    6. ros::NodeHandle n;
    7. ros::Rate r(1);
    8. ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>("visualization_marker", 1);
    9. // Set our initial shape type to be a cube
    10. uint32_t shape = visualization_msgs::Marker::CUBE;
    11. while (ros::ok())
    12. {
    13. visualization_msgs::Marker marker;
    14. // Set the frame ID and timestamp. See the TF tutorials for information on these.
    15. marker.header.frame_id = "my_frame";
    16. marker.header.stamp = ros::Time::now();
    17. // Set the namespace and id for this marker. This serves to create a unique ID
    18. // Any marker sent with the same namespace and id will overwrite the old one
    19. marker.ns = "basic_shapes";
    20. marker.id = 0;
    21. // Set the marker type. Initially this is CUBE, and cycles between that and SPHERE, ARROW, and CYLINDER
    22. marker.type = shape;
    23. // Set the marker action. Options are ADD, DELETE, and new in ROS Indigo: 3 (DELETEALL)
    24. marker.action = visualization_msgs::Marker::ADD;
    25. // Set the pose of the marker. This is a full 6DOF pose relative to the frame/time specified in the header
    26. marker.pose.position.x = 0;
    27. marker.pose.position.y = 0;
    28. marker.pose.position.z = 0;
    29. marker.pose.orientation.x = 0.0;
    30. marker.pose.orientation.y = 0.0;
    31. marker.pose.orientation.z = 0.0;
    32. marker.pose.orientation.w = 1.0;
    33. // Set the scale of the marker -- 1x1x1 here means 1m on a side
    34. marker.scale.x = 1.0;
    35. marker.scale.y = 1.0;
    36. marker.scale.z = 1.0;
    37. // Set the color -- be sure to set alpha to something non-zero!
    38. marker.color.r = 0.0f;
    39. marker.color.g = 1.0f;
    40. marker.color.b = 0.0f;
    41. marker.color.a = 1.0;
    42. marker.lifetime = ros::Duration();
    43. // Publish the marker
    44. while (marker_pub.getNumSubscribers() < 1)
    45. {
    46. if (!ros::ok())
    47. {
    48. return 0;
    49. }
    50. ROS_WARN_ONCE("Please create a subscriber to the marker");
    51. sleep(1);
    52. }
    53. marker_pub.publish(marker);
    54. // Cycle between different shapes
    55. switch (shape)
    56. {
    57. case visualization_msgs::Marker::CUBE:
    58. shape = visualization_msgs::Marker::SPHERE;
    59. break;
    60. case visualization_msgs::Marker::SPHERE:
    61. shape = visualization_msgs::Marker::ARROW;
    62. break;
    63. case visualization_msgs::Marker::ARROW:
    64. shape = visualization_msgs::Marker::CYLINDER;
    65. break;
    66. case visualization_msgs::Marker::CYLINDER:
    67. shape = visualization_msgs::Marker::CUBE;
    68. break;
    69. default:
    70. break;
    71. }
    72. r.sleep();
    73. }
    74. }

            代码的内容比较简单,就是定义显示一种形状。当然,这种现实纯属于demo性质。实际应用的时候,我们一般会设置固定的形状和大小。并且在状态发生改变的时候,这种形状的颜色,有可能发生改变。

            需要注意的是,很多网上demo中frame_id都修改成了/my_frame,这是不对的。正确的做法应该是my_frame,没有前面的/。不然rviz有可能显示不出来效果。

    3、添加编译脚本

    1. add_executable(basic_shapes src/basic_shapes.cpp)
    2. target_link_libraries(basic_shapes ${catkin_LIBRARIES})
    3. add_dependencies(basic_shapes beginner_tutorials_generate_messages_cpp)

    4、编译方法

            编译比较简单,就是在workspace的顶层输入catkin_make即可。

    5、开始测试

            测试的方法也不复杂。主要过程分成三步来做。第一步,输入roscore;第二步,直接输入rosrun beginner_tutorials basic_shapes;第三步,输入rosrun rviz rviz。把fixed frame设置成my_frame之后,再添加一个Marker,基本上就可以看到我们想看的效果了。

  • 相关阅读:
    pycharm远程连接miniconda完整过程,以及遇到的问题解决
    golang基础:channel的应用场景
    猿创征文|【算法刷题日记之本手篇】洗牌与MP3光标位置
    CLIP模型资料学习
    解决arm-none-eabi-gcc交叉编译helloworld程序segmentation fault 错误
    基于SSM的新闻管理系统
    Selenium+dddocr轻松解决Web自动化验证码识别
    Java多线程、常用类、枚举类、注解、集合、泛型、IO、反射
    plumelog日志框架的搭建与使用
    Nacos手摸手教学【二】Nacos注册中心
  • 原文地址:https://blog.csdn.net/feixiaoxing/article/details/133973755