Moz1-自主建图导航系统
一、简介
本文档用于说明千寻机器人底盘导航包的使用及部署方法,通过本文档,你可以实现机器人的移动和建图功能,包括在可视化界面(rviz)上选点让机器人移动到点位,或通过ros service的方式让机器人移动到指定点位。
导航包的整体架构如下图所示,激光雷达MID360负责输出激光雷达和IMU数据,通过Lidar SLAM完成定位建图的功能,重定位模块负责计算机器人在离线地图中的位置,将转换过后的地图和位姿数据发送给导航算法,最终由导航算法发出控制指令到控制器实现机器人底盘的移动。

导航包目录层级:
├── docker_image # 放置docker镜像的目录
│ └── nav.tar # docker镜像
├── run_mapping.sh # 启动建图脚本
├── run_nav.sh # 启动导航脚本
├── run_save_map.sh # 保存点云地图脚本
├── stop_all.sh # 关闭导航或建图脚本
├── test_pkg/ # 测试功能包目录
├── record_pose.sh # 导航点记录脚本
├── run_circle.sh # 循环导航测试脚本
└── single_pose.py # 单点跟踪文件
└── workspace # ros工作空间二、准备工作
在开始使用本项功能前,请确保您已经阅读了用户手册,掌握 Moz1 机器人的基本使用操作;
- 通过控制器界面使能机器人底盘上电,确保机器人通过手柄能够实现基本的移动;
- 导航包的使用涉及到X11转发可视化界面,推荐使用 MobaXterm;
三、环境准备
- 每台机器人出厂都会配置好激光雷达(MID360)的SDK和ROS2驱动,请先确保雷达的驱动正常,执行下面的命令完成雷达的启动:
cd /home/spirit-ai/livox_ws
source install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py启动成功后,能看到终端有如下信息说明启动成功:

- 解压导航包
nav_stack.tar到home/spirit-ai目录,然后进入目录:
tar -xvf nav_stack.tar
cd nav_stack- 导航包的运行环境为
docker,已保存为离线包放在nav_stack的docker_images目录下:
cd docker_images
docker load -i nav.tar- 环境准备好后,就可以开始使用基本的导航功能了,在
nav_stack目录下,有四个脚本:run_mapping.sh:启动建图脚本,执行激光SLAM,用于获取环境的离线地图;run_save_map.sh:启动建图脚本后,执行该脚本保存离线地图用于导航;run_nav.sh:启动导航功能,启动该脚本的前提是已经建图完成;stop_all.sh:用于关闭建图或导航功能;
四、开始使用:
- 开始建图:建图前,确保激光雷达(Livox-MID360)已经启动,然后打开一个终端,在
nav_stack目录下,执行:
./run_mapping.sh脚本启动后,会弹出 rviz 的可视化窗口,如下图显示:

确认建图功能正常后,在需要导航的区域内通过控制器遥控机器人运动完成建图(如果是手柄控制机器人运动,需要底盘上电,不打开随动功能),建图过程中,尽量避免环境中行人走动造成地图中有杂乱的点。地图中杂乱的点在导航地图中可能被认为是障碍物形成鬼影。
TIPS:如果无法避免地图中杂乱的点,可通过meshlab(处理ply点云文件)或cloudcompare(处理pcd点云文件)对点云进行修剪,导航包内的重定位算法支持对ply和pcd的处理,有导航经验的用户可以修改navigation2中的导航参数修改地图刷新的方式。
- 保存地图:从
rviz可视化中确认好要建图的内容,打开一个新终端,执行脚本保存地图:
./run_save_map.sh如果地图保存成功,会有如下提示:

- 关闭建图功能:完成建图任务和地图保存后,打开一个新终端,执行下面的脚本关闭建图功能:
./stop_all.sh- 开始导航:到目前为止,你已经完成了导航所需要的地图,现在可以开始导航了,打开一个新终端,执行下面的脚本启动导航功能:
./run_nav.sh等待整个导航功能初始化完成后,导航功能会弹出可视化界面,你会看到下面的窗口:

设置控制器:现在请打开控制器的随动开关,开启随动后,机器人底盘才会执行导航算法发出的控制指令,如果不开启,机器人不会执行导航算法的指令。同时,请修改控制器的参数设置,当前的导航算法是按照速度和加速度100%调试的,默认情况下,速度和加速度为10%,为了安全起见,第一次使用可以设置为50%,确认无误后,再进一步提高速度和加速度。
通过 rviz 界面完成导航:鼠标左键点击 Nav2 Goal 按钮,在地图中的某个可通行区域,鼠标左键点击某个点不要松开,移动鼠标给出机器人的目标朝向

给出目标点位后,在地图上会规划出一条轨迹,如下图所示,规划成功后,机器人应该会自主移动到该目标点位:

到目前为止,你应该可以通过可视化界面完成机器人的导航功能了,多给几个目标点试试看吧。
五、进阶教程(二次开发用户)
- 通过ros service指定点位让机器人完成导航,到达指定点位:
- 当前导航包使用的ros中间件为cyclone_dds,若使用service的方式调用导航接口,请切换中间件为cyclone_dds,可通过如下步骤切换:
apt update apt install ros-humble-rmw-cyclonedds-cpp export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp #临时切换 echo 'export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp' >> ~/.bashrc source ~/.bashrc #永久切换- 由于该ros service包含自定义类型,请拷贝下面的包到你的工作空间下完成编译,接口调用可参考包内的示例代码 scripts/example.py:navigation_interfaces.tar
- 该ros service可以接收机器人的位姿序列,当位姿序列的个数为一个,机器人会直接导航到这个点位,当位姿序列的个数大于一个,规划的路径会以中间点为约束点,然后导航到最后一个点。需要注意的是,这里的点位是机器人在地图中的全局位姿(完成重定位后的六自由度位姿),坐标变换为机器人底盘中心到离线地图世界坐标系的旋转和平移,重新打开一个终端,可通过以下命令查看TF树获取:
ros2 run tf2_ros tf2_echo moz1/map moz1/base_link
如果导航功能正常,可以看到当前的位姿状态,将该位姿记录下来作为点位使用,其中 Translation 为机器人底盘 moz1/base_link 系到离线地图 moz1/map 系的平移 (x,y,z) ,单位为米,Quaternion 为旋转的四元数 (x,y,z,w)

- 如果用户需要适配自己的导航算法框架,请关注
workspace目录下的control_bridge包,里面会对navigation2中发出的/cmd_vel消息做转换及坐标系修正,以适配底盘的坐标系和话题。

