系统信息: ros-melodic ubuntu18.04
在github上直接下载的turtlebot自带了kinect,并且可以使用depthimage_to_laserscan将深度信息转化为雷达信息,因此,如果添加雷达并不是必须的。我只是尝试增加雷达传感器来加深自己对机器人模型的理解。
1.保证你已经下载了必须的turtlebot包。

2.使用catkin_make确保已经编译,并source devel/setup.sh
如果编译出现问题,基本都是ros包未下载,根据错误安装对应的ros包。
在bash中输入roslaunch turtlebot_gazebo turtlebot_world.launch


可以打开gazebo并显示出turtlebot以及周围环境,如果有物品未加载
我在打开turtlebot_world的时候,红字报错提示nodelet failed,是因为turtlebot自带kinect,并默认启动depthimage_to_laserscan,因此要下载depthimage_to_laserscan在工作空间。
3.环境正常运行后,我们查看turtlebot_world.launch(如果不了解launch文件和xacro文件,去看一下介绍再继续进行)
这里对机器人进行加载的语句是
<include file="$(find turtlebot_gazebo)/launch/includes/$(arg base).launch.xml">
查看当前目录下的includes的kobuki.launch.xml,发现他使用变量3d_sensor指向了turtlebot/turtlebot_description/robots目录下的xacro文件。
因此,我们在该目录下创建机器人模型,命名为kobuki_hexagons_KinectHokuyo.urdf.xacro
<?xml version="1.0"?>
<!--
- Base : kobuki
- Stacks : hexagons
- 3d Sensor : kinect+hokuyo
-->
<robot name="turtlebot" xmlns:xacro="http://ros.org/wiki/xacro">
<xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_common_library.urdf.xacro" />
<xacro:include filename="$(find kobuki_description)/urdf/kobuki.urdf.xacro" />
<xacro:include filename="$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro"/>
<xacro:include filename="$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro"/>
<xacro:include filename="$(find turtlebot_description)/urdf/sensors/hokuyo.urdf.xacro"/>
<kobuki/>
<stack_hexagons parent="base_link"/>
<sensor_kinect parent="base_link"/>
<sensor_hokuyo parent="base_link"/>
</robot>
注意,我的改动是在kobuki_hexagons_Kinect.urdf.xacro的基础上增加了一个laser
<xacro:include filename="$(find turtlebot_description)/urdf/sensors/hokuyo.urdf.xacro"/>
之后,由于turtlebot并没有定义hokuyo,我们需要去路径turtlebot_description/urdf/sensors/下建立hokuyo.urdf.xacro urdf文件,配置位置信息。
<?xml version="1.0"?>
<!-- script_version=1.1 -->
<robot name="sensor_hokuyo" xmlns:xacro="http://ros.org/wiki/xacro">
<xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_gazebo.urdf.xacro"/>
<xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_properties.urdf.xacro"/>
<!-- RPLidar 2D LIDAR -->
<xacro:macro name="sensor_hokuyo" params="parent">
<joint name="laser" type="fixed">
<origin xyz="0.10 0 0.435" rpy="0 0.0 0.0" />
<parent link="base_link" />
<child link="hokuyo_link" />
</joint>
<!-- Hokuyo Laser -->
<link name="hokuyo_link">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://turtlebot_description/meshes/sensors/hokuyo.dae"/>
</geometry>
</visual>
<inertial>
<mass value="1e-5" />
<origin xyz="0 0 0" rpy="0 0 0"/>
<inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
</inertial>
</link>
<!-- Set up laser gazebo details -->
<turtlebot_sim_2dsensor/>
</xacro:macro>
</robot>
代码中
<mesh filename="package://turtlebot_description/meshes/sensors/hokuyo.dae"/>
使用到了hokuyo.dae文件,这在我们预先下载的模型中可以找到。
~/.gazebo/models/hokuyo/meshes/hokuyo.dae
将其复制到turtlebot_description/meshes/sensors/目录下。
4.在turtlebot_description/urdf/turtlebot_gazebo.urdf.xacro文件下添加配置laser在gazebo下的属性值插件配置,将以下代码插入文件中
<xacro:macro name="turtlebot_sim_2dsensor">
<gazebo reference="hokuyo_link">
<sensor type="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>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
<topicName>/turtlebot/laser/scan</topicName>
<frameName>hokuyo_link</frameName>
</plugin>
</sensor>
</gazebo>
</xacro:macro>
topicName标签定义了laser信息发布节点为/turtlebot/laser/scan
5.配置完成,由于launch文件根据env定义的变量来加载模型,我们需要在~/.bashrc中添加
export TURTLEBOT_3D_SENSOR=KinectHokuyo
将加载的模型指向我们增加的机器人文件
6.运行
roslaunch turtlebot_gazebo turtlebot_world.launch
// 查看topic
rostopic list
可以看到/turtlebot/laser/scan已经发布
roslaunch turtlebot_rviz_launchers view_navigation.launch
将global options的Fixed Frame从map改为其他
把LaserScan订阅的节点改为/turtlebot/laser/scan,可以看到由深度图形转换的雷达信息没有本身雷达得到的信息丰富,也算是对的起我们的一番折腾了。