ros

turtlebot添加laser

Posted on 2020-03-09,7 min read
系统信息: 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,可以看到由深度图形转换的雷达信息没有本身雷达得到的信息丰富,也算是对的起我们的一番折腾了。

下一篇: 剪绳子→