ROS专题----数据可视化rviz简明笔记

举报
zhangrelay 发表于 2021/07/15 06:21:09 2021/07/15
【摘要】 ROS数据可视化rviz简明笔记 ---- 标记:发送基本形状(C ++)显示如何使用visualization_msgs / Marker消息将基本形状(立方体,球体,圆柱体,箭头)发送到rviz。标记:点和线(C ++)教导如何使用visualization_msgs / Marker消息将点和线发送到rviz。交互式标记:入门本教程解释什么是交互式标记,并教你一些基本...

ROS数据可视化rviz简明笔记

----

  1. 标记:发送基本形状(C ++)

    显示如何使用visualization_msgs / Marker消息将基本形状(立方体,球体,圆柱体,箭头)发送到rviz。

  2. 标记:点和线(C ++)

    教导如何使用visualization_msgs / Marker消息将点和线发送到rviz。

  3. 交互式标记:入门

    本教程解释什么是交互式标记,并教你一些基本的概念。

  4. 交互式标记:编写简单的交互式标记服务器

    本教程介绍如何设置管理单个交互式标记的极简主义服务器。

  5. 交互式标记:基本控件

    本教程解释basic_controls教程代码如何工作。

  6. 插件:新显示类型

    如何编写一个插件,为RViz添加一个新的显示功能。

  7. 插件:新的可停靠面板

    如何编写一个插件,添加一个新类型的可停靠Panel小部件到RViz。

  8. 插件:新工具类型

    如何编写一个插件,为RViz添加一个新工具。

  9. Librviz:将RViz纳入自定义GUI

    如何使用RViz可视化窗口小部件编写应用程序。

  10. Rviz in Stereo

    教你如何设置Rviz在3D立体声渲染。



----


  
  1. $ tree -L 3
  2. .
  3. ├── interactive_marker_tutorials
  4. │   ├── CHANGELOG.rst
  5. │   ├── CMakeLists.txt
  6. │   ├── package.xml
  7. │   ├── scripts
  8. │   │   ├── basic_controls.py
  9. │   │   ├── cube.py
  10. │   │   ├── menu.py
  11. │   │   └── simple_marker.py
  12. │   └── src
  13. │   ├── basic_controls.cpp
  14. │   ├── cube.cpp
  15. │   ├── menu.cpp
  16. │   ├── point_cloud.cpp
  17. │   ├── pong.cpp
  18. │   ├── selection.cpp
  19. │   └── simple_marker.cpp
  20. ├── librviz_tutorial
  21. │   ├── CHANGELOG.rst
  22. │   ├── CMakeLists.txt
  23. │   ├── package.xml
  24. │   ├── rosdoc.yaml
  25. │   └── src
  26. │   ├── doc
  27. │   ├── main.cpp
  28. │   ├── myviz.cpp
  29. │   └── myviz.h
  30. ├── rviz_plugin_tutorials
  31. │   ├── CHANGELOG.rst
  32. │   ├── CMakeLists.txt
  33. │   ├── icons
  34. │   │   └── classes
  35. │   ├── media
  36. │   │   └── flag.dae
  37. │   ├── package.xml
  38. │   ├── plugin_description.xml
  39. │   ├── rosdoc.yaml
  40. │   ├── scripts
  41. │   │   └── send_test_msgs.py
  42. │   └── src
  43. │   ├── doc
  44. │   ├── drive_widget.cpp
  45. │   ├── drive_widget.h
  46. │   ├── flag.h
  47. │   ├── imu_display.cpp
  48. │   ├── imu_display.h
  49. │   ├── imu_visual.cpp
  50. │   ├── imu_visual.h
  51. │   ├── plant_flag_tool.cpp
  52. │   ├── plant_flag_tool.h
  53. │   ├── teleop_panel.cpp
  54. │   └── teleop_panel.h
  55. ├── rviz_python_tutorial
  56. │   ├── CHANGELOG.rst
  57. │   ├── CMakeLists.txt
  58. │   ├── config.myviz
  59. │   ├── doc-src
  60. │   │   ├── conf.py
  61. │   │   ├── index.rst
  62. │   │   ├── myviz.png
  63. │   │   └── tutorialformatter.py
  64. │   ├── myviz.py
  65. │   ├── package.xml
  66. │   └── rosdoc.yaml
  67. ├── visualization_marker_tutorials
  68. │   ├── CHANGELOG.rst
  69. │   ├── CMakeLists.txt
  70. │   ├── package.xml
  71. │   └── src
  72. │   ├── basic_shapes.cpp
  73. │   └── points_and_lines.cpp
  74. └── visualization_tutorials
  75. ├── CHANGELOG.rst
  76. ├── CMakeLists.txt
  77. └── package.xml
  78. 18 directories, 57 files


