ROS2 - 小鱼两驱车安装

653 阅读9分钟

【FishBot二驱】配套资料汇总 | 鱼香ROS

小车烧录固件

下载 FishBot 配置工具 : github.com/fishros/fis…

win 系统右键使用管理员身份运行

image.png

  • wifi_ssid: wifi 名
  • wifi_pawd: wifi 密码
  • udpserver_ip: 上位机 IP

image.png

启动 MicroROS 服务

配置完成后我们打开终端,启动MicroROS服务。

docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO udp4 --port 8888 -v6

如因为网络问题无法启动可以尝试国内指令:

docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host registry.cn-hangzhou.aliyuncs.com/fishros/micro-ros-agent:$ROS_DISTRO udp4 --port 8888 -v6

如果还不行,可以使用一键安装协助解决:fishros.org.cn/forum/topic…

接着点击设备选择栏重启设备按钮,或者手动点击RST重启。

正常你将看到终端不断有数据提示,表示正常通信上了

image.png

查看 ros2 node

ros2 node list
ros2 node info/fishbot_motion_control

image.png

使用键盘操作

ros2 run teleop_twist_keyboard teleop_twist_keyboard

image.png

运行 rviz2

打开终端输入rviz2,即可打开rviz2界面,接着完成下面四步。

  • 修改fixedframe为odom
  • 点击ADD
  • 切换到By Topic,选择odom
  • 点击OK按钮

image.png

运行效果 image.png

FishBot雷达转接板介绍

Fishbot雷达转接板主要作用是将雷达的数据通过Wifi网络转发出去,以时间雷达数据的无线传输功能。

FishBot转接板的工作模式有三种

  1. Flash模式,该模式下可以给转接板进行固件的升级和参数配置。

e56b4585-effb-4513-b325-175ee58b0e18-1735114046772.png

  1. Uart有线模式,该模式可以用于直接通过有线方式连接树莓派等主控板。

55416eb1-a0c9-41b1-bcd6-cceff4f1f3bb-1735114094311.png

  1. Wifi无线模式,该模式将雷达数据通过无线方式传给上位机。

e80eb25e-d15e-4905-9ad7-f53db9890f16-1735114175971.png

这三种工作模式可以根据板子上的标记调整跳线帽的位置进行切换。
当你第一次使用的时候需要将板子调节到Flash模式,该模式下我们可以对板子进行配置以及升级。

烧入雷达驱动

image.png

配置参数

这里我们需要修改三个参数。

  • wifi_ssid,当前机器人可以连接到的wifi用户名
  • wifi_pswd,wifi密码
  • server_ip,接收雷达数据的服务器端口地址

验证运行

配置完参数后,关闭小车,并将雷达调整带 wifi 无线模式,重启小车。 在 server_ip 对应的上位机使用 nc 监听,如果收到消息,且小车上显示 running ,则表示运行正常了。

nc -l 8889

Docker 启动雷达服务

在上位机输入下面的指令,使用docker来下载雷达相关的驱动。

国内使用镜像:

xhost + && sudo docker run  -it --rm  -v /dev:/dev -v /dev/shm:/dev/shm --privileged  -v /tmp/.X11-unix:/tmp/.X11-unix --device /dev/snd -e DISPLAY=unix$DISPLAY -p 8889:8888 registry.cn-hangzhou.aliyuncs.com/fishros/fishbot_laser

国外使用镜像:

xhost + && sudo docker run  -it --rm  -v /dev:/dev -v /dev/shm:/dev/shm --privileged  -v /tmp/.X11-unix:/tmp/.X11-unix --device /dev/snd -e DISPLAY=unix$DISPLAY -p 8889:8888 fishros2/fishbot_laser

如果没有驱动成功,请检查是否符合下述现象和问题:

  1. 蓝色LED灯长亮,表示此时在配置模式,请将跳线帽调整至运行模式,LED闪烁表示在运行模式
  2. 出现timout count提示,表示雷达板没有数据发送到的电脑,此时应该检查跳线帽是否在WIFI模式,并确定连接了雷达。

驱动成功后,我们可以打开一个新的终端,输入ros2 topic list,查看是否有scan话题。

