作者: | 来源:互联网 | 2024-10-19 22:13
cartographer的doc中给出了这个图。 现在我还没看过源码,所以只能猜测一些内容。 待看完源码后,再详细介绍这个图。
直观地说,左侧的是输入的数据,包括测距数据、码盘里程计和IMU数据。左下方的固定的姿态应该是作为整个sparse pose的锚点。
pose extrapolator的输入包括:里程计姿态、imu估计的姿态和扫描匹配输出的姿态。既然有三种关于姿态的信息(实际中可以配置,如没有IMU),那么可以通过滤波方法获得更准确的位姿估计。这里我的感觉还应该有其他的功能,如作为扫描匹配的初值。 这里的一个问题是:scan-matching是采用哪种方式?图中就有距离数据和位姿进入scan matching,感觉少一部分内容。
扫描匹配的姿态传递给运动滤波蒸馏(位姿变化或时间变化),也就是如果机器人一直静止不动的话,新来的数据是没有太大意义的,所以把这些数据扔掉。
如果运动了或者经过了一段时间,则把姿态和滤波后的激光数据加入到sub map中。 并插入结果(时间、姿态、数据和submaps)
然后传递给后端线程,创建位姿图。这里包括回环检测。
大体上从这个图中,若没有看过源码,很多细节还是不清楚。
由于我的下一步工作是做相关内容,所以我将重点关注: 采用里程计和2D激光雷达传感器,构建栅格地图。所以在后续的文章中,主要分析与之相关的源码内容。
这里我的问题: 1 扫描匹配采用何种方式?scan-scan,scan-map,map-map? 2 位姿图是如何构建的? 3 如何进行的回环检测? 4 里程计和扫描匹配的姿态融合采用何种方法? 5 …
cartographer 用到的库:
Boost:准标准的C++库。
Eigen3: 准标准的线性代数库。
Lua:非常轻量的脚本语言,主要用来做Configuration
Ceres:这是Google开源的做非线性优化的库,仅依赖于Lapack和Blas
Protobuf:这是Google开源的很流行的跨平台通信库
cartographer.xml cartographer 1.0.0 Cartographer is a system that provides real-time simultaneous localization and mapping (SLAM) in 2D and 3D across multiple platforms and sensor configurations. The Cartographer Authors Apache 2.0
https://github.com/googlecartographer/cartographer
The Cartographer Authors
catkin
g+±static google-mock python-sphinx
boost ceres-solver eigen libcairo2-dev libgflags-dev libgoogle-glog-dev lua5.2-dev protobuf-dev
cmake
cartographer_ros的xml cartographer_ros 1.0.0 Cartographer is a system that provides real-time simultaneous localization and mapping (SLAM) in 2D and 3D across multiple platforms and sensor configurations. This package provides Cartographer’s ROS integration. The Cartographer Authors Apache 2.0
https://github.com/googlecartographer/cartographer_ros
The Cartographer Authors
catkin
google-mock g+±static protobuf-dev python-sphinx
cartographer cartographer_ros_msgs eigen_conversions geometry_msgs libgflags-dev libgoogle-glog-dev libpcl-all-dev message_runtime nav_msgs pcl_conversions robot_state_publisher rosbag roscpp roslaunch roslib sensor_msgs std_msgs tf2 tf2_eigen tf2_ros urdf visualization_msgs