gazebo官網例程
首先官網下載程式碼https://github.com/ros-simulation/gazebo_ros_demos
1 建立編譯工作空間
cd ~/catkin_ws/src/
git clone https://github.com/ros-simulation/gazebo_ros_demos.git
cd ..
catkin_make
2 在Rviz執行
cd ~/catkin_ws/src/gazebo_ros_demos/rrbot_description
roslaunch rrbot_description rrbot_rviz.launch
3 在gazebo執行
cd ~/catkin_ws/src/gazebo_ros_demos/rrbot_gazebo
roslaunch rrbot_gazebo rrbot_world.launch
4 客製化URDF檔案
繼續使用gazebo中RRBot的URDF,並在其基礎上做客製化修改。
4.1 Add transmission elements to a URDF
為了在機器人RRBot中使用ros_control, 我們需要在URDF中增加一些相應的elements(如 element), 這種element被用來連線機器人的actuators和 joints, 詳細定義請看 spec 。
對於gazebo_ros_control外掛來說,transmission中重要的資訊tag如下:
<joint name=""> - name必須於URDF中其它地方的joint對應
<type > - transmission型別,目前僅僅實現了"transmission_interface/SimpleTransmission",當然你可以自己根據需求新增
<hardwareInterface> - 放置在<actuator> 和<joint> tags之內,用來告知gazebo_ros_control外掛哪些硬體介面要載入進來(position, velocity or effort interfaces),目前僅effort介面被實現, 根據需要可自行新增其它介面
其它剩下的names and elements目前被忽略處理。
4.2 Add the gazebo_ros_control plugin
除了transmission tags, Gazebo外掛也需要新增到URDF檔案,該外掛作用是解析transmission tags,載入hardware interfaces和controller manager。 預設的情況下外掛gazebo_ros_control很簡單,然而基於其外掛架構特定,使用者可以隨便擴充套件定製自己需要的硬體介面。下面預設的外掛XML定義應該加入到你的URDF檔案,
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/rrbot</robotNamespace>
</plugin>
</gazebo>
gazebo_ros_control tag有下面幾個可選屬性:
<robotNamespace>: 外掛例項的ROS名稱空間, 在URDF/SDF檔案預設是機器人名字
<controlPeriod>: controller更新週期update (in seconds), 預設是Gazebo的period
<robotParam>: 引數伺服器robot_description (URDF)的位置,預設是'/robot_description'
<robotSimType>: robot sim interface外掛名字 (詳細見下面), 預設是 'DefaultRobotHWSim'
預設的gazebo_ros_control的行為:
在預設情況下,沒有 tag, gazebo_ros_control會嘗試獲取它需要的所有介面以實現與基於ros_control的controller通訊。
在預設情況下,它的行為提供如下ros_control介面:
hardware_interface::JointStateInterface
hardware_interface::EffortJointInterface
hardware_interface::VelocityJointInterface - not fully implemented
高階gazebo_ros_control的行為(定製gazebo_ros_control外掛):
gazebo_ros_control外掛也提供了基於pluginlib的介面,這樣方便客製化Gazebo和ros_control之間的硬體介面,以模擬更加複雜的機構(如非線性彈簧,連線等等)。
客製化的新外掛必須繼承gazebo_ros_control::RobotHWSim, 它是模擬的hardware_interface::RobotHW。 RobotHWSim提供的API可以實現對Gazebo模擬器中joint的讀和寫。
RobotHWSim的擴充套件類在URDF model中指定,當機器人model被載入時候也被一起載入。 如下面的XML將載入預設外掛 (行為同沒有使用 tag情況):
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/MYROBOT</robotNamespace>
<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
</plugin>
</gazebo>
4.3 RRBot例子
我們新增 塊為每個joint。注意:必須包含在和 tags之間。 開啟你的rrbot.xacro檔案,在檔案底部你可以看到:
<transmission name="tran1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="joint1">
<hardwareInterface>EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor1">
<hardwareInterface>EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="tran2">
<type>transmission_interface/SimpleTransmission</type>
<joint name="joint2">
<hardwareInterface>EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor2">
<hardwareInterface>EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
此外,在檔案rrbot.gazebo你會看到外掛gazebo_ros_control, 該外掛會讀取 tags中內容:
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/rrbot</robotNamespace>
</plugin>
</gazebo>
4.4 ros_control package
程式碼解釋:
1)在launch資料夾建立rrbot_control/launch/rrbot_control.launch
檔案,並使用下面內容:
<launch>
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find rrbot_control)/config/rrbot_control.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/rrbot" args="joint_state_controller
joint1_position_controller
joint2_position_controller"/>
<!-- convert joint states to TF transforms for rviz, etc -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/rrbot/joint_states" />
</node>
</launch>
a.上面第一行”rosparam”, 載入yaml檔案中controller的配置到引數伺服器 。
b.controller_spawner node呼叫python指令碼啟動2個位置controller, 該指令碼建立service call到controller manager,告訴controller manager需要啟動哪些controller。
該指令碼也載入第三個controller,該controller用來發布所有關節的狀態, 並且廣播主題/joint_states。 spawner只是roslaunch使用的輔助指令碼。
c. 最後一行啟動一個robot_state_publisher node, 用來監聽來自joint_state_controller的訊息/joint_states, 然後釋出轉換到/tf主題。這樣在Rviz中你可以看到模擬的robot並做一些其它任務。