一.在Gazebo中使用ROS控制器
在本節中,我們將討論如何在Gazebo中讓機器人的每個關節運動。
為了讓關節動起來,我們需要分配一個ROS控制器,尤其是,我們需要為每個關節連上一個與transmission標簽內指定的硬件接口兼容的控制器。
ROS控制器主要由一套反饋機構組成,可以接受某一設定點,並用執行機構的反饋控制輸出。
ROS控制器使用硬件接口與硬件交互,硬件接口的主要功能是充當ROS控制器與真實或仿真硬件之間的中介,根據ROS控制器生成的數據來分配
資源控制它。
在本機器人,我們定義了位置控制器,速度控制器,力控制器等,這些ROS控制器是由名為ros_control的一組軟件包提供的。
為了正確理解如何為機械臂配置ROS控制器,我們需要理解它的概念。我們將進一步討論ros_control軟件包,不同類型的ROS
控制器以及ROS控制器如何與Gazebo仿真交互。
1.認識ros_control軟件包
ros_control軟件包實現了機器人控制器、控制管理器、硬件接口、不同的傳輸接口和控制工具箱。
ros_control軟件包由以下各獨立的軟件包組成:
*control_toolbox : 這個軟件包包含通用模塊(PID 和 Sine),可供所有控制器使用。
*controller_interface : 這個軟件包包含了控制器的接口(interface)基類。
*controller_manager : 這個軟件包提供了加載(load)、卸載(unload)、啟動(start) 和停止(stop)等控制器的基礎架構。
*controller_manager_msgs : 這個軟件包提供了控制管理器的消息和服務定義。
*hardware_interface : 這個軟件包包含了硬件接口的基類。
*transmission_interface : 這個軟件包包含了傳動(transmission)接口的接口類(差速、四桿聯動、關節狀態、位置和速度)。
2.不同類型的ROS控制器和硬件接口
包含標准ROS控制器的ROS軟件包列表:
*joint_position_controller : 這是關節位置控制器的簡單實現。
*joint_state_controller : 這是一個發布關節狀態的控制器。
*joint_effort_controller : 這是關節力(強度)控制器的實現。
以下是ROS中常用的一些硬件接口:
*Joint Command Interface : 將命令發送到硬件。
*Effort Joint Interface : 發送effort命令。
*Velocity Joint Interface : 發送velocity命令。
*Position Joint Interface : 發送position命令。
*Joint State Interface : 從執行器編碼器檢索關節狀態。
3.ROS控制器如何與Gazebo交互
如圖可以看到ROS控制器是如何與Gazebo進行交互的,顯示了ROS控制器,機器人硬件接口、仿真器/真實硬件的連接:

ROS控制器與Gazebo的接口圖
我們可以看到第三方工具navigation和MoveIt軟件包。這些軟件包可以為移動機器人控制器和機械臂控制器提供目標位置(即設定點 )。這些控制器可以將位置、速度或驅動力發送到機器人的硬件接口上。
硬件接口將每個資源分配給控制器,並將值發送給每個資源,機器人控制器與機器人硬件接口之間的通信如圖所示:

