Gazebo-Ros搭建汽车和场景并运行slam构图3算法–将插件添加到机器人传感器中并放入场景
1.添加标签
虽然第一篇文章篇文章中创建机器人模型rviz但如果要在中显示gazebo中显示,
每个部分都需要添加和标签。
要正确显示颜色和其他信息,还需要添加标签
例如:
<link name="base_link"> <collision> <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /> <geometry> <cylinder length="0.16" radius="0.20" /> </geometry> </collision> <visual> <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /> <geometry> <cylinder length="0.16" radius="0.20" /> </geometry> <material name="orange"> <color rgba="1 0.4 0 1"/> </material> </visual> <inertial> <origin xyz="0 0 0" rpy="0 0 0"/> <mass value="6" /> <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" /> </inertial> </link> <gazebo reference="base_link"> <material>Gazebo/Orange</material> </gazebo>
2.添加插件
如果要使用添加的雷达和相机模块,还需要添加相应的插件,官方提供不同的雷达相机插件,其中一个可以参考Tutorial: Using Gazebo plugins with ROS
雷达为例:
<link name="laser_link"> <collision> <origin xyz=" 0 0 0 " rpy="0 0 0" /> <geometry> <cylinder length="0.05" radius="0.05"/> </geometry> </collision> <visual> <origin xyz=" 0 0 0 " rpy="0 0 0" /> <geometry> <cylinder length="0.05" radius="0.05"/> </geometry> <material name="black"/> </visual> <inertial> <origin xyz="0 0 0"/> <mass value="1" /> <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" /> </inertial> </link> <gazebo reference="laser_link"> <material>Gazebo/Black</material> <sensor type="gpu_ray" name="head_hokuyo_sensor"> <pose>0 0 0 0 0 0</pose> <visualize>false</visualize> <update_rate>40</update_rate> <ray> <scan> <horizontal> <samples>720</samples> <resolution>1</resolution> <min_angle>-1.570796</min_angle> <max_angle>1.570796</max_angle> </horizontal> </scan> <range> <min>0.10</min> <max>30.0</max> <resolution>0.01</resolution> </range> <noise> <type>gaussian</type> <!-- Noise parameters based on published spec for Hokuyo laser achieving " -30mm" accuracy at range < 10m. A mean of 0.0m and stddev of 0.01m will put 99.7% of samples within 0.03m of the true reading. --> <mean>0.0</mean> <stddev>0.01</stddev> </noise> </ray> <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so"> <topicName>/scan</topicName> <frameName>laser_link</frameName> </plugin> </sensor> </gazebo>
3.添加完整完整代码
在文章1中添加标签和插件后my_robot.urdf更新为my_robot2.urdf:
<?xml version="1.0" ?> <robot name="my_robot"> <link name="base_link"> <collision> <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /> <geometry> <cylinder length="0.16" radius="0.20" /> </geometry> </collision> <visual> <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /> <geometry> <cylinder length="0.16" radius="0.20" /> </geometry> <material name="orange"> <color rgba="1 0.4 0 1"/> </material> </visual> <inertial> <origin xyz="0 0 0" rpy="0 0 0"/> <mass value="6" /> <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" /> </inertial> </link>
<gazebo reference="base_link">
<material>Gazebo/Orange</material>
</gazebo>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="left_wheel_link">
<collision>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0"/>
<mass value="1" />
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
</inertial>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<collision>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0"/>
<mass value="1" />
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
</inertial>
</link>
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="front_caster_link">
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<sphere radius="0.015"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0"/>
<mass value="1" />
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
</inertial>
</link>
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="back_caster_link">
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<sphere radius="0.015"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0"/>
<mass value="1" />
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
</inertial>
</link>
<link name="camera_link">
<collision>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<box size="0.02 0.05 0.03" />
</geometry>
</collision>
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<box size="0.02 0.05 0.03" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
<inertial>
<origin xyz="0 0 0"/>
<mass value="1" />
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
</inertial>
</link>
<gazebo reference="camera_link">
<material>Gazebo/Black</material>
<sensor type="camera" name="camera1">
<update_rate>30.0</update_rate>
<camera name="head">
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>800</width>
<height>800</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.02</near>
<far>300</far>
</clip>
<noise>
<type>gaussian</type>
<!-- Noise is sampled independently per pixel on each frame.
That pixel's noise value is added to each of its color
channels, which at that point lie in the range [0,1]. -->
<mean>0.0</mean>
<stddev>0.007</stddev>
</noise>
</camera>
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>rrbot/camera1</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>camera_link</frameName>
<hackBaseline>0.07</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>
</sensor>
</gazebo>
<joint name="camera_joint" type="fixed">
<origin xyz="0.17 0 0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="camera_link"/>
</joint>
<link name="laser_link">
<collision>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
</collision>
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<material name="black"/>
</visual>
<inertial>
<origin xyz="0 0 0"/>
<mass value="1" />
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
</inertial>
</link>
<gazebo reference="laser_link">
<material>Gazebo/Black</material>
<sensor type="gpu_ray" name="head_hokuyo_sensor">
<pose>0 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>40</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-1.570796</min_angle>
<max_angle>1.570796</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>30.0</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<!-- Noise parameters based on published spec for Hokuyo laser
achieving "+-30mm" accuracy at range < 10m. A mean of 0.0m and
stddev of 0.01m will put 99.7% of samples within 0.03m of the true
reading. -->
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">
<topicName>/scan</topicName>
<frameName>laser_link</frameName>
</plugin>
</sensor>
</gazebo>
<joint name="laser_joint" type="fixed">
<origin xyz="0 0 0.105" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="laser_link"/>
</joint>
<link name="imu_link">
<collision>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<box size="0.02 0.02 0.01" />
</geometry>
</collision>
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<box size="0.02 0.02 0.01" />
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0"/>
<mass value="0.5" />
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
</inertial>
</link>
<gazebo reference="imu_link">
<gravity>true</gravity>
<sensor name="imu_sensor" type="imu">
<always_on>true</always_on>
<update_rate>100</update_rate>
<visualize>true</visualize>
<topic>__default_topic__</topic>
<plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
<topicName>imu</topicName>
<bodyName>imu_link</bodyName>
<updateRateHZ>10.0</updateRateHZ>
<gaussianNoise>0.0</gaussianNoise>
<xyzOffset>0 0 0</xyzOffset>
<rpyOffset>0 0 0</rpyOffset>
<frameName>imu_link</frameName>
<initialOrientationAsReference>false</initialOrientationAsReference>
</plugin>
<pose>0 0 0 0 0 0</pose>
</sensor>
</gazebo>
<joint name="imu_joint" type="fixed">
<origin xyz="0.1 0 0.085" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="imu_link"/>
</joint>
</robot>
4.创建launch文件
在工程目录的launch文件夹下创建test.launch 文件,使用gazebo_ros包中提供的功能生成我们创建的机器人模型并放在我们搭建的环境中。(参考Tutorial: Using roslaunch to start Gazebo, world files and URDF models)
文件中两个find后边是自己当初创建的包名,这里是myrobot_description
然后当初创建的test.world在myrobot_description/world路径下
机器人模型在myrobot_description/urdf路径下,名字为my_robot2.urdf
<launch>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find myrobot_description)/world/test.world"/>
</include>
<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find myrobot_description)/urdf/my_robot2.urdf -urdf -model my_robot" />
</launch>
5.运行test.launch 文件,查看效果
$ roslaunch myrobot_description test.launch
6.此时,我们在不关闭gazebo的窗口下,再打开一个终端,运行rviz
$ roslaunch myrobot_description display_my_robot.launch
修改FixedFrame为base_link,Add RobotModel和Topic LaserScan,其中LaserScan中的topic改为/scan(这是机器人模型robot2.urdf中激光雷达插件中的话题名)
可以看到已经看到激光雷达扫描到了所处环境的点云
Gazebo-Ros搭建小车和场景并运行slam算法进行建图4–为机器人添加运动控制器控制其移动