• SLAM从入门到精通(lidar数据的采集)


    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

            lidar是机器人用的比较多的一种传感器。从前可能单线lidar用的比较多,现在多线lidar则开始慢慢崛起了。这里面最主要的原因还是价格。之前3d lidar动则十几万、几万的价格,这是大多数厂家都负担不起的。而现在,随着越来越多的国产厂家参与到了3d lidar的研发,这个时候lidar的价格也应声下跌,开始走入大规模商用的时代。

            对于不同品牌的厂家来说,它们一般都会提供ros的lidar驱动。因为ros的lidar驱动格式是统一的,所以这个时候,对于使用者来说,拿到了ros包之后,直接rviz查看/scan话题,就可以看到对应的显示效果了。

    1、lidar的数据格式

            要知道lidar的数据格式,有好几种办法。最主要的方法,就是直接从ros官方网站去查找。比如,输入inde.ros.org,在查找一栏输入sensor,大概就会看到这样的搜索内容,

            这个时候,顺着网页向下查找,我们会发现有很多的选项。直接选择第一个sensor_msgs,进入页面之后,开始往下寻找,查找到laser_scan即可,

            这个时候,链接的网页之中就有我们想要的内容了,

    1. # Single scan from a planar laser range-finder
    2. #
    3. # If you have another ranging device with different behavior (e.g. a sonar
    4. # array), please find or create a different message, since applications
    5. # will make fairly laser-specific assumptions about this data
    6. std_msgs/Header header # timestamp in the header is the acquisition time of
    7. # the first ray in the scan.
    8. #
    9. # in frame frame_id, angles are measured around
    10. # the positive Z axis (counterclockwise, if Z is up)
    11. # with zero angle being forward along the x axis
    12. float32 angle_min # start angle of the scan [rad]
    13. float32 angle_max # end angle of the scan [rad]
    14. float32 angle_increment # angular distance between measurements [rad]
    15. float32 time_increment # time between measurements [seconds] - if your scanner
    16. # is moving, this will be used in interpolating position
    17. # of 3d points
    18. float32 scan_time # time between scans [seconds]
    19. float32 range_min # minimum range value [m]
    20. float32 range_max # maximum range value [m]
    21. float32[] ranges # range data [m]
    22. # (Note: values < range_min or > range_max should be discarded)
    23. float32[] intensities # intensity data [device-specific units]. If your
    24. # device does not provide intensities, please leave
    25. # the array empty.

            当中比较重要的属性有angle_min、angle_max、angle_increment、ranges、intensities这些属性。ranges表示lidar的距离,是一个数组。angle表示lidar角度,angle_increment表示每次lidar的增加角度。这些都是常规变量。比较重要的量还有intensities,这个表示反射强度,某些特定的物体对lidar反射会比较高,它也是一个数组。这样就可以通过它来识别反光柱、反光条,实现基于反光柱、反光条的定位识别算法。

    2、编写lidar_node.cpp代码

    1. #include
    2. #include
    3. void LidarCallback(const sensor_msgs::LaserScan msg)
    4. {
    5. float fMidDist = msg.ranges[180];
    6. ROS_INFO("front distance ranges[180] = %0.8f m", fMidDist);
    7. }
    8. int main(int argc, char* argv[])
    9. {
    10. setlocale(LC_ALL, "");
    11. ros::init(argc, argv, "lidar_node");
    12. ros::NodeHandle n;
    13. ros::Subscriber lidar_sub = n.subscribe("/scan", 10, &LidarCallback);
    14. ros::spin();
    15. }

            代码比较简单,主要就是订阅/scan的数据,同时定期将msg.ranges[180]的数据打印出来。这个数值其实就是机器人前方距离书柜的距离。

    3、添加CMakeLists.txt

    1. add_executable(lidar_node src/lidar_node.cpp)
    2. target_link_libraries(lidar_node ${catkin_LIBRARIES})
    3. add_dependencies(lidar_node beginner_tutorials_generate_messages_cpp)

    4、编译

            编译和之前package中的node编译没有什么区别,主要还是直接输入catkin_make即可。

    5、调试

            调试的分成三个步骤。第一肯定是利用roslaunch打开wpb_simple.launch文件;第二,启动lidar_node节点,输入rosrun beginner_tutorials lidar_node即可。这个时候,不出意外的话,应该可以看到这些打印,

            第三,如果这些打印都没有问题,可以继续启动rosrun rqt_robot_steering rqt_robot_steering,这样通过控制小车的前进和后退,观察lidar_node中的打印数据有没有发生改变。如果一切和预想的一样,那么说明我们的想法是正确的。不然,就要去分析一下失败的原因了。

  • 相关阅读:
    工作【当van-tab不满足固定在顶部】
    程序员挖“洞”致富:发现一个漏洞,获赏 1272 万元
    idea导入maven项目依赖报错
    AVS3中的intra string copy(ISC)
    ZYNQ PS与PL通信之DMA
    《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第11章 事实表设计
    机器学习实战(11)——初识人工神经网络
    ThreeJS-截屏下载pdf或者图片时白屏
    小公司的应用服务部署历程
    大数据安全 | 【实验】DES加密解密
  • 原文地址:https://blog.csdn.net/feixiaoxing/article/details/133270093