1. 程式人生 > >gazebo官網例程

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並做一些其它任務。