1. 程式人生 > >Gazebo簡介及利用ROS控制gazebo模型

Gazebo簡介及利用ROS控制gazebo模型

1.gazebo簡介

載入特定的world,如

gazebo world/pr2.world

 系統預設的world路徑為

/usr/share/gazebo-version/worlds

gazebo指令會執行兩種不同的可執行檔案,一個是gzserver,另一個是gzclient。前者執行物理更新迴圈和生成感測器資料,後者生成一個視覺化模擬介面。gazebo 使用許多環境變數來定位檔案,並設定server和client之間的通訊。環境變數的預設值儲存路徑為/usr/share/gazebo-version/ setup.bash.

2.urdf模型檔案

urdf(通用機器人描述格式)是ROS系統中用於描述機器人元件的一個XML檔案。

以rrbot為例

<robot name="rrbot" xmlns:xacro="http://www.ros.org/wiki/xacro">

機器人名字和可選的xacro的XML名稱空間

  <link name="world"/>

  <joint name="fixed" type="fixed">
    <parent link="world"/>
    <child link="link1"/>
  </joint>

增加了一個world的連結和關節,並將將link1固定到世界座標系上。

  <!-- Base Link -->
  <link name="link1">
    <collision>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <geometry>
	<box size="${width} ${width} ${height1}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <geometry>
	<box size="${width} ${width} ${height1}"/>
      </geometry>
      <material name="orange"/>
    </visual>

    <inertial>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <mass value="${mass}"/>
      <inertia
	  ixx="${mass / 12.0 * (width*width + height1*height1)}" ixy="0.0" ixz="0.0"
	  iyy="${mass / 12.0 * (height1*height1 + width*width)}" iyz="0.0"
	  izz="${mass / 12.0 * (width*width + width*width)}"/>
    </inertial>
  </link>

gazebo中的計量單位是米和千克。細心的話你會發現<collision>和<visual>中的元素基本是一模一樣的,你可以這麼理解,collision用於gazebo中顯示,visual用於rviz中顯示,因此二者一樣。至於多出來的一行<material name>是通過材料指令碼來指定顏色。如果要在gazebo中指定顏色,不能通過指令碼的方式,只能手動新增標籤。顏色指令碼及gazebo新增方法如下

<material name="orange">
    <color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
</material>
<gazebo reference="link1">
    <material>Gazebo/Orange</material>
</gazebo>

gazebo中預設的材料原始碼都在gazebo-version/media/materials/scripts/gazebo.material中。

inretial屬性中,origin代表質心,mass代表質量,ixx/yy/zz代表沿該軸的矩。

link2也是類似定義,但在連結與連結之間,要定義一個關節。

  <joint name="joint1" type="continuous">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0 ${width} ${height1 - axel_offset}" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <dynamics damping="0.7"/>
  </joint>

而且兩個非固定連結之間,存在指定的摩擦

  <gazebo reference="link2">
    <mu1>0.2</mu1>
    <mu2>0.2</mu2>
    <material>Gazebo/Black</material>
  </gazebo>

3.用ROS控制gazebo模型

如果只啟動主節點而沒有載入控制,那麼rrbot會處於自然下垂狀態

 ROS提供ros_control功能包來實現與gazebo的通訊和控制。通過ros_control能夠設定模擬控制器驅動機器人實現運動。執行下述指令進行安裝

sudo apt-get install ros-kinetic-ros-control ros-kinetic-ros-controllers

 使用ros_control需要在urdf中新增額外的元素<transmission>用來驅動關節。

  <transmission name="tran1">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="joint1">
      <hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
    </joint>
    <actuator name="motor1">
      <hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
  </transmission>

其中joint name對應關節名,type表示傳輸型別,hardwareInterface包含在<joint><actuator>中表示硬體介面載入的外掛。除了transmission標籤外,還需要新增的是plugin外掛,通過一個額外可拓展的外掛架構允許使用者建立ros_control和gazebo間機器人硬體介面。預設外掛如下:

  <gazebo>
    <plugin filename="libgazebo_ros_control.so" name="ros_control">
      <robotNamespace>/rrbot</robotNamespace>
    </plugin>
  </gazebo>

最後,需要給ros_control控制器建立一個配置檔案和啟動檔案 ,啟動檔案和

cd catkin_ws/src
catkin_create_pkg rrbot_control ros_control ros_controllers
cd rrbot_control
mkdir config
mkdir launch
cd config
gedit rrbot_control.yaml
rrbot:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50  
  
  # Position Controllers ---------------------------------------
  joint1_position_controller:
    type: effort_controllers/JointPositionController
    joint: joint1
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint2_position_controller:
    type: effort_controllers/JointPositionController
    joint: joint2
    pid: {p: 100.0, i: 0.01, d: 10.0}
cd ../launch 
gedit 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>

rosparam通過載入一個YAML配置檔案將引數載入到引數伺服器。controller_spawner節點通過執行指令碼呼叫ros_control控制管理器啟動兩個關節的位置控制器。第三個控制器通過hardware_interfaces將所有關節狀態資訊釋出在/joint_states的話題上。

執行

roslaunch rrbot_gazebo rrbot_world.launch
roslaunch rrbot_control rrbot_control.launch
roslaunch rrbot_control rrbot_rqt.launch

結果如圖就可以看到關節1以正弦方式運動,類似可以釋出對關節2的控制。