Gazebo中Turtlebot3激光雷达最远距离调整后测距信息不正常问题解决方法

Turtlebot3的github地址是https://github.com/ROBOTIS-GIT/turtlebot3,其中激光雷达默认的最远测距是3.5m。

当把3.5m修改为3.5m以上的数时,前方的激光发射会存在问题,如下图所示。总之会有许多测距的异常值,大概在0.1~0.2左右。(请无视我小车和车轮的颜色,这是我之后自己改过的,在这里我用的小车的型号是waffle)

事先声明,这个问题应该是一个bug,但是我暂时不清楚是Gazebo的bug还是turtlebot3的bug,总之发现了在使用的时候该如何避免这个问题。

事情是这样的,首先发现了激光雷达的插件位于turtlebot3_ws/src/turtlebot3/turtlebot3_description/urdf文件夹下,turtlebot3_waffle.gazebo.xacro文件。该文件113行到144行的内容如下(扫描线和角度是我调整过的,跟这个无关):

<gazebo reference="base_scan">
    <material>Gazebo/FlatBlack</material>
    <sensor type="ray" name="lds_lfcd_sensor">
      <pose>0 0 0 0 0 0</pose>
      <visualize>$(arg laser_visual)</visualize>
      <update_rate>50</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>512</samples>
            <resolution>0.703</resolution>
            <min_angle>-1.57</min_angle>
            <max_angle>1.57</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.120</min>
          <max>3.5</max>
          <resolution>0.015</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_ros_lds_lfcd_controller" filename="libgazebo_ros_laser.so">
        <topicName>scan</topicName>
        <frameName>base_scan</frameName>
      </plugin>
    </sensor>
  </gazebo>

其中,当修改<max>3.5</max>中的3.5的时候,激光雷达之后测距就会发生问题,即出现我开头的那张图片。

这个问题很隐蔽,当你不去检查激光的返回值或者不把<xacro:arg name="laser_visual"  default="true"/>改成可视化的情况的话,根本发现不了这个问题,进而导致后续算法出现问题,百思不得其解。

检查了接近一天,最后试出了一个不能算解决方式,只能算“逃避”方式的办法:

打开同一文件夹下的turtlebot3_waffle.urdf.xacro文件,其中162到166行:

<joint name="scan_joint" type="fixed">
    <parent link="base_link"/>
    <child link="base_scan"/>
    <origin xyz="-0.064 0 0.122" rpy="0 0 0"/>
  </joint>

把<origin xyz="-0.064 0 0.122" rpy="0 0 0"/>中的z值调大即可。如果测距从3.5米改成了8米,那么0.122就应该改成0.142。

修改之后的结果如下,可以看出显示和测距都正常了。

 


此外要注意:

1.这个问题看起来好像是被前面的相机给挡住了,但是如果激光雷达测距最远距离对应增大,仍然会出现同样的问题。因此还需要再次往高更改joint的z值,可见不是被遮挡了。

不知道这个问题会不会修复。今天跟师弟调了一下午发现了这个让人无语的问题,最后歪打正着凑合着找到了一个解决方法,特此记录。

2.rviz不能订阅这个激光雷达的topic。(直接rostopic echo是可以看到的)

这个需要把fixed_frame从map改为base_scan,之后global states里面会显示错误,但是Laserscan则是正常的,在rviz里也可以看到激光数据了。(这是因为世界坐标定义成map,单独运行sensor 节点不会生成世界坐标,而传感器坐标laser找不到世界坐标,就定位不了自身的位置,从而报错。)

### 如何在Gazebo中设置和运行多线激光雷达仿真 #### 安装必要的软件包 为了能够在 Gazebo 中成功配置并使用多线激光雷达,需安装一系列依赖项。这通常包括 ROS (Robot Operating System),以及特定于传感器模拟的支持库。 对于基于ROS的环境而言,确保已安装`ros-noetic-desktop-full`版本或是对应当前使用的ROS发行版[^1]。 #### 配置机器人模型文件(SDF/URDF) 要使机器人能够装备一个多线束LiDAR设备,在机器人的描述文件里定义该部件至关重要。此过程涉及编辑或创建一个SDF(System Description Format) 或 URDF(Universal Robot Description Format) 文件来指定 LiDAR 的参数及其相对于机器人其他部分的位置。 针对十六线激光雷达的具体情况,可以参照如下简化示例: ```xml <link name="velodyne"> <collision> <!-- 碰撞体属性 --> </collision> <visual> <!-- 可视化外观 --> </visual> <inertial> <!-- 质量惯性矩阵 --> </inertial> <sensor type="ray" name="lidar_sensor"> <pose>0 0 0.5 0 0 0</pose> <visualize>true</visualize> <plugin filename="libgazebo_ros_laser.so" name="gazebo_ros_laser"/> <ray> <scan> <horizontal> <samples>720</samples> <resolution>1</resolution> <min_angle>-M_PI</min_angle> <max_angle>M_PI</max_angle> </horizontal> <vertical> <samples>16</samples> <resolution>1</resolution> <min_angle>-0.20944</min_angle> <max_angle>0.20944</max_angle> </vertical> </scan> <range> <min>0.38</min> <max>100.0</max> <resolution>0.01</resolution> </range> </ray> </sensor> </link> ``` 上述代码片段展示了如何通过 XML 标签为名为 `velodyne` 的链接(link) 添加一个具有垂直角度范围(-12°至+12°, 即±π/15弧度) 和水平扫描角度覆盖整个圆周(即从 `-PI` 到 `PI`) 的虚拟 Velodyne VLP-16 型号激光测距仪[^2]。 #### 启动与测试 完成硬件描述之后,可以通过启动脚本加载包含新组件在内的世界(World) 并验证一切正常工作。一般情况下会有一个 launch 文件负责调用所有必需的服务节点和服务端口,从而实现完整的功能集成。 例如,下面是一个简单的 Launch 文件模板用于启动带有 LIDAR 设备仿真的 Turtlebot3: ```xml <launch> <!-- 加载机器人状态发布器 --> <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/> <!-- 描述文件路径 --> <param name="robot_description" command="$(find xacro)/xacro &#39;$(find turtlebot3_description)/urdf/turtlebot3_burger.urdf.xacro&#39; laser_model_type:=vlp16 "/> <!-- 运行 Gazebo --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="paused" value="false"/> <arg name="use_sim_time" value="true"/> <arg name="gui" value="true"/> <arg name="headless" value="false"/> <arg name="debug" value="false"/> </include> <!-- 将机器人放入场景 --> <node pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model turtlebot3_burger" /> <!-- 发布 TF 数据 --> <node pkg="tf2_ros" type="static_transform_publisher" name="base_link_to_velodyne" args="0 0 0.5 0 0 0 base_link velodyne" /> </launch> ``` 这段配置仅设置了基本的世界环境,还指定了自定义的 URDF 参数以适应同类型的 Lidar 模型,并且包含了将机器人实例放置到模拟环境中所需的命令。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值