ros2 topic list
ros2 topic hz /scan

开启驱动雷达

1) WIFI转串口测试                                      
2) 驱动雷达                                                           
3) 建图测试                                                      
4) 退出                                                           
#? 2                                                           
[INFO] [launch]: All log files can be found below /root/.ros/log/2025-05-24-09-26-58-441616-d23cedb62f8b-241
[INFO] [launch]: Default logging verbosity is set to INFO       
[INFO] [ydlidar_tcp_node-1]: process started with pid [242]      
[ydlidar_tcp_node-1] [INFO] [1748078818.563540749] [ydlidar_node]: 等待激光雷达TCP连接: 0.0.0.0:8888                                         
[ydlidar_tcp_node-1] [INFO] [1748078818.763992368] [ydlidar_node]: 激光雷达已连接: ('192.168.31.69', 63134)                                  
[ydlidar_tcp_node-1] [INFO] [1748078818.804803133] [ydlidar_node]: 雷达X2数据校验正确,开始解析数据 

SLAM 建图

SLAM是同步定位与地图构建(Simultaneous Localization And Mapping)的缩写。SLAM 是通过传感器获取环境信息然后进行定位和建图。在 ROS 2 中,提供了很多的 SLAM 功能包,比如 slam_toolbox,cartographer_ros 和 rtabmap_slam 等。

几个比较关键的技术如下:

  1. 传感器感知 通过各类传感器实现对环境的感知,比如通过激光雷达获取环境的深度信息。同时可以通过传感器融合来提高位置估计的精度,比如融合轮式里程计、IMU、雷达、深度相机数据等。
  2. 视觉/激光里程计 基本原理是通过前后数据之间对比得出机器人位置的变化。
  3. 回环检测 判断机器人是否到达之前到过的位置,可以解决位置估计误差问题,建图时可以纠正地图误差

小鱼两驱车 SLAM 架构

小鱼两驱车 SLAM 架构基于关键技术拆分成小车驱动版,MicroROS, 激光雷达驱动,ROS2 TF 坐标关系, SLAM 建图服务

  1. 小车驱动版负责里程计计算,并通过 Micro ROS 发布 /odom 话题。
  2. MicroROS 在上位机中运行部分,负责接收小车的 /odom 话题数据,并接入到 ROS2 系统。
  3. ROS2 odom2tf node 订阅 /odom 话题,生成 odom 与 base_link 的坐标关系发布到动态 TF
  4. ROS2 TF 基于 urdf 定义通过 robot_state_publisher 发布 base_link, base_footprint, laser_link 静态坐标关系。
  5. 激光雷达驱动负责将雷达数据发布到 ROS2 系统中 /scan 话题。
  6. SLAM 建图服务订阅 /scan 雷达数据和 ROS2 TF 数据中的坐标关系,通过 SLAM 算法生成地图数据,并发布到 /map 话题

Micro ROS Agent

在上位机中 clone MicroROS 的代码仓库,构建 micro_ros_agent 程序。

git clone http://github.com/micro-ROS/micro-ROS-Agent.git -b humble
git clone http://github.com/micro-ROS/micro_ros_msgs.git -b humble
  • 构建 micro-ros-agent
colcon build --packages-select micro_ros_agent --cmake-clean-cache

[ 12%] Performing download step (git clone) for 'xrceagent'       
Cloning into 'xrceagent'...                              
HEAD is now at 57d0862 Release v2.4.2 

如果 clone xrceagent 失败后,一直报下面的错误,可以通过把 build 和 install 目录下的 micro_ros_agent 目录删除后重新 build

Starting >>> micro_ros_agent                                    
--- stderr: micro_ros_agent                                  
gmake[3]: *** No rule to make target 'install'.  Stop.            
gmake[2]: *** [CMakeFiles/xrceagent.dir/build.make:104: agent/src/xrceagent-stamp/xrceagent-install] Error 2                                  
gmake[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/xrceagent.dir/all] Error 2 
gmake: *** [Makefile:91: all] Error 2                                 

在 bringup.launch.py 中定义 microros_agent 的启动配置。关键配置是监听端口,需要与小车驱动版配置的 udpserver_ip 一致。

