Gazebo-Ros搭建小车和场景并运行slam算法进行建图3--给机器人的传感器添加插件并放入场景中

Gazebo-Ros搭建小车和场景并运行slam算法进行建图3–给机器人的传感器添加插件并放入场景中

1.添加标签

​ 第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–为机器人添加运动控制器控制其移动

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值