Skip to content

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 机器人的基本使用操作;

  1. 通过控制器界面使能机器人底盘上电,确保机器人通过手柄能够实现基本的移动;
  2. 导航包的使用涉及到X11转发可视化界面,推荐使用 MobaXterm

三、环境准备

  1. 每台机器人出厂都会配置好激光雷达(MID360)的SDK和ROS2驱动,请先确保雷达的驱动正常,执行下面的命令完成雷达的启动:
cd /home/spirit-ai/livox_ws
source install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py

启动成功后,能看到终端有如下信息说明启动成功:

  1. 解压导航包 nav_stack.tarhome/spirit-ai 目录,然后进入目录:
tar -xvf nav_stack.tar
cd nav_stack
  1. 导航包的运行环境为 docker,已保存为离线包放在 nav_stackdocker_images 目录下:
cd docker_images
docker load -i nav.tar
  1. 环境准备好后,就可以开始使用基本的导航功能了,在 nav_stack 目录下,有四个脚本:
    1. run_mapping.sh:启动建图脚本,执行激光SLAM,用于获取环境的离线地图;
    2. run_save_map.sh:启动建图脚本后,执行该脚本保存离线地图用于导航;
    3. run_nav.sh:启动导航功能,启动该脚本的前提是已经建图完成;
    4. stop_all.sh:用于关闭建图或导航功能;

四、开始使用:

  1. 开始建图:建图前,确保激光雷达(Livox-MID360)已经启动,然后打开一个终端,在 nav_stack 目录下,执行:
./run_mapping.sh

脚本启动后,会弹出 rviz 的可视化窗口,如下图显示:

确认建图功能正常后,在需要导航的区域内通过控制器遥控机器人运动完成建图(如果是手柄控制机器人运动,需要底盘上电,不打开随动功能),建图过程中,尽量避免环境中行人走动造成地图中有杂乱的点。地图中杂乱的点在导航地图中可能被认为是障碍物形成鬼影。

TIPS:如果无法避免地图中杂乱的点,可通过meshlab(处理ply点云文件)或cloudcompare(处理pcd点云文件)对点云进行修剪,导航包内的重定位算法支持对ply和pcd的处理,有导航经验的用户可以修改navigation2中的导航参数修改地图刷新的方式。

  1. 保存地图:从 rviz 可视化中确认好要建图的内容,打开一个新终端,执行脚本保存地图:
./run_save_map.sh

如果地图保存成功,会有如下提示:

  1. 关闭建图功能:完成建图任务和地图保存后,打开一个新终端,执行下面的脚本关闭建图功能:
./stop_all.sh
  1. 开始导航:到目前为止,你已经完成了导航所需要的地图,现在可以开始导航了,打开一个新终端,执行下面的脚本启动导航功能:
./run_nav.sh

等待整个导航功能初始化完成后,导航功能会弹出可视化界面,你会看到下面的窗口:

设置控制器:现在请打开控制器的随动开关,开启随动后,机器人底盘才会执行导航算法发出的控制指令,如果不开启,机器人不会执行导航算法的指令。同时,请修改控制器的参数设置,当前的导航算法是按照速度和加速度100%调试的,默认情况下,速度和加速度为10%,为了安全起见,第一次使用可以设置为50%,确认无误后,再进一步提高速度和加速度。

通过 rviz 界面完成导航:鼠标左键点击 Nav2 Goal 按钮,在地图中的某个可通行区域,鼠标左键点击某个点不要松开,移动鼠标给出机器人的目标朝向

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

到目前为止,你应该可以通过可视化界面完成机器人的导航功能了,多给几个目标点试试看吧。

五、进阶教程(二次开发用户)

  1. 通过ros service指定点位让机器人完成导航,到达指定点位:
    1. 当前导航包使用的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 #永久切换
    1. 由于该ros service包含自定义类型,请拷贝下面的包到你的工作空间下完成编译,接口调用可参考包内的示例代码 scripts/example.py:navigation_interfaces.tar
    2. 该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)

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