将所有kinetic 替换为noetic
cd src/champion_nav_msgs/
sudo bash install.sh
1. 补充去除激光雷达运动畸变模块的代码;
第一题代码说明:
本题目为实现一个里程计去除激光雷达运动畸变的代码模块,作业里面有两个工程:
champion_nav_msgs 和 LaserUndistortion。大家需要首先编译安装 champion_nav_msgs,按照
champion_nav_msgs 的 readme 文件执行即可,或运行命令 sudo bash install.sh,注意如果你的
ubuntu 版本不是 kinetic,要将所有 kinetic 的地方修改成你的 ros 版本。
程序运行过程为:
Step1:实现 207 行 LidarMotionCalibration 函数,并用 catkin_make 命令进行编译;
Step2:在 LaserUndistortion 下,进行 source:source devel/setup.bash;
Step3:运行 launch 文件:roslaunch LaserUndistortion LaserUndistortion.launch,执行本条指令的时候,必须保证没有任何 ROS 节点在运行, roscore 也要关闭;
Step4:进入到 /bag 目录下,运行指令:rosbag play -–clock laser.bag;
Step5:如果一切正常,则会看到 pcl 的可视化界
用插值的方法,从而得到每一个小时刻的位姿,从而去除运动畸变。
明确几个物理量:
(1)start_time : 激光数据开始的时刻。
(2)end_time : endTime = startTime + ros::Duration(laserScanMsg.time_increment * beamNum); 激光数据结束的时刻。
(3)frame_start_pose : 雷达数据开始时刻,从odom获取的start_time时刻的机器人位姿。
(4)frame_mid_pose : 中间某一帧雷达时刻,从odom获取的mid_time时刻的机器人位姿。
(5)frame_end_pose : 雷达数据结束时刻,从odom获取的end_time时刻的机器人位姿。
(6)frame_base_pose : 基准坐标,就是将所有去畸变的电云放在这个坐标系下。这里我们将第一个雷达数据所在位姿作为基准坐标。(基准位姿)
(7)interpolation_time_duration : 插值间隔。如果mid_time - start_time > interpolation_time_duration,则进行插值.
(8)interp_count : 在插值间隔中有几个激光点。
坐标转换流程:
激光雷达坐标系 --> 视觉里程计坐标系 --> 基础坐标系
插值思想:
每次都选取中间的一个超过插值时间的激光时间段,起点为start,终点为middle,这个段的起点终点位姿由里程计获取,可以用!tf_->waitForTransform("/odom", “/base_laser”, dt, ros::Duration(0.5)))等上一个,避免时间不同步的问题。对内部进行插值,有几个点插值几个,使得每个激光点都有属于自己的位姿。
运行结果:
cd study_dome/LaserUndistortion_ws
catkin_make
source devel/setup.bash
roslaunch LaserUndistortion LaserUndistortion.launch
cd study_dome/LaserUndistortion_ws/bag
rosbag play -–clock laser.bag
播放录制文件时顺带显示录制文件的时间戳:
Rosbag play --clock bagFile01.bag
rosbag play --clock bag_name.bag #默认/clock的话题频率100hz
rosbag play --clock --hz 200 bag_name.bag #指定/clock的时钟为200hz
结果如下: