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输出:

Logo

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

更多推荐