microros_agent = launch_ros.actions.Node(
        package='micro_ros_agent',
        executable='micro_ros_agent',
        arguments=['udp4','--port','8888'],
        output='screen'
    )

里程计 odom TF 坐标关系

  1. 在 bringup.launch.py 中定义 urdf2tf 启动静态 tf 关系发布。
urdf2tf = launch.actions.IncludeLaunchDescription(
        PythonLaunchDescriptionSource(
            [fishbot_bringup_dir, '/launch', '/urdf2tf.launch.py']),
    )

静态坐标关系: 基于 urdf 定义通过 robot_state_publisher 发布 base_link, base_footprint, laser_link 静态坐标关系。

 robot_state_publisher_node = launch_ros.actions.Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description': robot_description}]
    )

2. 在 bringup.launch.py 中定义 odom2tf 启动生成 odom 与 base_link 的坐标关系发布到动态 TF

odom2tf = launch_ros.actions.Node(
        package='fishbot_bringup',
        executable='odom2tf',
        output='screen'
    )

驱动雷达

有线驱动

将配套的雷达转接板模式调整到UART模式,拔掉EN跳线帽(可以关闭ESP8266,节省能源), 找一根USB线,将 雷达板接入到你要驱动的电脑或者各种PI上。

clone ydlidar_ros2 仓库,该仓库是雷达驱动代码,使用 CYdLidar 从串口读取雷达数据,通过 ros2 把读取到的雷达数据发布到 "/scan" topic ,

mkdir -p ~/fishbot_ws/src
cd ~/fishbot_ws/src
git clone https://github.com/fishros/ydlidar_ros2 -b  v1.0.0/fishbot 

在编译前修改配置文件 ydlidar_ros2/params/ydlidar.yaml 中的参数 port 串口编号,一般是/dev/ttyUSB0。然后编译构建。

cd ydlidar_ros2
colcon build

修改串口权限,使用 ros2 launch 执行 ydlidar_launch.py 启动 ydlidar_node

sudo chmod 666 /dev/ttyUSB0 
source install/setup.bash 
ros2 launch ydlidar ydlidar_launch.py

最后使用ros2 topic list 就可以看到话题list了,scan就是雷达话题

ros2 topic list
---
/parameter_events
/rosout
/scan
/tf_static
/ydlidar_node/transition_event

无线驱动

雷达板烧录固件,这个固件的作用就是将串口转成无线 TCP, 其中配置的 server_ip 则是数据接受端的 IP

clone ros_serial2wifi 仓库,该仓库负责接送雷达固件发送的雷达数据,并生成一个虚拟串口,将雷达数据写入到这个虚拟串口。所以雷达版与 ros_serial2wifi 要求接入同一个 wifi,确保网络连通。

mkdir -p ~/fishbot_ws/src
cd ~/fishbot_ws/src
git clone https://github.com/fishros/ros_serial2wifi.git

修改 ydlidar_ros2 配置文件的端口号到这个虚拟串口,确定雷达连接上,然后启动雷达驱动就可以了。

sudo chmod 666 /dev/ttyUSB0 
source install/setup.bash 
ros2 launch ydlidar ydlidar_launch.py

SLAM 建图服务

在 ROS 2 中,提供了很多的 SLAM 功能包,比如 slam_toolbox,cartographer_ros 和 rtabmap_slam 等。针对二维场景,其中 slam_toolbox 开箱即用,上手较为简单

slam_toolbox

  • 安装 slam_toolbox
sudo apt install ros-$ROS_DISTRO-slam-toolbox
  • 运行异步建图服务
ros2 launch slam_toolbox online_async_launch.py  use_sim_time:=False

cartographer_ros

  • 安装
sudo apt install ros-humble-cartographer

需要注意我们不是直接使用cartographer,而是通过cartographer-ros功能包进行相关操作,所以我们还需要安装下cartographer-ros

sudo apt install ros-humble-cartographer-ros
  • 运行 要完成使用Cartographer进行建图,需要两个节点的参与,
    • /cartographer_node节点: 该节点从/scan和/odom话题接收数据进行计算,输出/submap_list数据. 该节点需要接收一个参数配置文件(第二部分写的那个)参数。

    • /occupancy_grid_node节点: 该节点接收/submap_list子图列表,然后将其拼接成map并发布 该节点需要配置地图分辨率和更新周期两个参数。

所以需要在 launch.py 文件中定义两个 Node 的配置。

cartographer_node = Node(
        package='cartographer_ros',
        executable='cartographer_node',
        name='cartographer_node',
        output='screen',
        parameters=[{'use_sim_time': use_sim_time}],
        arguments=['-configuration_directory', configuration_directory,
                   '-configuration_basename', configuration_basename])

cartographer_occupancy_grid_node = Node(
        package='cartographer_ros',
        executable='cartographer_occupancy_grid_node',
        name='cartographer_occupancy_grid_node',
        output='screen',
        parameters=[{'use_sim_time': use_sim_time}],
        arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec])

在RVIZ2中可视化点云数据

此时打开rviz2,添加LaserScan,并修改fixedframe为laser_frame

image.png

打开 RViz,修改 Fixed Frame 为 map,接着通过 Add/By Topic 添加 /map 话题,也可以添加 TF 和 RobotModel 等你感兴趣的话题进行显示 image.png

保存地图

我们需要使用一个叫做nav2_map_server的工具。

  • 安装nav2_map_server
sudo apt install ros-$ROS_DISTRO-nav2-map-server
  • 保存地图
ros2 run nav2_map_server map_saver_cli --help
  • 可以看到有下面的用法
Usage:
  map_saver_cli [arguments] [--ros-args ROS remapping args]
Arguments:
  -h/--help
  -t <map_topic>
  -f <mapname>
  --occ <threshold_occupied>
  --free <threshold_free>
  --fmt <image_format>
  --mode trinary(default)/scale/raw
NOTE: --ros-args should be passed at the end of command line
  • 我们的地图话题为map,文件名字我们用fishbot_map,所以有下面这个这样写的命令行。
ros2 run nav2_map_server map_saver_cli -t map -f fishbot_map
  • 接着我们就可以得到下面的两个文件
.
├── fishbot_map.pgm
└── fishbot_map.yaml
0 directories, 2 files

这两个文件就是对当前地图保存下来的文件,其中.pgm是地图的数据文件,.yaml后缀的是地图的描述文件。

下面的导航过程中我们将要使用到地图文件进行路径的搜索和规划。

FishBot-Nav2 导航

安装

sudo apt info ros-$ROS_DISTRO-navigation2

为了方便使用 Navigation 2 还提供了启动示例功能包 nav2_bringup,使用下面的指令可以安装该功能包。

sudo apt info ros-$ROS_DISTRO-nav2-bringup

依赖

catkin_pkg==1.0.0
empy==3.3.4
lark==1.2.2

Q:

AttributeError: module 'em' has no attribute 'BUFFERED_OPT' 

A:

pip3 install empy==3.3.4
$ ros2 launch fishbot_navigation2 navigation2.launch.py use_sim_time:=False 
[INFO] [launch]: All log files can be found below /home/liang/.ros/log/2025-07-13-22-10-43-098523-liang-MS-7E16-2604329                                     
[INFO] [launch]: Default logging verbosity is set to INFO 
[INFO] [component_container_isolated-1]: process started with pid [2604356]            
[INFO] [rviz2-2]: process started with pid [2604358]
[component_container_isolated-1] [INFO] [1752415843.810651084] [nav2_container]: Load Library: /opt/ros/humble/lib/libmap_server_core.so 
[component_container_isolated-1] [INFO] [1752415843.822092229] [nav2_container]: Found class: rclcpp_components::NodeFactoryTemplate 
[component_container_isolated-1] [INFO] [1752415843.822127801] [nav2_container]: Found class: rclcpp_components::NodeFactoryTemplate 
[component_container_isolated-1] [INFO] [1752415843.822130801] [nav2_container]: Found class: rclcpp_components::NodeFactoryTemplate 
[component_container_isolated-1] [INFO] [1752415843.822133661] [nav2_container]: Instantiate class: rclcpp_components::NodeFactoryTemplate  
[component_container_isolated-1] [INFO] [1752415843.826729894] [map_server]: