ROS學習筆記15 —— moveit與Gazebo聯合仿真過程解析

1.基礎

官方RRBOT案例:傳送門

ros_control和controller:傳送門

moveit配置:傳送門

2.思路梳理

ros與gazebo/真實機器人通信架構

在這裏插入圖片描述

來個簡化版的:
在這裏插入圖片描述
省略了機器人實體部分,其中Driver就負責moveit與真實機器人或者gazebo通信,真實機器人與gazebo仿真的區別就在於:

  • ① gazebo仿真時,這個Driver已經幫我們集成好了,我們只需要寫個controller就可以實現通信!
  • ② 真實機器人中,如果是自己開發的機器人,這個Driver需要我們自己去編寫

同理,其他仿真軟件,由於沒有幫我們集成好這個Driver,所以當我們使用其他仿真軟件與ros聯合使用時,就需要自己完成這個Driver的實現,這個過程和真實機器人中是相同的!

從上圖可以看到,這個Driver負責控制命令的翻譯、下發和機器人狀態的反饋,牢牢記住這個圖!!!

moveit架構

在這裏插入圖片描述

我們可以看到,JointTrajectoryAction部分,是通過Robot Controllers進行翻譯的,而這個整體框架即 ros與gazebo/真實機器人通信架構 的細節部分!

moveit聯合gazebo仿真時需要的控制器

使用MoveIt! Setup Assistant 配置完後,會有兩個控制器文件,在moveit_config包的**/config**下:

  • fake_controllers.yaml:爲了發佈一個虛假的狀態,來騙過moveit,目的是可以單獨的在rviz裏運行moveit
  • ros_controllers.yaml:裏面配置了些與硬件接口和仿真相關的內容

但是這兩個控制器文件不能達到我們聯合仿真的目的!!!

古月君對MoveIt+Gazebo的仿真框架有個很生動的比喻:他把MoveIt下發的FollowJointTrajectory比喻成插頭,把機器人接收軌跡Joint Trajectory Controller和狀態反饋部分Joint State Controller比喻成插座,所以我們需要兩個控制器來實現moveit和gazebo的聯合仿真:

robot_control.yaml

myrobot:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50    
myrobot:
  arm_joint_controller:
    type: "position_controllers/JointTrajectoryController"
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6
    gains:
      joint_1:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_2:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_3:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_4:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_5:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint_6:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}

啓動控制器:

<launch>
    <!-- 運行robot_state_publisher節點,發佈tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
        respawn="false" output="screen">
		<param name="publish_frequency" type="double" value="50.0" />
		<param name="tf_prefix" type="string" value="" />
    </node>
    
	<!-- Robot state publisher -->
    <rosparam file="$(find robot_gazebo)/config/robot_control.yaml" command="load"/>
    <node name="arm_controller_spawner" 
    	  pkg="controller_manager" 
    	  type="spawner" 
    	  respawn="false"
          output="screen" 
          ns="/myrobot" 
          args="arm_joint_controller"/>
          
	<!-- joint_state_controller -->
    <rosparam file="$(find robot_gazebo)/config/robot_gazebo_joint_states.yaml" command="load"/>
    <node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
          output="screen" ns="/myrobot" args="joint_state_controller" />

</launch>
controllers.yaml
controller_manager_ns: controller_manager
controller_list:
  - name: myrobot/arm_joint_controller
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    default: true
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6

啓動控制器:
moveit_controller_manager.launch.xml

<launch>
	<!-- gazebo Controller -->
	<rosparam file="$(find robot_moveit_config)/config/controllers_gazebo.yaml"/>
	
    <arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager"/>
    <param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>
</launch>

注意:這些控制器文件中關節的名稱和描述文件中必須統一!!!

3. 具體實現

描述文件

需要保證描述文件中已經添加gazebo_ros_control插件

<gazebo>
  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
  </plugin>
</gazebo>

已經添加transmission,尤其注意硬件接口的配置


參考文獻:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章