----

1 标记:基本形状,点,线等

补充阅读:

1 DisplayTypes/Marker:http://wiki.ros.org/rviz/DisplayTypes/Marker

2 rviz/UserGuide:http://wiki.ros.org/rviz/UserGuide

3 tf/tf2:http://wiki.ros.org/tf http://wiki.ros.org/tf2

代码解析等参考如下:

1 标记:发送基本形状(C ++)

2 标记:点和线(C ++)

使用命令和效果,如下:

$ rosrun visualization_marker_tutorials basic_shapes

在rviz中,添加Marker,修改Fixed Frame为my_frame,可见如下不断变化的基本图形:

   

   

$ rosrun visualization_marker_tutorials points_and_lines

   


----

2 交互式标记

这部分都分为C++和Python两种语言介绍。

   

这里需要注意,Fixed Frame为base_link等。

这里以simple_marker为例:

python:


  
  1. import rospy
  2. from interactive_markers.interactive_marker_server import *
  3. from visualization_msgs.msg import *
  4. def processFeedback(feedback):
  5. p = feedback.pose.position
  6. print feedback.marker_name + " is now at " + str(p.x) + ", " + str(p.y) + ", " + str(p.z)
  7. if __name__=="__main__":
  8. rospy.init_node("simple_marker")
  9. # create an interactive marker server on the topic namespace simple_marker
  10. server = InteractiveMarkerServer("simple_marker")
  11. # create an interactive marker for our server
  12. int_marker = InteractiveMarker()
  13. int_marker.header.frame_id = "base_link"
  14. int_marker.name = "my_marker"
  15. int_marker.description = "Simple 1-DOF Control"
  16. # create a grey box marker
  17. box_marker = Marker()
  18. box_marker.type = Marker.CUBE
  19. box_marker.scale.x = 0.45
  20. box_marker.scale.y = 0.45
  21. box_marker.scale.z = 0.45
  22. box_marker.color.r = 0.0
  23. box_marker.color.g = 0.5
  24. box_marker.color.b = 0.5
  25. box_marker.color.a = 1.0
  26. # create a non-interactive control which contains the box
  27. box_control = InteractiveMarkerControl()
  28. box_control.always_visible = True
  29. box_control.markers.append( box_marker )
  30. # add the control to the interactive marker
  31. int_marker.controls.append( box_control )
  32. # create a control which will move the box
  33. # this control does not contain any markers,
  34. # which will cause RViz to insert two arrows
  35. rotate_control = InteractiveMarkerControl()
  36. rotate_control.name = "move_x"
  37. rotate_control.interaction_mode = InteractiveMarkerControl.MOVE_AXIS
  38. # add the control to the interactive marker
  39. int_marker.controls.append(rotate_control);
  40. # add the interactive marker to our collection &
  41. # tell the server to call processFeedback() when feedback arrives for it
  42. server.insert(int_marker, processFeedback)
  43. # 'commit' changes and send to all clients
  44. server.applyChanges()
  45. rospy.spin()

C++:


  
  1. #include <ros/ros.h>
  2. #include <interactive_markers/interactive_marker_server.h>
  3. void processFeedback(
  4. const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
  5. {
  6. ROS_INFO_STREAM( feedback->marker_name << " is now at "
  7. << feedback->pose.position.x << ", " << feedback->pose.position.y
  8. << ", " << feedback->pose.position.z );
  9. }
  10. int main(int argc, char** argv)
  11. {
  12. ros::init(argc, argv, "simple_marker");
  13. // create an interactive marker server on the topic namespace simple_marker
  14. interactive_markers::InteractiveMarkerServer server("simple_marker");
  15. // create an interactive marker for our server
  16. visualization_msgs::InteractiveMarker int_marker;
  17. int_marker.header.frame_id = "base_link";
  18. int_marker.header.stamp=ros::Time::now();
  19. int_marker.name = "my_marker";
  20. int_marker.description = "Simple 1-DOF Control";
  21. // create a grey box marker
  22. visualization_msgs::Marker box_marker;
  23. box_marker.type = visualization_msgs::Marker::CUBE;
  24. box_marker.scale.x = 0.45;
  25. box_marker.scale.y = 0.45;
  26. box_marker.scale.z = 0.45;
  27. box_marker.color.r = 0.5;
  28. box_marker.color.g = 0.5;
  29. box_marker.color.b = 0.5;
  30. box_marker.color.a = 1.0;
  31. // create a non-interactive control which contains the box
  32. visualization_msgs::InteractiveMarkerControl box_control;
  33. box_control.always_visible = true;
  34. box_control.markers.push_back( box_marker );
  35. // add the control to the interactive marker
  36. int_marker.controls.push_back( box_control );
  37. // create a control which will move the box
  38. // this control does not contain any markers,
  39. // which will cause RViz to insert two arrows
  40. visualization_msgs::InteractiveMarkerControl rotate_control;
  41. rotate_control.name = "move_x";
  42. rotate_control.interaction_mode =
  43. visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;
  44. // add the control to the interactive marker
  45. int_marker.controls.push_back(rotate_control);
  46. // add the interactive marker to our collection &
  47. // tell the server to call processFeedback() when feedback arrives for it
  48. server.insert(int_marker, &processFeedback);
  49. // 'commit' changes and send to all clients
  50. server.applyChanges();
  51. // start the ROS main loop
  52. ros::spin();
  53. }

--

可以比较一下,然后输入下面命令:

$ rosrun interactive_marker_tutorials simple_marker

   

  • 定义一个函数processFeedback,通过打印出位置来处理来自RViz的反馈消息。

  • 初始化roscpp。
  • 创建交互式标记服务器对象。
  • 设置交互式标记并将其添加到服务器的集合。
  • 输入ROS消息循环。

注意,当调用insert时,服务器对象将在内部只将新标记推入等待列表。一旦你调用applyChanges,它将它包含在它的公开可见的交互式标记集,并发送到所有连接的客户端。


$ rosrun interactive_marker_tutorials basic_controls


$ rosrun interactive_marker_tutorials menu


点击box会出现目录选项。

$ rosrun interactive_marker_tutorials pong


$ rosrun interactive_marker_tutorials cube


$ rosrun interactive_marker_tutorials selection


$ rosrun interactive_marker_tutorials point_cloud


欲了解具体实现,请参考源码~

----

3 插件

$ rosrun rviz_plugin_tutorials send_test_msgs.py

   

----

4 librviz

$ rosrun librviz_tutorial myviz


 

----

补充:

1 http://wiki.ros.org/rviz/Tutorials

----

数学补充:

欧拉角到四元数


给定一个欧拉旋转(X, Y, Z)(即分别绕x轴、y轴和z轴旋转X、Y、Z度),则对应的四元数为:


x = sin(Y/2)sin(Z/2)cos(X/2)+cos(Y/2)cos(Z/2)sin(X/2)

y = sin(Y/2)cos(Z/2)cos(X/2)+cos(Y/2)sin(Z/2)sin(X/2)

z = cos(Y/2)sin(Z/2)cos(X/2)-sin(Y/2)cos(Z/2)sin(X/2)

w = cos(Y/2)cos(Z/2)cos(X/2)-sin(Y/2)sin(Z/2)sin(X/2)

q = ((x, y, z), w)


它的证明过程可以依靠轴角到四元数的公式进行推导。

结合程序说明:

        locations['Goal'] = Pose(Point(1.4, 0.2, 0.000), Quaternion(0.000, 0.000, 0.7, 0.7))

        locations['Home'] = Pose(Point(0.0, 0.0, 0.000), Quaternion(0.000, 0.000, 0.0, 1.0))


如果Home为起点,那么Goal为Home前1.4m 左0.2米 并左转90度


----



文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/60966576

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。