ROS控制器和硬件接口的示意圖
硬件接口與實際硬件和仿真分離,來自硬件接口的值可以饋送到Gazebo進行仿真或饋送到實際硬件本身。
硬件接口是機器人及其抽象硬件的軟件表示,硬件接口的資源是執行機構、關節和傳感器。
有些資源是只讀的,比如關節狀態、IMU、力-扭矩傳感器等,有些資源是可讀可寫的,比如位置、速度和關節驅動力。
4.將關節狀態控制器和關節位置控制器連接到手臂
將機器人控制器連接到每個關節是一項簡單的任務,第一項任務就是 為兩個控制器編寫配置文件。
關節狀態控制器將發布手臂的關節狀態,而且關節位置控制器可以接收每個關節的目標位置並可以讓每個關節運動。
我們將在seven_dof_arm_gazebo/config文件夾下找到控制器的配置文件seven_dof_arm_gazebo_control.yaml
以下是配置文件的定義:
1 seven_dof_arm:
2 # Publish all joint states -----------------------------------
3 joint_state_controller:
4 type: joint_state_controller/JointStateController
5 publish_rate: 50
6
7 # Position Controllers ---------------------------------------
8 joint1_position_controller:
9 type: position_controllers/JointPositionController
10 joint: shoulder_pan_joint
11 pid: {p: 100.0, i: 0.01, d: 10.0}
12 joint2_position_controller:
13 type: position_controllers/JointPositionController
14 joint: shoulder_pitch_joint
15 pid: {p: 100.0, i: 0.01, d: 10.0}
16 joint3_position_controller:
17 type: position_controllers/JointPositionController
18 joint: elbow_roll_joint
19 pid: {p: 100.0, i: 0.01, d: 10.0}
20 joint4_position_controller:
21 type: position_controllers/JointPositionController
22 joint: elbow_pitch_joint
23 pid: {p: 100.0, i: 0.01, d: 10.0}
24 joint5_position_controller:
25 type: position_controllers/JointPositionController
26 joint: wrist_roll_joint
27 pid: {p: 100.0, i: 0.01, d: 10.0}
28 joint6_position_controller:
29 type: position_controllers/JointPositionController
30 joint: wrist_pitch_joint
31 pid: {p: 100.0, i: 0.01, d: 10.0}
32 joint7_position_controller:
33 type: position_controllers/JointPositionController
34 joint: gripper_roll_joint
35 pid: {p: 100.0, i: 0.01, d: 10.0}
我們可以看到所有的控制器都位於命名空間seven_dof_arm中,第一 行代表關節狀態控制器,他將以50hz的頻率發布機器人的關節狀態。
其他的控制器是關節位置控制器,它被分配給前七個關節,而且還定義了PID增益。
5.在Gaazebo中啟動ROS控制器
如果控制器配置准備就緒,我們就可以創建一個啟動文件,該文件將啟動所有控制器並進行Gazebo仿真.
進入seven_dof_arm_gazebo/launch文件夾並打開seven_dof_arm_gazebo_control.launch文件:
1 <launch> 2 <!-- Launch Gazebo --> 3 <include file="$(find seven_dof_arm_gazebo)/launch/seven_dof_arm_world.launch" /> 4 5 6 <!-- Load joint controller configurations from YAML file to parameter server --> 7 <rosparam file="$(find seven_dof_arm_gazebo)/config/seven_dof_arm_gazebo_control. yaml" command="load"/> 8 9 10 <!-- load the controllers --> 11 <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn=" false" 12 output="screen" ns="/seven_dof_arm" args="joint_state_controller 13 joint1_position_controller 14 joint2_position_controller 15 joint3_position_controller 16 joint4_position_controller 17 joint5_position_controller 18 joint6_position_controller 19 joint7_position_controller"/> 20 21 22 <!-- convert joint states to TF transforms for rviz, etc --> 23 <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_ publisher" 24 respawn="false" output="screen"> 25 <remap from="/joint_states" to="/seven_dof_arm/joint_states" /> 26 </node> 27 28 </launch>
該啟動文件可以啟動手臂的Gazebo仿真,加載控制器配置信息、關節狀態控制器和關節位置控制器,最后運行機器人狀態發布者(負責發布關節狀態和tf)
檢查運行此啟動文件后生成的控制器話題:
$ roslaunch seven_dof_arm_gazebo seven_dof_arm_gazebo_control.launch
如果命令執行成功,我們可以在終端看到如圖所示的消息:

運行該啟動文件時從控制器中生成的話題如下:

6.控制機器人的關節運動
完成以上步驟后,我們就可以開始對每個關節進行控制了。
要在Gazebo中控制機器人關節運動,我們需要使用std_msgs/Float64類型的消息將所需的關節值發布到關節位置控制器命令話題上。
如下是控制第四個關節運動到1.0度的位置:
$ rostopic pub /seven_dof_arm/joint4_position_controller/command std_msgs/Float64 1.0
還可以用以下命令查看機器人的關節狀態
$rostopic echo /seven_dof_arm/joint_states
