运行流程:source ~/code/diver/ws_livox/devel/setup.bash
catkin_make
source ./devel/setup.bash
roslaunch fast_lio mapping_avia.launch
rosbag play xxx.bag
理论解读:雷达惯性里程计论文笔记—FAST-LIO流程梳理 (三) - 知乎
1、imu前向传播与后向传播
前向传播:将IMU的数据带入模型公式,就可得到估计的状态x和协方差P。
用于获得一次LiDAR_Scan中的IMU位姿和误差,同时利用位姿和误差信息来更新机器人当前估计的位姿。
后向传播:用于lidar去畸变。
一帧中雷达数据特征点{Lj}并非同一时刻测量的,这些特征点中存在着相对运动,为此就需要对其进行运动补偿。FAST-LIO使用后向传播对特征点{Lj}进行运动补偿。特征点之间的相对运动使得他们之间存在着相对位姿变化,将IMU测量数据即可求得各个特征点(时间pj)与最后一个特征点(时间tk)之间的相对位姿变换。之后,再借助公式,就可以将存在相对运动的特征点{Lj}全部投影到tk时刻,此时就可以得到一系列点{Lk},并且可以认为系列点{Lk}都是tk时刻同时测量的。以此优化前向传播得到的状态估计,以最小化整个系统的误差。
2、ros::NodeHandle nh; //nh是NodeHandle的一个对象,NodeHandle提供了在ROS中访问参数服务器获取参数的方法。
nh.param<bool>("publish/scan_publish_en",scan_pub_en, true);//从ROS参数服务器中获取名为publish/scan_publish_en的布尔型参数的值,将其存储在变量 scan_pub_en 中。如果参数不存在或者类型不匹配,将使用默认值true
3、ros::Subscriber sub_imu = nh.subscribe(imu_topic, 200000, imu_cbk);
订阅imu_topic的话题;200000是队列大小(queue size),表示ROS节点可以缓存的未处理的消息数量;回调函数imu_cbk;
当订阅一个话题时,ROS会创建一个队列来存储从该话题接收到的消息,直到这些消息被处理。队列大小200000意味着ROS节点可以缓存最多200,000条未处理的消息。如果节点在处理消息的速度上落后于消息发布的速率,队列可以起到缓冲作用,防止消息丢失。
4、参数 dense_pub_en 在 laserMapping.cpp 文件中被显式设置为 false。然而,在 avia.yaml 文件中将其设置为 true。如果在运行ROS节点时使用了 avia.yaml,那么参数服务器上的值会覆盖 laserMapping.cpp 文件中的设置,最终 dense_pub_en 的值将是 true
5、pcl::toROSMsg(*laserCloudWorld, laserCloudmsg);//将 PCL 点云数据格式转换为 ROS 消息格式(sensor_msgs::PointCloud2 laserCloudmsg),以便在 ROS 中进行发布或传输