ROS2 cartographer仿真建图步骤 (ubuntu20.04+Foxy)
ROS2 Foxy版本的两轮差速机器人仿真环境搭建与建图配置流程。主要内容包括:1)安装ROS2 Foxy及配套Gazebo仿真工具;2)配置差速机器人功能包和键盘控制节点;3)通过源码编译方式安装Cartographer建图工具;4)修改配置文件解决常见错误;5)启动仿真环境和建图节点进行实时建图。文中详细记录了安装过程中可能遇到的问题及解决方法,包括Cartographer编译报错、Gazeb
1. 一句话安装,根据推荐信息安装foxy版本
wget http://fishros.com/install -O fishros && . fishros
输入ros2有输出即完成安装:

2. 安装兼容foxy的仿真工具gazebo(不能按照鱼香ros教程,因为ros版本不一样):
sudo apt update
sudo apt install gazebo11 libgazebo11-dev
sudo apt install ros-foxy-gazebo-ros-pkgs
验证安装,启动gazebo:

安装两轮差速机器人的功能包和键盘控制节点,用于仿真:
# 安装差速驱动相关的 ROS 2 包
sudo apt install ros-foxy-diff-drive-controller
sudo apt install ros-foxy-ros2-control
sudo apt install ros-foxy-ros2-controllers
# 安装导航相关的包(常用于差速机器人)
sudo apt install ros-foxy-navigation2
sudo apt install ros-foxy-nav2-bringup
# 安装用于模拟的包
sudo apt install ros-foxy-gazebo-ros2-control
sudo apt install ros-foxy-teleop-twist-keyboard # 键盘控制包
sudo apt install ros-foxy-teleop-twist-joy # 手柄控制包(不需要装)
# 安装两轮差速功能包
sudo apt install ros-foxy-gazebo-*
# 运行demo显示小车模型
gazebo /opt/ros/foxy/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world
新开一个终端运行下面的命令,可以看到小车在往前开:
ros2 topic pub /demo/cmd_demo geometry_msgs/msg/Twist "{linear: {x: 0.2,y: 0,z: 0},angular: {x: 0,y: 0,z: 0}}"

3. 接下来可以看这些教程【ROS2机器人入门到实战】_ros2机器人编程实战 pdf-CSDN博客:

这个网址是配置好的整个工作环境:fishros/fishbot: 动手学ROS2第二阶段课程源码|机器人建模仿真fishbot,下载代码后直接在工作目录fishbot运行:
colcon build
source install/setup.bash
ros2 launch fishbot_description gazebo.launch.py
教程包括小车和环境的搭建,imu激光雷达等插件的使用。仿真效果如下:

4. 安装cartographer
不要用教程中的apt安装!就算命令改成foxy版本最后会出现cartographer_ros没有GridNode的错误。要下载源码编译。
(1)将源码安装至原有工作环境fishbot/src下。Git下载路径一定要是下面这两个,其他路径下的包都不兼容foxy。
git clone https://github.com/ros2/cartographer.git -b foxy
git clone https://github.com/ros2/cartographer_ros.git -b dashing
(2)安装rosdep:教程中的一键安装4个源都装不了,要用以下命令:
sudo pip3 install rosdepc
sudo rosdepc init
rosdepc update
在fishbot下运行:
rosdepc install -r --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y
会自动下载需要的依赖项,下载不了的会打印出来,扔给AI生成下载命令就行。
安装完所有依赖后(即rosdepc install -r --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y 命令没有打印出问题),在工作环境路径运行编译cartographer命令:
colcon build --packages-up-to cartographer_ros
若出现关于undefined reference to `testing::Test::Test()` 报错,解决如下:
在 fishbot/src/cartographer/CMakeLists.txt 的测试代码部分前插入条件判断,以跳过测试编译:
cmake
# 在 CMakeLists.txt 开头附近添加测试开关option(BUILD_TESTS "Build Cartographer tests" ON) # 新增此行
# ...
# 在测试代码前添加条件判断if(BUILD_TESTS)
set(TEST_LIB
cartographer_test_library
)
add_library(${TEST_LIB} ${TEST_LIBRARY_HDRS} ${TEST_LIBRARY_SRCS})
# ... 原有测试代码
foreach(ABS_FIL ${ALL_TESTS})
google_test("${TEST_TARGET_NAME}" ${ABS_FIL})
# ... 原有链接代码
endforeach()endif() # 结束条件判断


