当前位置:   article > 正文

ROS2与gazebo联合仿真自定义机械臂(ros2_control)_ros2中gazebo仿真机械臂

ros2中gazebo仿真机械臂

1. 准备实际的三维模型文件(stl二进制格式的)

2. 编写机械臂的urdf文件,也可以改装为xacro文件\

  1. <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="r6bot">
  2. <xacro:property name="ModelPathHead"
  3. value="file://"到机械臂三维模型的绝对路径" />
  4. <xacro:property name="pi" value="3.1415926" />
  5. <link name="base_link">
  6. <visual>
  7. <geometry>
  8. <mesh filename="${ModelPathHead}link_0.stl" />
  9. </geometry>
  10. <origin xyz="0 0 0" rpy="0 0 0" />
  11. <material name="Red">
  12. <color rgba="1 0 0 1" />
  13. </material>
  14. </visual>
  15. <collision>
  16. <origin xyz="0 0 0" rpy="0 0 0" />
  17. <geometry>
  18. <mesh filename="${ModelPathHead}link_0.stl" />
  19. </geometry>
  20. </collision>
  21. <inertial>
  22. <mass value="1" />
  23. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
  24. </inertial>
  25. </link>
  26. <link name="link_1">
  27. <visual>
  28. <geometry>
  29. <mesh filename="${ModelPathHead}link_1.stl" />
  30. </geometry>
  31. <origin rpy="0 0 0" xyz="0 0 0" />
  32. <material name="Red">
  33. <color rgba="1 0 0 1" />
  34. </material>
  35. </visual>
  36. <collision>
  37. <origin xyz="0 0 0" rpy="0 0 0" />
  38. <geometry>
  39. <mesh filename="${ModelPathHead}link_1.stl" />
  40. </geometry>
  41. </collision>
  42. <inertial>
  43. <mass value="1" />
  44. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
  45. </inertial>
  46. </link>
  47. <link name="link_2">
  48. <visual>
  49. <geometry>
  50. <mesh filename="${ModelPathHead}link_2.stl" />
  51. </geometry>
  52. <origin xyz="0 0 0" rpy="0 0 0" />
  53. <material name="red">
  54. <color rgba="1 0 0 1" />
  55. </material>
  56. </visual>
  57. <collision>
  58. <origin xyx="0 0 0" rpy="0 0 0" />
  59. <geometry>
  60. <mesh filename="${ModelPathHead}link_2.stl" />
  61. </geometry>
  62. </collision>
  63. <inertial>
  64. <mass value="1" />
  65. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
  66. </inertial>
  67. </link>
  68. <link name="link_3">
  69. <visual>
  70. <geometry>
  71. <mesh filename="${ModelPathHead}link_3.stl" />
  72. </geometry>
  73. <origin xyz="0 0 0" rpy="0 0 0" />
  74. <material name="Red">
  75. <color rgba="1 0 0 1" />
  76. </material>
  77. </visual>
  78. <collision>
  79. <origin xyx="0 0 0" rpy="0 0 0" />
  80. <geometry>
  81. <mesh filename="${ModelPathHead}link_3.stl" />
  82. </geometry>
  83. </collision>
  84. <inertial>
  85. <mass value="1" />
  86. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
  87. </inertial>
  88. </link>
  89. <link name="link_4">
  90. <visual>
  91. <geometry>
  92. <mesh filename="${ModelPathHead}link_4.stl" />
  93. </geometry>
  94. <origin xyz="0 0 0" rpy="0 0 0" />
  95. <material name="Red">
  96. <color rgba="1 0 0 1" />
  97. </material>
  98. </visual>
  99. <collision>
  100. <origin xyx="0 0 0" rpy="0 0 0" />
  101. <geometry>
  102. <mesh filename="${ModelPathHead}link_4.stl" />
  103. </geometry>
  104. </collision>
  105. <inertial>
  106. <mass value="1" />
  107. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
  108. </inertial>
  109. </link>
  110. <link name="link_5">
  111. <visual>
  112. <geometry>
  113. <mesh filename="${ModelPathHead}link_5.stl" />
  114. </geometry>
  115. <origin xyz="0 0 0" rpy="0 0 0" />
  116. <material name="Red">
  117. <color rgba="1 0 0 1" />
  118. </material>
  119. </visual>
  120. <collision>
  121. <origin xyx="0 0 0" rpy="0 0 0" />
  122. <geometry>
  123. <mesh filename="${ModelPathHead}link_5.stl" />
  124. </geometry>
  125. </collision>
  126. <inertial>
  127. <mass value="1" />
  128. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
  129. </inertial>
  130. </link>
  131. <link name="link_6">
  132. <visual>
  133. <geometry>
  134. <mesh filename="${ModelPathHead}link_6.stl" />
  135. </geometry>
  136. <origin xyz="0 0 0" rpy="0 0 0" />
  137. <material name="Red">
  138. <color rgba="1 0 0 1" />
  139. </material>
  140. </visual>
  141. <collision>
  142. <origin xyx="0 0 0" rpy="0 0 0" />
  143. <geometry>
  144. <mesh filename="${ModelPathHead}link_6.stl" />
  145. </geometry>
  146. </collision>
  147. <inertial>
  148. <mass value="1" />
  149. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0" />
  150. </inertial>
  151. </link>
  152. <!-- <link name="world"/> -->
  153. <joint name="base_joint" type="fixed">
  154. <parent link="world" />
  155. <child link="base_link" />
  156. <origin xyz="0 0 0" rpy="0 0 0" />
  157. <axis xyz="0 0 1" />
  158. </joint>
  159. <!-- joints - main serial chain -->
  160. <joint name="Joint_1" type="revolute">
  161. <parent link="base_link" />
  162. <child link="link_1" />
  163. <origin xyz="0 0 0.061584" rpy="0 0 0" />
  164. <axis xyz="0 0 1" />
  165. <limit effort="1000.0" lower="${-pi}" upper="${pi}" velocity="2.5" />
  166. </joint>
  167. <joint name="Joint_2" type="revolute">
  168. <parent link="link_1" />
  169. <child link="link_2" />
  170. <origin xyz="-0.101717 0 0.182284" rpy="${-pi/2} -${pi/3} ${pi/2}" />
  171. <axis xyz="0 0 1" />
  172. <limit effort="1000.0" lower="${-pi}" upper="${pi}" velocity="2.5" />
  173. </joint>
  174. <joint name="Joint_3" type="revolute">
  175. <parent link="link_2" />
  176. <child link="link_3" />
  177. <origin xyz="0.685682 0 0.041861" rpy="0 ${pi} ${pi+pi/2}" />
  178. <axis xyz="0 0 1" />
  179. <limit effort="1000.0" lower="${-pi}" upper="${pi}" velocity="2.5" />
  180. </joint>
  181. <joint name="Joint_4" type="revolute">
  182. <parent link="link_3" />
  183. <child link="link_4" />
  184. <origin xyz="0.518777 0 0.067458" rpy="0 ${pi} ${pi+pi/6}" />
  185. <axis xyz="0 0 1" />
  186. <limit effort="1000.0" lower="${-pi}" upper="${pi}" velocity="2.5" />
  187. </joint>
  188. <joint name="Joint_5" type="revolute">
  189. <parent link="link_4" />
  190. <child link="link_5" />
  191. <origin xyz="0.112654 0 0.110903" rpy="${pi/2} ${pi} ${pi/2}" />
  192. <axis xyz="0 0 1" />
  193. <limit effort="1000.0" lower="${-pi}" upper="${pi}" velocity="2.5" />
  194. </joint>
  195. <joint name="Joint_6" type="revolute">
  196. <parent link="link_5" />
  197. <child link="link_6" />
  198. <origin xyz="-0.085976 0 0.133436" rpy="0 ${-pi/2} 0" />
  199. <axis xyz="0 0 1" />
  200. <limit effort="1000.0" lower="${-pi}" upper="${pi}" velocity="2.5" />
  201. </joint>
  202. <gazebo reference="base_link">
  203. <material>Gazebo/Purple</material>
  204. <self_collide>false</self_collide>
  205. <gravity>false</gravity>
  206. </gazebo>
  207. <gazebo reference="link_1">
  208. <material>Gazebo/Purple</material>
  209. <self_collide>false</self_collide>
  210. <gravity>false</gravity>
  211. </gazebo>
  212. <gazebo reference="link_2">
  213. <material>Gazebo/Purple</material>
  214. <self_collide>false</self_collide>
  215. <gravity>false</gravity>
  216. </gazebo>
  217. <gazebo reference="link_3">
  218. <material>Gazebo/Purple</material>
  219. <self_collide>false</self_collide>
  220. <gravity>false</gravity>
  221. </gazebo>
  222. <gazebo reference="link_4">
  223. <material>Gazebo/Purple</material>
  224. <self_collide>false</self_collide>
  225. <gravity>false</gravity>
  226. </gazebo>
  227. <gazebo reference="link_5">
  228. <material>Gazebo/Purple</material>
  229. <self_collide>false</self_collide>
  230. <gravity>false</gravity>
  231. </gazebo>
  232. <gazebo reference="link_6">
  233. <material>Gazebo/Purple</material>
  234. <self_collide>false</self_collide>
  235. <gravity>false</gravity>
  236. </gazebo>
  237. </robot>
  1. <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="Staubli">
  2. <xacro:property name="UrdfPathHead" value="urdf文件路径" />
  3. <!-- <xacro:include filename="${UrdfPathHead}robot.urdf.xacro" /> -->
  4. <link name="world" />
  5. <xacro:include filename="${UrdfPathHead}r6bot.urdf.xacro" />
  6. <xacro:include filename="${UrdfPathHead}robot_ros_control.urdf.xacro" />
  7. </robot>

3.编写控制文件(xacro)

  1. <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="Staubli" >
  2. <ros2_control name="GazeboSystem" type="system">
  3. <hardware>
  4. <plugin>gazebo_ros2_control/GazeboSystem</plugin>
  5. </hardware>
  6. <joint name="Joint_1">
  7. <command_interface name="position" />
  8. <state_interface name="position"/>
  9. <state_interface name="velocity"/>
  10. </joint>
  11. <joint name="Joint_2">
  12. <command_interface name="position" />
  13. <state_interface name="position"/>
  14. <state_interface name="velocity"/>
  15. </joint>
  16. <joint name="Joint_3">
  17. <command_interface name="position" />
  18. <state_interface name="position"/>
  19. <state_interface name="velocity"/>
  20. </joint>
  21. <joint name="Joint_4">
  22. <command_interface name="position" />
  23. <state_interface name="position"/>
  24. <state_interface name="velocity"/>
  25. </joint>
  26. <joint name="Joint_5">
  27. <command_interface name="position" />
  28. <state_interface name="position"/>
  29. <state_interface name="velocity"/>
  30. </joint>
  31. <joint name="Joint_6">
  32. <command_interface name="position" />
  33. <state_interface name="position"/>
  34. <state_interface name="velocity"/>
  35. </joint>
  36. </ros2_control>
  37. <gazebo>
  38. <plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">
  39. <!-- 这个是编写的控制器文件的路径 -->
  40. <parameters>$(find gazebo_robot)/config/gazebo_robot_control.yaml</parameters>
  41. </plugin>
  42. </gazebo>
  43. </robot>

4. 定义控制器

  1. controller_manager:
  2. ros__parameters:
  3. update_rate: 100
  4. sue_sim_time: true
  5. arm_controller:
  6. type: position_controllers/JointGroupPositionController // ros2_control 里面定义的控制器
  7. joint_state_broadcaster:
  8. type: joint_state_broadcaster/JointStateBroadcaster //固定的
  9. arm_controller:
  10. ros__parameters:
  11. joints:
  12. - Joint_1 // 注意和机械臂的urdf中定义的关节角保持一致
  13. - Joint_2
  14. - Joint_3
  15. - Joint_4
  16. - Joint_5
  17. - Joint_6
  18. command_interface:
  19. - position
  20. state_interface:
  21. - position
  22. - velocity

5.编写launch文件

  1. import os
  2. from launch import LaunchDescription
  3. from launch.actions import DeclareLaunchArgument, ExecuteProcess,RegisterEventHandler
  4. from launch_ros.substitutions import FindPackageShare
  5. from launch_ros.actions import Node
  6. from launch.substitutions import Command
  7. from launch.event_handlers import OnProcessExit
  8. import launch.actions
  9. import xacro
  10. def generate_launch_description():
  11. robot_name_in_model ="r6bot"
  12. package_name='gazebo_robot'
  13. urdf_name = "r6bot_main.urdf.xacro"
  14. ld = LaunchDescription()
  15. #找到自己的ros包
  16. pkg_share = FindPackageShare(package='gazebo_robot').find('gazebo_robot')
  17. urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}')
  18. start_gazebo_cmd = ExecuteProcess(
  19. cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so'],
  20. output='screen')
  21. doc = xacro.parse(open(urdf_model_path))
  22. xacro.process_doc(doc)
  23. params = {'robot_description': doc.toxml()}
  24. node_robot_state_publisher = Node(
  25. package='robot_state_publisher',
  26. executable='robot_state_publisher',
  27. output='screen',
  28. parameters=[params]
  29. )
  30. # Launch the robot
  31. spawn_entity_cmd = Node(
  32. package='gazebo_ros',
  33. executable='spawn_entity.py',
  34. arguments=['-topic', 'robot_description','-entity', 'robot_gazebo'], output='screen')
  35. #将自己定义的环境模型,写成类似与gazebo自带的模型文件形式,注意有几个文件定义。
  36. #自己如何撰写gazebo模型,可以参考网上的教程 最后需要export路径,这里用python实现
  37. model_path = 自定义的模型文件的路径"
  38. if "GAZEBO_MODEL_PATH" in os.environ:
  39. os.environ["GAZEBO_MODEL_PATH"] += ":" + model_path
  40. else:
  41. os.environ["GAZEBO_MODEL_PATH"] = model_path
  42. EnvModel = Node(
  43. package='gazebo_ros',
  44. executable='spawn_entity.py',
  45. #'.sdf文件路径'是自定义模型中有个sdf文件的,直接传入这个文件的路径。
  46. arguments=['-entity', 'demo', '-file', '.sdf文件路径'], output='screen')
  47. joint_broad_spawner = Node(
  48. package="controller_manager",
  49. executable="spawner",
  50. arguments=["joint_state_broadcaster"]
  51. )
  52. arm_broad_spawner=Node(
  53. package="controller_manager",
  54. executable="spawner",
  55. arguments=["arm_controller"]
  56. )
  57. ld.add_action(start_gazebo_cmd)
  58. ld.add_action(node_robot_state_publisher)
  59. ld.add_action(spawn_entity_cmd)
  60. ld.add_action(EnvModel)
  61. ld.add_action(joint_broad_spawner)
  62. ld.add_action(arm_broad_spawner)
  63. return ld

后续把这部分实际代码分享到git中。路径:Ros2_Control: Ros2与gazebo联合仿真

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

闽ICP备14008679号