X4雷达使用以及ros中时间问题的坑 您所在的位置:网站首页 创想三维cp-01固件 X4雷达使用以及ros中时间问题的坑

X4雷达使用以及ros中时间问题的坑

2023-04-01 01:01| 来源: 网络整理| 查看: 265

EAI X4雷达使用及在ros中的各种各样的坑 雷达介绍

​ x4雷达的相关信息在网上有很多,在这里就不过多赘述,我会放几张图,其他的很多blog里面都有写,不是这一片文章的重点。在这里插入图片描述在这里插入图片描述

总结来讲,x4的纸面数据算不上优秀,但是对于创客和学生来说还是够用的,而且非常对得起他的价格,网上用的人非常多,遇到问题也比较容易找到解决方案。

搭建ros使用环境

EAI的官网上面有x4雷达的ros包,经过测试可以直接使用。

mkdir lidar cd lidar mkdir src catkin_make cd src git clone https://github.com/EAIBOT/ydlidar.git cd .. catkin_make

这样,只要编译没有报错,就可以成功的使用雷达了。

在软件包中的launch文件中找到lidar.launch(我一般习惯自己在rviz中选择可视化数据,如果要直接打开rviz也可以打开lidar_view.launch),下面时launch中的一些节点参数的设置解释。

节点的设置 x4雷达在电脑中的端口号 通信波特率 雷达的frame_id,tf树中的名称 是否打开雷达的低功耗模式 激光雷达是否具有固定的角度分辨率 雷达检测的最小角度 雷达检测的最大角度 雷达检测的最小距离 雷达检测的最大角度 将当前角度设置为0 雷达的采样频率 雷达的扫描频率 设置tf树,发布静态tf信息

这里着重介绍几个重要参数,主要就是angle_min,angle_max,range_min,range_max,其实这几个参数画一个圆就可以解决。在这里插入图片描述

其中里面的圆圈圈就是雷达扫描的范围和里面相应的参数

设置好了相应的参数就可以开启雷达了(别忘了开启之前要source .devel/setup.bash或者写入到.bashrc中)

roslaunch ydlidar lidar.launch

如果一切顺利的话,应该雷达已经开始转起来了 只用rostopic应该就可以查看话题了

rostopic list

应该能看到 /scan 的话题。

正在研究有关slam的软件,gmapping rtabmap 等等,但是当我在这些软件包中选择订阅 /scan 的话题时,出现了有关时间的错误

经过了好长一段时间的寻找,终于找到了问题。

大部分slam包,或者是使用雷达信息的软件,用的单位制度都是公制的,也就是说时间单位都是秒

但是在x4的雷达参数中有两个参数 time_increment scan_time 单位应该是 纳秒,这样的话,在那些软件包中就没有办法计算了,所以我们要在驱动包中做一点小小的修改

打开 /home/xuan/x4/src/ydlidar/src 中的ydlidar_node.cpp

找到这样一段

if(laser.doProcessSimple(scan, hardError )){ sensor_msgs::LaserScan scan_msg; ros::Time start_scan_time; start_scan_time.sec = scan.system_time_stamp/1000000000ul; start_scan_time.nsec = scan.system_time_stamp%1000000000ul; scan_msg.header.stamp = start_scan_time; scan_msg.header.frame_id = frame_id; scan_msg.angle_min = scan.config.min_angle; scan_msg.angle_max = scan.config.max_angle; scan_msg.angle_increment = scan.config.ang_increment; scan_msg.scan_time = scan.config.scan_time; scan_msg.time_increment = scan.config.time_increment; scan_msg.range_min = scan.config.min_range; scan_msg.range_max = scan.config.max_range; scan_msg.ranges = scan.ranges; scan_msg.intensities = scan.intensities; scan_pub.publish(scan_msg); }

修改成这样

if(laser.doProcessSimple(scan, hardError )){ sensor_msgs::LaserScan scan_msg; ros::Time start_scan_time; start_scan_time.sec = scan.system_time_stamp/1000000000ul; start_scan_time.nsec = scan.system_time_stamp%1000000000ul; scan_msg.header.stamp = start_scan_time; scan_msg.header.frame_id = frame_id; scan_msg.angle_min = scan.config.min_angle; scan_msg.angle_max = scan.config.max_angle; scan_msg.angle_increment = scan.config.ang_increment; scan_msg.scan_time = scan.config.scan_time/1000000000ul; scan_msg.time_increment = scan.config.time_increment/1000000000ul; scan_msg.range_min = scan.config.min_range; scan_msg.range_max = scan.config.max_range; scan_msg.ranges = scan.ranges; scan_msg.intensities = scan.intensities; scan_pub.publish(scan_msg); }

然后重新编译之后就可以正常被读取了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有