Gazebo是一种多机器人仿真器,可用于室内外机器人仿真。Gazebo在ROS中有良好的接口,包含ROS和Gazebo的所有控制。
若要实现ROS到Gazebo的通信,我们必须安装ROS-Gazebo接口。
应该安装以下软件包:
$ sudo apt install ros-melodic-gazebo-ros-pkgs ros-melodic-gazebo-msgs ros-melodic-gazebo-plugins ros-melodic-gazebo-ros-control
*gazebo_ros_pkgs : 它包含用于将ROS和Gazebo连接的封装和工具。
*gazebo-msgs : 它包含ROS和Gazebo交互的消息和服务的数据结构。
*gazebo-plugins : 它包含用于传感器、执行结构的Gazebo插件。
*gazebo-ros-control : 它包含用于在ROS和Gazebo之间通信的标准控制器。
安装后,请使用以下命令检查Gazebo是否安装正确:
$ roscore & rosrun gazebo_ros gazebo
一.为Gazebo创建机械臂仿真模型
我们可以通过添加仿真参数来更新现有的机器人描述,从而创建一个机械臂仿真模型。
我们需要去创建一个软件包:
$ catkin_create_pkg seven_dof_arm_gazebo gazebo_msgs gazebo_plugins gazebo_ros gazebo_ros_control mastering_ros_robot_description_pkg
也可以在相应的Git库中获得完整的软件包。如下:
$ git clone https://github.com/jocacace/seven\_dof\_arm\_gazebo.git
可以在seven_dof_arm.xacro文件中看到机器人的完整仿真模型,上一章讲过。
该文件包含了URDF标签,这对于仿真是必要的,我们将定义碰撞、惯性、传动、关节、连杆、以及Gazebo。
我们可以使用seven_dof_arm_gazebo软件包来启动现有的仿真模型,启动文件为:seven_dof_arm_world.launch的启动文件。
代码如下:
11 <launch> 2 2 3 3 <!-- these are the arguments you can pass this launch file, for example paused:=t rue --> 4 4 <arg name="paused" default="false"/> 5 5 <arg name="use_sim_time" default="true"/> 6 6 <arg name="gui" default="true"/> 7 7 <arg name="headless" default="false"/> 8 8 <arg name="debug" default="false"/> 9 9 1010 <!-- We resume the logic in empty_world.launch --> 1111 <include file="$(find gazebo_ros)/launch/empty_world.launch"> 1212 <arg name="debug" value="$(arg debug)" /> 1313 <arg name="gui" value="$(arg gui)" /> 1414 <arg name="paused" value="$(arg paused)"/> 1515 <arg name="use_sim_time" value="$(arg use_sim_time)"/> 1616 <arg name="headless" value="$(arg headless)"/> 1717 </include> 1818 1919 <!-- Load the URDF into the ROS Parameter Server --> 2020 <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find ma stering_ros_robot_description_pkg)/urdf/seven_dof_arm.xacro'" /> 2121 2222 2323 <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot --> 2424 <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" out put="screen" 2525 args="-urdf -model seven_dof_arm -param robot_description"/> 2626 2727 2828 </launch>
启动以下命令来显示仿真机械臂
$ roslaunch seven_dof_arm_gazebo seven_dof_arm_world.launch
模型如下:

接下来我们来详细的讨论一下机器人的仿真模型文件
1.为Gazebo机器人模型添加颜色和纹理
在机器人仿真中我们可以看到每个连杆都有不同的颜色和纹理。在xacro文件中,下面的标签可以为机器人的连杆提供纹理和颜色:
1140 <gazebo reference="bottom_link"> 2141 <material>Gazebo/White</material> 3142 </gazebo> 4 5172 <gazebo reference="base_link"> 6173 <material>Gazebo/White</material> 7174 </gazebo> 8 9210 <gazebo reference="shoulder_pan_link"> 10211 <material>Gazebo/Red</material> 11212 </gazebo>
2.添加transmission标签来启动模型
为了使用ROS控制器来启动机器人,我们需要定义<transmission>(传动)标签来连接执行机构和关节,以下是为传动的宏:
192 <xacro:macro name="transmission_block" params="joint_name"> 2 93 <transmission name="tran1"> 3 94 <type>transmission_interface/SimpleTransmission</type> 4 95 <joint name="${joint_name}"> 5 96 <hardwareInterface>hardware_interface/PositionJointInterface</hardwareIn terface> 6 97 </joint> 7 98 <actuator name="motor1"> 8 99 <hardwareInterface>hardware_interface/PositionJointInterface</hardwareIn terface> 9100 <mechanicalReduction>1</mechanicalReduction> 10101 </actuator> 11102 </transmission> 12103 </xacro:macro>
在这里<joint name="">是连接启动器的关节。<type>标签是传动类型。目前,仅支持简单的传动transmission_interface/SimpleTransmission. <hardwareInterface>
标签是要加载的硬件接口类型(位置、速度或力度),在该示例中,使用了位置控制硬件接口。这个硬件接口由gazebo_ros_control插件加载,下一节将看到。
3.添加gazebo_ros_control插件
在添加传动标签后,我们应该在仿真模型中添加gazebo_ros_control插件来解析传动标签并分配适当的硬件接口和控制管理器。代码如下:
1563 <gazebo> 2564 <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"> 3565 <robotNamespace>/seven_dof_arm</robotNamespace> 4566 </plugin> 5567 </gazebo> 6568
<plugin>标签指定了要加载的插件名是libgazebo_ros_control.so。可以将<robotNamespace>标签作为机器人的名称,
如果我们没有指定名称,它将从URDF 自动加载机器人的名称。我们还可以在参数服务器(<robotParam>)上指定控制器刷新速率(<control-Period>),robot_description(URDF)
的位置以及机器人硬件接口的类型(<robotSimType>).默认的硬件接口可以是:JointStateInerface、EffortJointInterface或VelocityJointInterface.
4.在Gazebo中添加3D视觉传感器
在Gazebo中,我们可以仿真机器人的运动和物理特征,也可以对传感器进行仿真。
要在Gazebo中创建一个传感器,我们就必须对Gazebo中传感器的行为进行建模。
Gazebo中有一些预先创建的传感器模型,可以直接在代码中使用而无需编写新模型。
这里,我们在Gazebo中添加了一个名为Asus Xtion Pro模型的3D视觉传感器(通常称为RGB-D传感器)。传感器已经在gazebo_ros_pkgs/gazebo_plugins的ROS软件包中实现。
Gazebo中的每个模型都可以作为Gazebo_ROS插件实现,可以将其插入URDF文件来加载。
以下是我们如何在seven_dof_arm_with_rgbd.xacro机器人的xacro文件中把Gazebo定义和Xtion Pro的物理机器人模型包含进来的:
<xacro:include filename="$(find mastering_ros_robot_description_pkg)/urdf/sensor s/xtion_pro_live.urdf.xacro"/>
在xtion_pro_live.urdf.xacro文件内部,我们可以看到以下代码:
11 <?xml version="1.0"?> 2 2 <robot xmlns:xacro="http://ros.org/wiki/xacro"> 3 3 4 4 <xacro:include filename="$(find mastering_ros_robot_description_pkg)/urdf/sensors /xtion_pro_live.gazebo.xacro"/> 5 5 6 6 <xacro:macro name="dummy_inertial"> 7 7 <inertial> 8 8 <origin xyz="0 0 0" rpy="0 0 0"/> 9 9 <mass value="0.001"/> 1010 <inertia ixx="0.00001" ixy="0" ixz="0" 1111 iyy="0.00001" iyz="0" 1212 izz="0.00001"/> 1313 </inertial> 1414 </xacro:macro> 1515 1616 <xacro:macro name="xtion_pro_live" params="name parent *origin *optical_origin"> 1717 1818 <!-- frames in the center of the camera --> 1919 <joint name="${name}_joint" type="fixed"> 2020 <xacro:insert_block name="origin"/> 2121 <parent link="${parent}_link"/> 2222 <child link="${name}_link"/> 2323 </joint> 2424 2525 <link name="${name}_link"> 2626 <inertial> 2727 <origin xyz="-0.00936000000 -0.00003000000 -0.00273000000" rpy="0 0 0"/> 2828 <mass value="0.21970000000"/> 2929 <inertia ixx="0.00000429247" ixy="0.00000000000" ixz="0.00000002565" 3030 iyy="0.00000008027" iyz="0.00000000000" 3131 izz="0.00000427339"/> 3232 </inertial> 3333 <visual> 3434 <origin xyz="0 0 0" rpy="0 0 0"/> 3535 <geometry> 3636 <mesh filename="package://mastering_ros_robot_description_pkg/meshes/sens ors/xtion_pro_live/xtion_pro_live.dae"/> 3737 </geometry> 3838 <material name="DarkGrey"/> 3939 </visual> 4040 </link> 4141 4242 <joint name="${name}_optical_joint" type="fixed"> 4343 <xacro:insert_block name="optical_origin"/> 4444 <parent link="${name}_link"/> 4545 <child link="${name}_optical_frame"/> 4646 </joint> 4747 4848 <link name="${name}_optical_frame"> 4949 <dummy_inertial/> 5050 </link> 5151 5252 <!-- Depth sensor frames --> 5353 <joint name="${name}_depth_joint" type="fixed"> 5454 <origin xyz="0.0 0.049 0.0" rpy="0 0 0"/> 5555 <parent link="${name}_link"/> 5656 <child link="${name}_depth_frame"/> 5757 </joint> 5858 5959 <link name="${name}_depth_frame"> 6060 <dummy_inertial/> 6161 </link> 6262 6363 <joint name="${name}_depth_optical_joint" type="fixed"> 6464 <origin xyz="0 0 0" rpy="${-90.0 * deg_to_rad} 0.0 ${-90.0 * deg_to_rad}"/> 6565 <parent link="${name}_depth_frame"/> 6666 <child link="${name}_depth_optical_frame"/> 6767 </joint> 6868 6969 <link name="${name}_depth_optical_frame"> 7070 <dummy_inertial/> 7171 </link> 7272 7373 <!-- RGB sensor frames --> 7474 <joint name="${name}_rgb_joint" type="fixed"> 7575 <origin xyz="0.0 0.022 0.0" rpy="0 0 0"/> 7676 <parent link="${name}_link"/> 7777 <child link="${name}_rgb_frame"/> 7878 </joint> 7979 8080 <link name="${name}_rgb_frame"> 8181 <dummy_inertial/> 8282 </link> 8383 8484 <joint name="${name}_rgb_optical_joint" type="fixed"> 8585 <origin xyz="0 0 0" rpy="${-90.0 * deg_to_rad} 0.0 ${-90.0 * deg_to_rad}"/> 8686 <parent link="${name}_rgb_frame"/> 8787 <child link="${name}_rgb_optical_frame"/> 8888 </joint> 8989 9090 <link name="${name}_rgb_optical_frame"> 9191 <dummy_inertial/> 9292 </link> 9393 9494 <xacro:xtion_pro_live_rgbd_camera_gazebo name="${name}"/> 9595 </xacro:macro> 9696 9797 </robot>
在这里,我们可以看到它包含另一个名为xtion_pro_live.gazebo.xacro的文件,该文件包含Xtion Pro在Gazebo中的完整定义。
我们还可以看到一个名为xtion_pro_live的宏定义,其中包含Xtion Pro的完整模型定义,包括连杆和关节:
<mesh filename="package://mastering_ros_robot_description_pkg/meshes/sens ors/xtion_pro_live/xtion_pro_live.dae"/>
在宏定义中,我们将导入一个Asus Xtion Pro的网格文件该文件将在Gazebo中显示为相机连杆。
在mastering_ros_robot_description_pkg/urdf/sensors/xtion_pro_live.gazebo.xacro文件中,
我们可以设置Xtion Pro的Gazebo-ROS插件,我们将插件定义为宏,并支持RGB和深度相机,插件的定义如下:
167 <plugin name="${name}_frame_controller" filename="libgazebo_ros_openni_kine ct.so"> 268 <alwaysOn>true</alwaysOn> 369 <updateRate>6.0</updateRate> 470 <cameraName>${name}</cameraName> 571 672 <imageTopicName>rgb/image_raw</imageTopicName> 773 <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName> 874 <pointCloudTopicName>rgb/points</pointCloudTopicName> 975 1076 <depthImageTopicName>depth/image_raw</depthImageTopicName> 1177 <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTop icName> 1278 1379 <frameName>${name}_optical_frame</frameName> 1480 <pointCloudCutoff>0.05</pointCloudCutoff> 1581 <pointCloudCutoffMax>5</pointCloudCutoffMax> 1682 <rangeMax>1.5</rangeMax> 1783 1884 </plugin>
Xtion Pro的插件文件名是libgazebo_ros_openni_kinect.so,我们可以定义插件参数,例如相机名称,图像话题等。
二.仿真装有Xtion Pro的机械臂
现在已经了解了Gazebo中相机插件的定义,我们可以使用以下命令启动完整的仿真:
$ roslaunch seven_dof_arm_gazebo seven_dof_arm_with_rgbd_world.launch
我们就可以看到一个机器人模型,在机械臂顶部装有一个传感器,如图所示:

