小车烧录固件
下载 FishBot 配置工具 : github.com/fishros/fis…
win 系统右键使用管理员身份运行
- wifi_ssid: wifi 名
- wifi_pawd: wifi 密码
- udpserver_ip: 上位机 IP
启动 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重启。
正常你将看到终端不断有数据提示,表示正常通信上了
查看 ros2 node
ros2 node list
ros2 node info/fishbot_motion_control
使用键盘操作
ros2 run teleop_twist_keyboard teleop_twist_keyboard
运行 rviz2
打开终端输入rviz2,即可打开rviz2界面,接着完成下面四步。
- 修改fixedframe为odom
- 点击ADD
- 切换到By Topic,选择odom
- 点击OK按钮
运行效果
FishBot雷达转接板介绍
Fishbot雷达转接板主要作用是将雷达的数据通过Wifi网络转发出去,以时间雷达数据的无线传输功能。
FishBot转接板的工作模式有三种
- Flash模式,该模式下可以给转接板进行固件的升级和参数配置。
- Uart有线模式,该模式可以用于直接通过有线方式连接树莓派等主控板。
- Wifi无线模式,该模式将雷达数据通过无线方式传给上位机。
这三种工作模式可以根据板子上的标记调整跳线帽的位置进行切换。
当你第一次使用的时候需要将板子调节到Flash模式,该模式下我们可以对板子进行配置以及升级。
烧入雷达驱动
配置参数
这里我们需要修改三个参数。
- 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
如果没有驱动成功,请检查是否符合下述现象和问题:
- 蓝色LED灯长亮,表示此时在配置模式,请将跳线帽调整至运行模式,LED闪烁表示在运行模式
- 出现
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 等。
几个比较关键的技术如下:
- 传感器感知 通过各类传感器实现对环境的感知,比如通过激光雷达获取环境的深度信息。同时可以通过传感器融合来提高位置估计的精度,比如融合轮式里程计、IMU、雷达、深度相机数据等。
- 视觉/激光里程计 基本原理是通过前后数据之间对比得出机器人位置的变化。
- 回环检测 判断机器人是否到达之前到过的位置,可以解决位置估计误差问题,建图时可以纠正地图误差
小鱼两驱车 SLAM 架构
小鱼两驱车 SLAM 架构基于关键技术拆分成小车驱动版,MicroROS, 激光雷达驱动,ROS2 TF 坐标关系, SLAM 建图服务
- 小车驱动版负责里程计计算,并通过 Micro ROS 发布 /odom 话题。
- MicroROS 在上位机中运行部分,负责接收小车的 /odom 话题数据,并接入到 ROS2 系统。
- ROS2 odom2tf node 订阅 /odom 话题,生成 odom 与 base_link 的坐标关系发布到动态 TF
- ROS2 TF 基于 urdf 定义通过 robot_state_publisher 发布 base_link, base_footprint, laser_link 静态坐标关系。
- 激光雷达驱动负责将雷达数据发布到 ROS2 系统中 /scan 话题。
- 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 坐标关系
- 在 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
打开 RViz,修改 Fixed Frame 为 map,接着通过 Add/By Topic 添加 /map 话题,也可以添加 TF 和 RobotModel 等你感兴趣的话题进行显示
保存地图
我们需要使用一个叫做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]: