1.ROS Navigation之amcl;
2.源码解析
研究一个ROS包,肯定要先看CMakeLists。我们可以看到,这个包会生成
三个库:
- amcl_pf
- amcl_map
- amcl_sensors
一个节点:
amcl
3.amcl.cpp
3.1其中amcl的订阅与发布:
发布话题:
- amcl_pose: geometry_msgs::PoseWithCovarianceStamped,后验位姿+一个6*6的协方差矩阵(xyz+三个转角)
- particlecloud:geometry_msgs::PoseArray,粒子位姿的数组
- 一个15秒的定时器:AmclNode::checkLaserReceived,检查上一次收到激光雷达数据至今是否超过15秒,如超过则报错。
发布服务:
- global_localization:&AmclNode::globalLocalizationCallback,这里是没有给定初始位姿的情况下在全局范围内初始化粒子位姿,该Callback调用pf_init_model,然后调用AmclNode::uniformPoseGenerator在地图的free点随机生成pf->max_samples个粒子
- request_nomotion_update:&AmclNode::nomotionUpdateCallback没运动模型更新的情况下也暂时更新粒子群
- set_map:&AmclNode::setMapCallback
- dynamic_reconfigure::Server动态参数配置器。
订阅话题:
- scan_topic_:sensor_msgs::LaserScan,AmclNode::laserReceived,这里是tf订阅,转换到odom_frame_id_
- initialpose:AmclNode::initialPoseReceived,这个应该就是订阅rviz中给的初始化位姿,调用AmclNode::handleInitialPoseMessage,只接受global_frame_id_(一般为map)的坐标,并重新生成粒子
- map:AmclNode::mapReceived这个在use_map_topic_的时候才订阅,否则requestMap();我这里也没有订阅,因为只使用了一个固定的地图