可视化三维传感器数据
使用上述命令启动仿真后,我们可以检查由传感器插件生成的话题,如图所示:
1 命令:qqtsj ~ catkin_ws :rostopic list 2/clock 3/gazebo/link_states 4/gazebo/model_states 5/gazebo/parameter_descriptions 6/gazebo/parameter_updates 7/gazebo/set_link_state 8/gazebo/set_model_state 9/image_view_1581403067208774218/output 10/image_view_1581403067208774218/parameter_descriptions 11/image_view_1581403067208774218/parameter_updates 12/rgbd_camera/depth/camera_info 13/rgbd_camera/depth/image_raw 14/rgbd_camera/depth/points 15/rgbd_camera/ir/camera_info 16/rgbd_camera/ir/image_raw 17/rgbd_camera/ir/image_raw/compressed 18/rgbd_camera/ir/image_raw/compressed/parameter_descriptions 19/rgbd_camera/ir/image_raw/compressed/parameter_updates 20/rgbd_camera/ir/image_raw/compressedDepth 21/rgbd_camera/ir/image_raw/compressedDepth/parameter_descriptions 22/rgbd_camera/ir/image_raw/compressedDepth/parameter_updates 23/rgbd_camera/ir/image_raw/theora 24/rgbd_camera/ir/image_raw/theora/parameter_descriptions 25/rgbd_camera/ir/image_raw/theora/parameter_updates 26/rgbd_camera/parameter_descriptions 27/rgbd_camera/parameter_updates 28/rgbd_camera/rgb/camera_info 29/rgbd_camera/rgb/image_raw 30/rgbd_camera/rgb/image_raw/compressed 31/rgbd_camera/rgb/image_raw/compressed/parameter_descriptions 32/rgbd_camera/rgb/image_raw/compressed/parameter_updates 33/rgbd_camera/rgb/image_raw/compressedDepth 34/rgbd_camera/rgb/image_raw/compressedDepth/parameter_descriptions 35/rgbd_camera/rgb/image_raw/compressedDepth/parameter_updates 36/rgbd_camera/rgb/image_raw/theora 37/rgbd_camera/rgb/image_raw/theora/parameter_descriptions 38/rgbd_camera/rgb/image_raw/theora/parameter_updates 39/rgbd_camera/rgb/points 40/rosout 41/rosout_agg
我们使用名为image_view的工具来查看3D视觉传感器的图像数据:
*查看RGB原始图像:
$ rosrun image_view image_view image:=/rgbd_camera/rgb/image_raw
*查看IR原始图像:
$rosrun image_view image_view image:=/rgbd_camera/ir/image_raw
*查看深度图像
$rosrun image_view image_view image:=/rgbd_camera/depth/image_raw
如下为以上的截图:


