一.在Gazebo中使用ROS控制器node
在本節中,咱們將討論如何在Gazebo中讓機器人的每一個關節運動。架構
爲了讓關節動起來,咱們須要分配一個ROS控制器,尤爲是,咱們須要爲每一個關節連上一個與transmission標籤內指定的硬件接口兼容的控制器。工具
ROS控制器主要由一套反饋機構組成,能夠接受某一設定點,並用執行機構的反饋控制輸出。編碼
ROS控制器使用硬件接口與硬件交互,硬件接口的主要功能是充當ROS控制器與真實或仿真硬件之間的中介,根據ROS控制器生成的數據來分配spa
資源控制它。orm
在本機器人,咱們定義了位置控制器,速度控制器,力控制器等,這些ROS控制器是由名爲ros_control的一組軟件包提供的。server
爲了正確理解如何爲機械臂配置ROS控制器,咱們須要理解它的概念。咱們將進一步討論ros_control軟件包,不一樣類型的ROSblog
控制器以及ROS控制器如何與Gazebo仿真交互。接口
1.認識ros_control軟件包ip
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