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的控制。