当前位置:   article > 正文

ROS入门教程(五)—— RViz仿真

rviz

上篇文章我们介绍了URDF文件的导出,本文将继上文介绍安装完导出URDF文件后,如何在机器人操作系统(ROS)中显示,并且让它动起来。


目录

前言

RViz机器人模型可视化

launch启动RViz配置文件

Arbotix控制机器人模型运动


前言

ROS中提供了Gazebo与RViz两种仿真软件,本文将机器人模型在RViz仿真环境中可视化,同时利用Arbotix功能包使机器人完成圆周运动。


RViz机器人模型可视化

step1.创建工作空间

Ctrl+Alt+T打开终端分别输入:

  1. mkdir -p helloworld/src
  2. cd helloworld
  3. catkin_make

其中robot_ws为我们命名的工作空间名称,catkin_make是一个编译命令,该编译命令会帮我们创建好我们所需的文件并输出若干日志,成功结果如下:

step2.创建功能包

继续在该终端输入:【启动VS Code】

code .

右键一级src目录选择Create Catkin Package【创建功能包】

输入功能包名称【robot】再输入依赖【urdf xacro】创建结果如下

step1~2若出现问题请学习参考ROS入门教程(三)—— 用C++实现Hello world

step3.覆盖原功能包

将刚新建的robot功能包删除,替换为我们利用sw2urdf插件导出的robot功能包,如下所示:

成功结果如下,功能包中包含display.launch文件与robot.urdf文件:

为了美观可以将base_link ,left_wheel_link 与right_wheel_link的color标签进行修改,即将34行改为"1 1 1 1",将74行与132行改为"0.412 0.412 0.412 1",结果如下所示:【Ctrl+S保存】

step4.运行launch文件

Ctrl+Shift+B执行编译命令,结果如下:

Ctrl+Shift+~启动命令行分别输入:

  1. source ./devel/setup.bash
  2. roslaunch robot display.launch

结果如下所示:

step5.在RViz中添加机器人模型

step6.修改大地坐标

这样我们就成功的在RViz中显示了我们的机器人模型,实现了机器人模型的可视化。


launch启动RViz配置文件

读者可以发现,每次打开RViz都需要添加机器人模型,重新设置大地坐标系这实在是过于复杂,RViz提供了配置文件以适用于不必每次打开都要重新配置RVi:

step1.保存配置文件

按Ctrl+Shift+S保存文件至robot功能包中的config文件夹中,命名为robot.rviz,如下所示:

step2.修改launch文件

将display.launch修改为以下:

  1. <launch>
  2. <arg
  3. name="model" />
  4. <param
  5. name="robot_description"
  6. textfile="$(find robot)/urdf/robot.urdf" />
  7. <node
  8. name="joint_state_publisher_gui"
  9. pkg="joint_state_publisher_gui"
  10. type="joint_state_publisher_gui" />
  11. <node
  12. name="robot_state_publisher"
  13. pkg="robot_state_publisher"
  14. type="robot_state_publisher" />
  15. <node
  16. name="rviz"
  17. pkg="rviz"
  18. type="rviz"
  19. args="-d $(find robot)/config/robot.rviz" />
  20. </launch>

这样每次运行该launch文件去启动RViz时就无需添加机器人模型与修改大地坐标了。


Arbotix控制机器人模型运动

step1.安装Arbotix功能包

Ctrl+Alt+T打开终端输入:

sudo apt install ros-melodic-arbotix

step2.配置yaml文件

在robot功能包下config文件夹中新建文件robot.yaml输入以下:

  1. # 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
  2. # 因此,根 name 是 controller
  3. controllers: {
  4. # 单控制器设置
  5. base_controller: {
  6. #类型: 差速控制器
  7. type: diff_controller,
  8. #参考坐标
  9. base_frame_id: base_footprint,
  10. #两个轮子之间的间距
  11. base_width: 0.2,
  12. #控制频率
  13. ticks_meter: 2000,
  14. #PID控制参数,使机器人车轮快速达到预期速度
  15. Kp: 12,
  16. Kd: 12,
  17. Ki: 0,
  18. Ko: 50,
  19. #加速限制
  20. accel_limit: 1.0
  21. }
  22. }

 结果如下所示:

step3.修改URDF与launch文件

将robot功能包下urdf文件夹中的robot.urdf修改为以下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com)
  3. Commit Version: 1.6.0-4-g7f85cfe Build Version: 1.6.7995.38578
  4. For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
  5. <robot
  6. name="robot">
  7. <link
  8. name="base_footprint">
  9. <visual>
  10. <geometry>
  11. <sphere
  12. radius="0.001" />
  13. </geometry>
  14. <material
  15. name="">
  16. <color
  17. rgba="0 0 0 0" />
  18. </material>
  19. </visual>
  20. </link>
  21. <link
  22. name="base_link">
  23. <inertial>
  24. <origin
  25. xyz="0.00274864430655652 -2.24752503383601E-12 -0.000346282886867658"
  26. rpy="0 0 0" />
  27. <mass
  28. value="0.778495474667087" />
  29. <inertia
  30. ixx="0.00463138328383945"
  31. ixy="1.02152303406231E-11"
  32. ixz="1.71833341358258E-06"
  33. iyy="0.00512425828608217"
  34. iyz="4.71562842897777E-15"
  35. izz="0.00973908576728839" />
  36. </inertial>
  37. <visual>
  38. <origin
  39. xyz="0 0 0"
  40. rpy="0 0 0" />
  41. <geometry>
  42. <mesh
  43. filename="package://robot/meshes/base_link.STL" />
  44. </geometry>
  45. <material
  46. name="">
  47. <color
  48. rgba="1 1 1 1" />
  49. </material>
  50. </visual>
  51. <collision>
  52. <origin
  53. xyz="0 0 0"
  54. rpy="0 0 0" />
  55. <geometry>
  56. <mesh
  57. filename="package://robot/meshes/base_link.STL" />
  58. </geometry>
  59. </collision>
  60. </link>
  61. <joint
  62. name="base_link2base_footprint"
  63. type="fixed">
  64. <parent
  65. link="base_footprint" />
  66. <child
  67. link="base_link" />
  68. <origin
  69. xyz="0 0 0.035" />
  70. </joint>
  71. <link
  72. name="right_wheel_link">
  73. <inertial>
  74. <origin
  75. xyz="-4.81191200834309E-07 0.000476524651415774 1.07685290749495E-07"
  76. rpy="0 0 0" />
  77. <mass
  78. value="0.0474080147774195" />
  79. <inertia
  80. ixx="1.81764508915246E-05"
  81. ixy="1.12230898220564E-10"
  82. ixz="9.35470362535892E-11"
  83. iyy="3.36082622230467E-05"
  84. iyz="-1.04867422246077E-10"
  85. izz="1.81763222441443E-05" />
  86. </inertial>
  87. <visual>
  88. <origin
  89. xyz="0 0 0"
  90. rpy="0 0 0" />
  91. <geometry>
  92. <mesh
  93. filename="package://robot/meshes/right_wheel_link.STL" />
  94. </geometry>
  95. <material
  96. name="">
  97. <color
  98. rgba="0.412 0.412 0.412 1" />
  99. </material>
  100. </visual>
  101. <collision>
  102. <origin
  103. xyz="0 0 0"
  104. rpy="0 0 0" />
  105. <geometry>
  106. <mesh
  107. filename="package://robot/meshes/right_wheel_link.STL" />
  108. </geometry>
  109. </collision>
  110. </link>
  111. <joint
  112. name="right_wheel_joint"
  113. type="continuous">
  114. <origin
  115. xyz="0 0.09545 0"
  116. rpy="0 0 0" />
  117. <parent
  118. link="base_link" />
  119. <child
  120. link="right_wheel_link" />
  121. <axis
  122. xyz="0 1 0" />
  123. <limit
  124. lower="-3.14"
  125. upper="3.14"
  126. effort="0"
  127. velocity="0" />
  128. </joint>
  129. <link
  130. name="left_wheel_link">
  131. <inertial>
  132. <origin
  133. xyz="4.90089018379602E-07 -0.000476524651415788 5.43493115676996E-08"
  134. rpy="0 0 0" />
  135. <mass
  136. value="0.0474080147774195" />
  137. <inertia
  138. ixx="1.81764289862563E-05"
  139. ixy="1.23038640102816E-10"
  140. ixz="-1.05305567709027E-10"
  141. iyy="3.36082622230468E-05"
  142. iyz="9.19480494971147E-11"
  143. izz="1.81763441494127E-05" />
  144. </inertial>
  145. <visual>
  146. <origin
  147. xyz="0 0 0"
  148. rpy="0 0 0" />
  149. <geometry>
  150. <mesh
  151. filename="package://robot/meshes/left_wheel_link.STL" />
  152. </geometry>
  153. <material
  154. name="">
  155. <color
  156. rgba="0.412 0.412 0.412 1" />
  157. </material>
  158. </visual>
  159. <collision>
  160. <origin
  161. xyz="0 0 0"
  162. rpy="0 0 0" />
  163. <geometry>
  164. <mesh
  165. filename="package://robot/meshes/left_wheel_link.STL" />
  166. </geometry>
  167. </collision>
  168. </link>
  169. <joint
  170. name="left_wheel_joint"
  171. type="continuous">
  172. <origin
  173. xyz="0 -0.09545 0"
  174. rpy="0 0 0" />
  175. <parent
  176. link="base_link" />
  177. <child
  178. link="left_wheel_link" />
  179. <axis
  180. xyz="0 1 0" />
  181. <limit
  182. lower="-3.14"
  183. upper="3.14"
  184. effort="0"
  185. velocity="0" />
  186. </joint>
  187. </robot>

