马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在 Ubuntu 20.04 + ROS Noetic 上手 Google Cartographer
Cartographer 是 Google 出的 SLAM 库,2D/3D 建图、在线建图与纯定位都支持,ROS 生态里用得极广。这篇走一遍在 Ubuntu 20.04 + ROS Noetic 下的完整链路:装依赖 → 编 Ceres/Protobuf/Abseil → 编 Cartographer → 用官方 bag 建图 → 存图 → 纯定位。全是实测能跑的路径和版本。
一、安装依赖
Cartographer 编译要一批 C++ 库。Eigen 在 Ubuntu 20.04 里默认就是 3.3.7,不用装(/usr/include/eigen3)。其余分开装,比一次性全塞进 apt 稳:
sudo apt update
sudo apt install -y \
automake google-mock libatlas-base-dev libboost-all-dev libeigen3-dev \
libgflags-dev libgmock-dev libgoogle-glog-dev liblapack-dev liblua5.2-dev \
libpcl-dev libprotobuf-dev libsuitesparse-dev libwebp-dev ninja-build \
pcl-tools protobuf-compiler python3-sphinx ros-noetic-tf2-eigen stow
另外 rosdep init 这一步在国内经常卡死(GitHub raw 访问不到),如果之前没跑过,可以用国内镜像源的 sources.list 替换方案,或者接受这一步超时后手动跳过——Cartographer 编译本身不依赖 rosdep 跑完。
二、编译依赖库(版本必须卡死)
三个库的版本是这套环境的坑点,版本不匹配会编到一半报奇怪的模板错误。按下面的版本来。
2.1 Ceres 2.0.0(匹配 Eigen 3.3.7)
git clone https://github.com/ceres-solver/ceres-solver.git
cd ceres-solver/
git checkout 0ffb6db49cec52566f53ab66be7a19970ddc562b # 回退到 2.0.0
mkdir build && cd build/
cmake ..
make -j8
sudo make install
2.2 Protobuf 3.21.1(要求 >= 3.0.0)
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf/
git checkout e73ed1630fdec85d7fb513c166629ed49cd4eb18 # 回退到 3.21.1
./autogen.sh
./configure
make -j8
sudo make install
sudo ldconfig
别忘了 sudo ldconfig,不然系统找不到新装的 libprotobuff。
2.3 Abseil
git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp/
git checkout 215105818dfde3174fe799600bb0f3cae233d0bf
mkdir build && cd build/
cmake -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl ..
ninja
sudo ninja install
cd /usr/local/stow
sudo stow absl
用 stow 把 absl 装进 /usr/local/stow 再软链到 /usr/local,是这套文档里很规整的做法,多个库不会互相污染。
2.4 编译 Cartographer 本体
mkdir cartographer && cd cartographer/
mkdir src && cd src/
git clone https://github.com/cartographer-project/cartographer.git
git clone https://github.com/cartographer-project/cartographer_ros.git
cd ..
catkin_make_isolated
# 或者带 install 与 ninja:
# catkin_make_isolated --install --use-ninja
编完记得把环境 source 进去,每个新开的终端都要:
source ~/cartographer/devel_isolated/setup.bash
三、用官方 bag 建图
先下载官方 2D 示例数据包(博物馆场景,约 300 MB):
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
建图:
roslaunch cartographer_ros demo_backpack_2d.launch \
bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag
RViz 里能看到点云/栅格慢慢铺出来就对了。手柄数据流结束后,把轨迹存下来:
rosservice call /finish_trajectory 0
rosservice call /write_state "filename:'/你的路径/cartographer.pbstream'"
把 pbstream 转成常用地图格式(.pgm + .yaml):
rosrun cartographer_ros cartographer_pbstream_to_ros_map \
-map_filestem=/你的路径/map \
-pbstream_filename=/你的路径/cartographer.pbstream \
-resolution=0.05
成功后同目录下会有 .pbstream、.pgm、.yaml 三个文件。-resolution 是栅格分辨率(米/格),0.05 是官方文档常用值。
四、纯定位(只定位不更新地图)
roslaunch cartographer_ros demo_backpack_2d_localization.launch \
load_state_filename:=/你的路径/cartographer.pbstream \
bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag
注意:Cartographer 默认是「建图 + 定位」同步进行,跑完一遍地图会被悄悄改写。想做真正的纯定位,需要改 demo_backpack_2d_localization.launch:
- 删掉
cartographer_occupancy_grid_node 节点这一块
- 加上
map_server 节点来提供静态地图
这样地图固定不动,只做位姿估计。自建的 launch 建议改名(比如 my_localization.launch),别直接改官方文件,升级对不上的时候还能对比。
五、用自己的雷达 + IMU 建图
官方 bag 只是验证链路,真实项目要改成自己的传感器。要改两类文件:
- launch 文件:指向自己雷达/IMU 实际发布的 topic 和对应的 frame_id(典型如
/scan、laser、base_link)。
- lua 配置文件:填传感器参数(雷达是不是 360°、最小/最大距离、IMU 的角速度和加速度噪声、机器人在车体上的安装位姿
translation / rotation)。
建议先从官方 2D 示例抄一份 lua 再逐项改,别从零写。3D 场景则要换成 trajectory_builder_3d 段,并配 IMU 的 imu_gravity_time_constant 之类参数。
六、排错清单
fatal error: Eigen/Core: No such file → sudo apt install libeigen3-dev,并确认 /usr/include/eigen3/Eigen/Core 存在。
undefined reference to ceres:: → Ceres 编完没 make install,或者版本被后来的覆盖了。
protobuf 版本冲突 → Ubuntu 系统自带 protobuf 3.6,自己编的 3.21 装上后要 ldconfig;编译 Cartographer 时有时需要 -DPROTOBUF_VERSION=3.21.1。
catkin_make_isolated: command not found → 没 source ROS 环境,先 source /opt/ros/noetic/setup.bash。
Error: error loading library → 库路径没进 ld 缓存,sudo ldconfig。
小结
整条链路的重心在版本对齐:Eigen 3.3.7(系统自带)+ Ceres 2.0.0 + Protobuf 3.21.1 + Abseil(commit 版本写死),三者对上 Cartographer 就能顺利 catkin_make_isolated。建图走官方 bag 验链路,/write_state 存 pbstream 再 pbstream_to_ros_map 出图;纯定位改 launch,砍掉 occupancy_grid 加 map_server。真实项目改造时,改 launch 里的 topic/frame_id、改 lua 里的传感器参数,这两处是全部工作量所在。
qidao123.com企服评测-应用市场 编辑提示 |