A-LOAM
是 LOAM
的高级实现,它使用 Eigen 和 Ceres Solver 来简化代码结构。 此代码由 LOAM
和 LOAM_NOTEA
修改而来。 这段代码简洁明了,没有复杂的数学推导和冗余操作。 对于 SLAM 初学者来说是一本很好的学习资料。
节点示意图:
KITTI Example
dataset_folder
和 sequence_number
参数。kitti_helper.launch
中设置适当的参数来将 KITTI 数据集转换为包文件以便于使用。优点:
建议:
计算曲率时,每一线间的转变未考虑进去,不过不影响,因为提取特征时都跳过了每一线的起始多少个点
基于曲率大小筛选特征时,因为点云已经基于曲率排过序了
找临近后确定 直线和平面时 感觉没lio-sam中精度高
ceres优化,来个手动求导不好吗
// 定义读写对象,并申明
rosbag::Bag i_bag, o_bag;
i_bag.open(src_bag, rosbag::bagmode::Read);
o_bag.open(new_bag, rosbag::bagmode::Write);
// 定义一个数组
std::vector<std::string> topics;
topics.push_back(std::string(imu_topic));
topics.push_back(std::string(pcd_topic));
// 申明 rosbag::View对象
rosbag::View view(i_bag, rosbag::TopicQuery(topics));
///< 读取方法一:
for (auto m : view) { // 遍历view
sensor_msgs::Imu::ConstPtr imu = m.instantiate<sensor_msgs::Imu>();
if (imu == nullptr) { // 是否有imu
std::cerr << "imu null " << std::endl;
} else {
std::cout << "imu stamp:" << imu->header.stamp << std::endl;
o_bag.write(imu_topic, imu->header.stamp, imu);
}
sensor_msgs::PointCloud2::ConstPtr pcd =
m.instantiate<sensor_msgs::PointCloud2>();
if (pcd == nullptr) {
std::cerr << "pcd null " << std::endl;
} else {
std::cout << "pcd stamp:" << pcd->header.stamp << std::endl;
o_bag.write(pcd2_topic, pcd->header.stamp, pcd);
}
}
///< 读取方法二:
rosbag::View view(bag);
for (const rosbag::ConnectionInfo* c : view.getConnections()) {
const std::string& topic = c->topic;
if (topic_to_publisher.count(topic) == 0) {
ros::AdvertiseOptions options(c->topic, kQueueSize, c->md5sum,
c->datatype, c->msg_def);
topic_to_publisher[topic] = node_handle.advertise(options);
}
}
主函数:
scanRegistration
scan_line
、minimum_range
/velodyne_points
laserCloudHandlersensor_msgs::PointCloud2>("/velodyne_cloud_2", 100);
sensor_msgs::PointCloud2>("/laser_cloud_sharp", 100);
sensor_msgs::PointCloud2>("/laser_cloud_less_sharp", 100);
sensor_msgs::PointCloud2>("/laser_cloud_flat", 100);
sensor_msgs::PointCloud2>("/laser_cloud_less_flat", 100);
sensor_msgs::PointCloud2>("/laser_remove_points", 100);
N_SCANS
,对于每一线,将点云均分成6份:
std::sort
函数cornerPointsSharp
点云标记:2cornerPointsLessSharp
点云标记:1surfPointsFlat
点云标记:-1surfPointsLessFlatScan
主函数:
laserOdometry
mapping_skip_frame
默认2/velodyne_cloud_2
laserCloudFullResHandler
velodyne_cloud_3
laser_odom_to_init
laser_odom_path
pointSearchInd
pointSearchInd
q_w_curr
和 t_w_curr
主函数:
laserMapping
mapping_line_resolution
0.4mapping_plane_resolution
0.8/laser_cloud_corner_last
laserCloudCornerLastHandler/laser_cloud_surf_last
laserCloudSurfLastHandler/laser_odom_to_init
laserOdometryHandler/velodyne_cloud_3
laserCloudFullResHandlerwhile 1循环,2s执行一次
cornerLastBuf.front()
数据早时,pop