任务动机:实现Cartographer与Cartographer_ros剥离,剥离后的Cartographer可以在不启动roscore的情况下正常建图,同时可与ROS进行通讯。
任务描述:分步安装验证后,将步骤合并成安装脚本。
11.01 V2.0更新
下载 https://download.csdn.net/download/zhzwang/13084434
参考https://gitee.com/harryzhangabc/cartographer_standalone
1. 全面支持rosbridge(cpp)功能,可以和外部ros进行通讯了。
2. bug全面修复,make all成功。
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j24
然后你会在build文件夹看到所有编译好的二进制文件。
编译状态
- ubuntu18.04
- openeuler 20 等待测试
在经历过无数踩坑以后,发现直接移植cartographer_ros不是一个快速、可靠的办法。虽然官网提示cartogrpher_ros是开发cartographer一个不错的示例。但是在后来的研究中,发现自己写的程序无法完全实现cartographer_ros的全部功能,因为使用cartographer库需要严格的定时器设置、数据缓存池设计(带时间戳)、严格的数据格式,而这些还需要按照一定顺序去调用、实现,非常麻烦和费时。虽然自己写的程序刚好能够建图,但是bug层出无穷(大部分bug是定时器和数据结构不匹配,也和本人功底不够深厚有关)。因此,有没有一个很好的办法,即不用运行在ros上,又能够完美实现所有cartographer_ros的所有功能,并且支持官方更新呢?(google也知道他们的程序有bug所以会经常更新)
1. 实现原理
我们知道,cartographer_ros是cartographer和ros的一个桥梁,cartographer_ros通过ros获得传感器数据,打包起来按照顺序输入cartographer并从cartographer获取相对坐标的变换数据通过cartographer_ros输出到TF变换。如果,此时保持cartographer_ros原封不动,对ros进行改造,使原来的ros变成一个"fake ros",首先把ros"多余"的部分清空,变成空循环,优化程序执行效率,然后再把ros的数据接口、定时器、rosbag等所有重要原始.c文件都打包起来把他们放在一起编译,最后把数据像原来ros的方式"喂"给cartographer_ros并加入ros_bridge,这样既不会丢失输入、输出原始ros的格式,也可以实现所有cartographer_ros的功能,可谓一举两得。
2. 注意事项
截止到写这篇文章时,cartographer/ 和 cartographer_ros/ 并不是当前的最新版本,如果google发布了最新版本,你可以直接clone最新版本并替换掉他们,但是你可能需要在一个安装了最新版本的cartographer_ros、ros的机器里面找到ros_stub/include/cartographer_ros_msgs里面的相同的文件并替换掉他们。
3. 使用说明
以下所有的操作均在ubuntu18.04实现,ubuntu16.04可以实现但是部分库必须从源码编译且有版本要求,比较麻烦
3.1 安装程序
sudo add-apt-repository universe
sudo apt update
sudo apt install git cmake bzip2 libbz2-dev libceres-dev libprotobuf-dev protobuf-compiler libpcl-dev liburdfdom-headers-dev liburdfdom-model liblz4-dev libtinyxml-dev liburdfdom-dev liburdfdom-tools
git clone https://gitee.com/harryzhangabc/cartographer_standalone
./cartographer_standalone/cartographer/scripts/install_debs_cmake.sh
cd cartographer_standalone
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make cartographer_offline_node -j24
3.2 使用离线的方式测试程序
cd cartographer_standalone\build\cartographer_ros\cartographer_ros\cartographer_ros
./cartographer_offline_node \path\to\your\rosbag\
可以看出来,因为cartographer_ros是完整的,所以该程序也支持在不安装ros的情况下直接跑rosbag,运行完后会得到一个.pbstream文件和.pgm地图文件和相关的.yaml文件。
3.3 使用在线的方式测试程序
注意,到这一步,由于代码的特殊性,请把你的激光雷达、IMU等传感器ros驱动文件放到cartographer_standalone文件夹中,并在.cmakelists里面加入有关于你驱动的信息(打开cmakelists有详细的教程),然后,需要通过改动你的驱动文件把你的驱动做成一个C++的库,然后在cartographer_ros\cartographer_ros\cartographer_ros\node_main.cc里面调用你的驱动,只要调用一次打开传感器、注册个回调程序就可以了,注册成功后只要传感器数据一来就自动喂入cartographer进行建图。
然后,编译程序,执行node程序,建完图后直接ctrl+c关闭程序生成一个.pbstream文件和.pgm地图文件和相关的.yaml文件。
cd cartographer_standalone
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make cartographer_node -j24
cd cartographer_standalone\build\cartographer_ros\cartographer_ros\cartographer_ros
./cartographer_node