其中与之前的URDF文件相比,增加了部件base_footprint,将其与base_link连接,读者可以发现,增加base_footprint后机器人正好基于地面了,相比与之前更加的合理,同时也为后续的里程计提供了便利,对比结果如下:

在此建议读者以后每次建立URDF文件都添加部件base_footprint。

将robot功能包下launch文件夹中的display.launch修改为以下:

  1. <launch>
  2. <arg
  3. name="model" />
  4. <param
  5. name="robot_description"
  6. textfile="$(find robot)/urdf/robot.urdf" />
  7. <node
  8. name="joint_state_publisher_gui"
  9. pkg="joint_state_publisher_gui"
  10. type="joint_state_publisher_gui" />
  11. <node
  12. name="robot_state_publisher"
  13. pkg="robot_state_publisher"
  14. type="robot_state_publisher" />
  15. <node
  16. name="rviz"
  17. pkg="rviz"
  18. type="rviz"
  19. args="-d $(find robot)/config/robot.rviz" />
  20. <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
  21. <rosparam file="$(find robot)/config/robot.yaml" command="load" />
  22. <param name="sim" value="true" />
  23. </node>
  24. </launch>

step4.在RViz中添加odom里程计

在VS Code集成命令行输入:

  1. source ./devel/setup.bash
  2. roslaunch robot display.launch

 修改大地坐标为odom并添加odom里程计至RViz中:

step6.发布消息

Ctrl+Alt+T打开终端输入:

  1. rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear:
  2. x: 1.0
  3. y: 0.0
  4. z: 0.0
  5. angular:
  6. x: 0.0
  7. y: 0.0
  8. z: 1.0"

该代码段的旨在10HZ 的频率循环发送运动信息至订阅者,成功结果如下:

到这里我们就完成了通过Arbotix功能包实现了机器人模型的运动。


文章预告:ROS入门教程(六)—— Gazebo仿真

资料来源:奥特学院(Autolabor)

商业转载请联系官方授权,非商业转载请注明出处

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/623654
推荐阅读
相关标签
  

闽ICP备14008679号