然后# 清理残留
rm -rf build/ install/ log/
# 使用新增的开关禁用测试
colcon build --packages-select cartographer \
--cmake-args -DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF \
-DCMAKE_EXE_LINKER_FLAGS="-lpthread"
能成功编译cartographer了。接下来只需 source 环境并继续编译 cartographer_ros:
cd ~/ros_workspaces/fishbot
source install/setup.bash
colcon build --packages-up-to cartographer_ros
编译结束验证:
source install/setup.bash
ros2 pkg list | grep cartographer
出现两个包的结果即可:

5. 配置建图(【ROS2机器人入门到实战】配置Fishbot进行建图-CSDN博客)
根据教程,下载的资源文件中的内容都已配好,只需在fishbot/src目录运行编译命令:
colcon build --packages-select fishbot_cartographer
开启仿真环境:
source install/setup.bash
ros2 launch fishbot_description gazebo.launch.py
如果遇到gazebo打不开:

运行pkill -f gazebo 杀死残留进程,再启动即可。
如果要关闭gazebo,先关闭窗口,再在命令行Ctrl+C,不然会残留进程。
就算成功开启了gazebo,如果命令行有红色报错不能直接进下一步,一定要贴给AI及时解决,不然会出错建不了图。
启动建图:
source install/setup.bash
ros2 launch fishbot_cartographer cartographer.launch.py
报错:

原因是cartographer_occupancy_grid_node 可执行文件未在安装目录中找到。
查看安装目录fishbot/install/cartographer_ros/lib/cartographer_ros/,发现存在occupancy_grid_node可执行文件,

因为和教程用的cartographer版本不同,生成的可执行文件命名不同,要修改cartographer.launch.py,第40行的cartographer_occupancy_grid_node改为occupancy_grid_node,保存重新运行。

这一步还可能遇到数据来源时间不同步的错误,导致无法开启rivz,需要改配置文件,若出错可以把我改好内容的换上去,以下是两个配置文件内容:
修改后的fishbot/src/fishbot_cartographer/config/fishbot_2d.lua文件内容:
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
-- base_link改为base_footprint
tracking_frame = "base_footprint",
-- base_link改为odom,发布map到odom之间的位姿态
published_frame = "odom",
odom_frame = "odom",
-- true改为false,不用提供里程计数据
provide_odom_frame = false,
-- false改为true,仅发布2D位资
publish_frame_projected_to_2d = true,
-- false改为true,使用里程计数据
use_odometry = true,
use_nav_sat = false,
use_landmarks = false,
-- 0改为1,使用一个雷达
num_laser_scans = 1,
-- 1改为0,不使用多波雷达
num_multi_echo_laser_scans = 0,
-- 10改为1,1/1=1等于不分割
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0,
lookup_transform_timeout_sec = 1,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1.,
landmarks_sampling_ratio = 1.,
}
-- false改为true,启动2D SLAM
MAP_BUILDER.use_trajectory_builder_2d = true
-- 0改成0.10,比机器人半径小的都忽略
TRAJECTORY_BUILDER_2D.min_range = 0.10
-- 30改成3.5,限制在雷达最大扫描范围内,越小一般越精确些
TRAJECTORY_BUILDER_2D.max_range = 3.5
-- 5改成3,传感器数据超出有效范围最大值
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3.
-- true改成false,不使用IMU数据,大家可以开启,然后对比下效果
TRAJECTORY_BUILDER_2D.use_imu_data = false
-- false改成true,使用实时回环检测来进行前端的扫描匹配
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
-- 1.0改成0.1,提高对运动的敏感度
TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1)
-- 0.55改成0.65,Fast csm的最低分数,高于此分数才进行优化。
POSE_GRAPH.constraint_builder.min_score = 0.65
--0.6改成0.7,全局定位最小分数,低于此分数则认为目前全局定位不准确
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7
-- 设置0可关闭全局SLAM
-- POSE_GRAPH.optimize_every_n_nodes = 10
return options
fishbot/src/fishbot_description/world/fishbot.world中72-76行的修改:

改完保存,重新编译运行。若成功可看到rivz建图界面:

接下来开启一个新终端,运行键盘控制指令:
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args --remap cmd_vel:=/cmd_vel
就可以控制小车往特定方向移动,实时建图了。

6. 其他问题解决
实际复现大概率会遇到其他错误,需要排查问题出在哪。ROS2实用排查问题命令如下:
列出所有正在运行的节点:
ros2 node list
打印节点的详细状态信息:
ros2 node info -v /node_name
列出所有正在发布或订阅的话题:
ros2 topic list
打印某个话题上的消息:
ros2 topic echo /topic_name
查看当前ROS时间:
ros2 time
查看TF树:
sudo apt install ros-foxy-tf2-tools
cd /tmp
ros2 run tf2_tools view_frames.py
evince frames.pdf
开启gazebo后正确的TF树应该长这样:

正确的node和topic输出:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)