用北阳激光雷达ust-10lx跑slam_karto

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24894159/article/details/83662933

引言

在我的之前一篇博文中,讲述了如何用数据集,去哪找数据集,怎么转化数据集,并讲述了怎么跑karto。这篇文档主要介绍下用北阳激光雷达跑数据集的经验。

0.当前配置

  1. Ubuntu 16.04
  2. ROS Kinetic
  3. Opencv 3.4.1
  4. Ceres-solver
  5. gcc version 5.4.0 20160609 (g++)
  6. *Eigen3
  7. *G2O
  8. 北阳激光雷达ust-10lx

1.前提你得有一个雷达

哈哈,不充钱怎么做研究。

2.怎么获取雷达数据

这里主要参考了这篇博文,原来时CSDN博客的,现在找不到了。。。

  1. 首先下载相关节点包

    $ sudo apt-get install ros-kinetic-urg-node

  2. 改ip地址。
    之前看博文介绍修改/etc/network/interfaces,我试了几次,不太行,让后就摸索出一条简单粗暴的方式。

    1. 点击ubuntu坐上角的网络链接。
    2. 最下边编辑链接。
    3. 选择一个以太网链接,如:有线链接1.
    4. 编辑。
    5. IPV4设置,方法改为手动。点击增加地址:192.168.0.20,子网掩码:255.255.255.0,网关:192.168.0.1
    6. 保存,OK.
      这里解释下,北阳雷达默认采用192.168.0.10进行数据传送,所以你要把自己的网络链接改为别的地址,防止冲突。
  3. 确认地址可以ping通,ping 192.168.0.10

  4. 运行urg_node获取数据。

    roscore
    rosrun urg_node urg_node _ip_address:=192.168.0.10

这里注意,是_ip_address不是ip_address,一个是私有,一个时公有参数。
当你看到一堆数据,那么恭喜你运行成功了。

3.有个机器人平台

没有也没关系,可以暂时建一个一帧的图像,但是要建场景的地图,需要机器人底盘提供的tf才能计算位姿,才能谈得上建图。

4.修改karto_slam.launch

可以看到,下面的launch文件,我增加了urg_node,,里面另外一点需要关注的是base_frame<node name="tf" ... />中的base_footprint laser

  • 其中base_frame是机器人底盘的frame_id,可以通过rostopic echo /tf确认是base_link还是base_footprint
  • laser是雷达发布的/scan话题的LaserScan数据类型的frame_id,可以通过rostopic echo /scan确认,当然,先通过rqt_graph确定urg_node发布的是/scan话题。
    <launch>
    <include file="$(find kobuki_node)/launch/minimal.launch"/>
      <node pkg="urg_node" type="urg_node" name="urg_node">
    	<param name="ip_address" value="192.168.0.10"/>
      </node>
      <node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
        <param name="map_update_interval" value="5"/>
    	<param name="map_frame"  value="map"/>
    	<param name="odom_frame" value="odom"/>
    	<param name="base_frame"  value="base_footprint"/>
    	<param name="throttle_scans" value="1"/>
    	<param name="resolution" value="0.025"/>
    	<param name="delta" value="0.05"/>
    	<param name="transform_publish_period" value="0.05"/>
      </node>
      <node pkg="tf" type="static_transform_publisher" name="laser_base" args="0.13 0 0 0 0 0 base_footprint laser 50"/>
      <node pkg="rviz" type="rviz" name="rviz" required="true"/>
    </launch>

还有非常重要的一点

slam_karto里面可以支持不同类型的雷达,但是对ust-10lx支持不是很好,他是270°,1081个激光束,所以你需要把open_karto也下载下来,把karto.h中的static LaserRangeFinder* CreateLaserRangeFinder(LaserRangeFinderType type, const Name& rName)中的一个类型修改能处理自己的雷达数据类型。
如:

case LaserRangeFinder_Hokuyo_UTM_30LX:
        {
          pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Hokuyo UTM-30LX"));

          // Sensing range is 30 meters
          pLrf->m_pMinimumRange->SetValue(0.1);
          pLrf->m_pMaximumRange->SetValue(30.0);

          // 270 degree range, 40 Hz
          pLrf->m_pMinimumAngle->SetValue(math::DegreesToRadians(-135)); //270
          pLrf->m_pMaximumAngle->SetValue(math::DegreesToRadians(135)); //270

          // 0.25 degree angular resolution
          pLrf->m_pAngularResolution->SetValue(math::DegreesToRadians(0.25));

          pLrf->m_NumberOfRangeReadings = 1081; //1081配合自己的雷达
        }
        break;

然后还要修改slame_karto中的slam_karto.cpp中的SlamKarto::getLaser(const sensor_msgs::LaserScan::ConstPtr& scan)函数中的这一步

 karto::LaserRangeFinder* laser = 
karto::LaserRangeFinder::CreateLaserRangeFinder(karto::LaserRangeFinder_Hokuyo_UTM_30LX, karto::Name(name));

看到没,把laserRangeFinder_Hokuyo_UTM_30LX修改为你在open_karto中改的那个case
哦,终于大功搞成!!

5.然后运行就可以了

我在launch文件中加了rviz,运行应该就直接可以看到建图效果了。随便放一个效果图吧。
在这里插入图片描述

6.遇到的问题

  • rviz中map错误,显示不出来。(可能与你的frame有关,可以rosrun rqt_tf_tree rqt_tf_tree看下是不是完整的tf_tree。不完整,你就需要认真检查下你的base_frame,odom_frame,map_frame,laser之中有没有错误的了。)

我遇到的就这个的问题,在ROS官网上也提问请教了外国朋友,回答的很耐心,总之,学会咨询别人解决问题吧,也欢迎评论问我,可能回答不会很及时,请见谅。

7.后记

前段时间一直在弄视觉的东西,雷达没怎么动,又很忙,没时间更新总结,也需要反思下。发现还是能给少数人提供些帮助的,就记下来当总结了。
这篇博文凭记忆总结的,可能水了点,不是很详细,额,就这样吧,改是不可能改了,这辈子是不可能改了!!!

猜你喜欢

转载自blog.csdn.net/qq_24894159/article/details/83662933