使用 myAGV Jetson Nano 的高效 RTAB-Map SLAM

本文介绍了在 myAGV Jetson Nano 平台上使用 RTAB-Map SLAM,通过多机通信优化性能。

本项目使用的物品:
硬件组件 

         Elephant Robotics myAGV 2023 Jetson Nano      

         NVIDIA Jetson Nano 开发者套件

         Raspberry Pi 3 B 型

软件应用程序和在线服务

         ROS 机器人操作系统

引言

在现代机器人技术中,高精度的环境感知和地图构建对于实现自主导航至关重要。本文演示了如何使用 配备 Jetson Nano B01 板卡的 myAGV Jetson Nano 移动平台,结合 RTAB-Map 和 3D 摄像头,实现更详细的三维环境映射。myAGV Jetson Nano 支持 SLAM(同步定位和地图构建)雷达导航,Jetson Nano 提供强大的计算能力,使其适合处理复杂的 SLAM 任务。通过结合 3D 相机,我们可以将相机捕获的深度信息集成到地图中,除了传统的平面信息外,还用三维数据来丰富它。在本文中,我们将详细概述此过程中使用的技术,并解决实施过程中遇到的挑战。

背景和需求分析

在机器人自主导航中,精确的环境感知和地图构建是必不可少的。传统的 2D SLAM 技术可以实现实时定位和地图构建,但在描述复杂空间中环境的三维结构方面往往存在不足。

为了解决这个问题,我们选择了 myAGV Jetson Nano,这是一款配备高性能 SLAM 雷达导航能力和强大计算处理能力的产品,非常适合复杂环境中的自主任务。然而,2D SLAM 在描述三维空间时仍然存在局限性。因此,我们引入了 3D 摄像头,它可以捕捉环境的深度信息,生成更详细的三维地图,从而增强机器人的环境感知能力。

为了实现这一目标,我们采用了 RTAB-Map 作为映射工具,它可以处理 RGB-D 数据并支持实时 3D 映射和定位。通过将 RTAB-Map 与该平台上的 3D 相机集成,我们的目标是在复杂环境中实现高精度 3D SLAM 映射,以满足实际应用需求。

产品概述

myAGV Jetson Nano 系列

myAGV Jetson Nano 2023 采用 NVIDIA® Jetson Nano B01 4GB 核心板,搭配 Ubuntu Mate 20.04 操作系统,由大象机器人为机器人定制,提供流畅且用户友好的体验。myAGV 2023 支持 2D 测绘和导航、3D 测绘和导航、图形编程、可视化软件、ROS 模拟以及摇杆和键盘控制等多种控制方式。它是研究、教育和个人创客的理想选择。

Astra Pro2

Astra Pro2 深度相机使用 3D 结构光成像技术来捕捉物体的深度图像,同时通过彩色相机收集彩色图像。是一款适用于 0.6m 至 6m 距离范围内 3D 物体和空间扫描的智能产品,能够测量测量范围内物体的深度数据。作为 Astra 系列的升级版,Astra Pro 2 配备了 MX6000 自研深度感应芯片,支持深度图像的最大分辨率 1280x1024。它还具有多种分辨率的深度和彩色图像对齐功能,可广泛应用于机器人避障、低精度 3D 测量和手势交互等场景。凭借 RGB-D 功能,它可以捕获彩色图像和深度信息以生成三维地图

此设置所需的所有必要依赖项和功能包都预装在 myAGV 的 Ubuntu 20.04 系统上,允许我们直接使用 RTAB-Map 和 Astra Pro2 的 ROS 包。

RTAB-Map 的实现

myAGV 平台预装了几个基本功能,允许直接使用。在本节中,我们将分析提供的功能并完成部署它们的过程。

程序初始化

第一步是启动里程计和 LiDAR 组件:

roslaunch myagv_odometry myagv_active.launch

'myagv_active.launch' 文件负责初始化和启动与机器人运动估计和传感器数据采集相关的核心组件。

<launch>

    <node pkg="myagv_odometry" type="myagv_odometry_node" name="myagv_odometry_node" output="screen" />
    <param name="robot_description" textfile="$(find myagv_urdf)/urdf/myAGV.urdf"/> 
    
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

    <node name="base2camera_link" pkg="tf" type="static_transform_publisher" args="0.13 0 0.131 0 0 0 /base_footprint /camera_link 50"/>
    <node name="base2imu_link" pkg="tf" type="static_transform_publisher" args="0 0 0 0 3.14159 3.14159 /base_footprint /imu 50"/>
        
    <node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf" output="screen">
      <param name="output_frame" value="odom"/>
      <param name="base_footprint_frame" value="base_footprint"/>
      <param name="freq" value="30.0"/>
      <param name="sensor_timeout" value="2.0"/>
      <param name="odom_used" value="true"/>
      <param name="odom_data" value="odom"/>
      <param name="imu_used" value="true"/>
      <param name="vo_used" value="false"/>
    </node>
  
    <include file="$(find ydlidar_ros_driver)/launch/X2.launch" />
</launch>

 myagv_odometry_node:此节点启动里程计过程,计算机器人在环境中的位置和方向。

● robot_description:加载机器人的 URDF(Unified Robot Description Format,统一机器人描述格式)文件,描述机器人的物理结构。

● joint_state_publisher 和 robot_state_publisher:这些节点发布机器人的关节状态和整体状态信息。

● static_transform_publisher:定义固定坐标变换,将机器人底座的相对位置和方向与摄像头和 IMU 等传感器联系起来。

● robot_pose_ekf:使用扩展卡尔曼滤波器 (EKF) 融合来自里程计、IMU 和其他传感器的传感器数据,从而更准确地估计机器人的姿态。

● ydlidar_ros_driver:启动 LiDAR 驱动程序节点,从环境中获取激光扫描数据。

启动 Astra Pro2 深度相机

接下来,我们启动 Astra Pro2 深度相机:

roslaunch orbbec_camera astra_pro2.launch

此启动文件设置必要的 ROS 节点来处理来自摄像头的 RGB-D 数据流,包括初始化摄像头、配置各种图像和深度处理参数,以及将摄像头数据发布到 ROS 主题以供其他节点使用,例如 SLAM 或对象检测。

一些关键参数包括:

● '/camera/color/camera_info': 彩色相机信息 (CameraInfo) 的主题。

● '/camera/color/image_raw':原始彩色图像流的主题。

● '/camera/depth/camera_info':深度图像流信息的主题。

● '/camera/depth/image_raw':原始深度图像流的主题。

● '/camera/depth/points':点云主题,仅在 'enable_point_cloud' 设置为 true 时可用。

● '/camera/depth_registered/points':彩色点云主题,仅在 'enable_colored_point_cloud' 为 true 时可用。

● '/camera/ir/camera_info':红外摄像头信息的主题 (CameraInfo)。

● '/camera/ir/image_raw':原始红外图像流的主题。

如果你需要修改这些设置,请参考 SDK 官方提供的文档

[Orbbec 开发人员文档]

启动 RTAB-Map 进行映射

最后,启动 RTAB-Map 开始映射:

roslaunch myagv_navigation rtabmap_mapping.launch
<launch>
  <group ns="rtabmap">
  
    <arg name="rtabmap_viz" default="true" />

    <node pkg="nodelet" type="nodelet" name="rgbd_sync" args="standalone rtabmap_sync/rgbd_sync" output="screen">
      <remap from="rgb/image" to="/camera/color/image_raw"/>
      <remap from="depth/image" to="/camera/depth/image_raw"/>
      <remap from="rgb/camera_info" to="/camera/color/camera_info"/>
      <remap from="rgbd_image" to="rgbd_image"/>
      <param name="approx_sync" value="true"/> 
    </node>

    <node name="rtabmap" pkg="rtabmap_slam" type="rtabmap" output="screen" args="--delete_db_on_start">
      <param name="frame_id" type="string" value="base_footprint"/>
      <param name="subscribe_rgbd" type="bool" value="true"/>
      <param name="subscribe_scan" type="bool" value="true"/>
      <remap from="odom" to="/odom"/>
      <remap from="scan" to="/scan"/>
      <remap from="rgbd_image" to="rgbd_image"/>
      <param name="queue_size" type="int" value="100"/>

      <!-- RTAB-Map's parameters -->
      <param name="RGBD/NeighborLinkRefining" type="string" value="true"/>
      <param name="RGBD/ProximityBySpace" type="string" value="true"/>
      <param name="RGBD/AngularUpdate" type="string" value="0.01"/>
      <param name="RGBD/LinearUpdate" type="string" value="0.01"/>
      <param name="Grid/FromDepth" type="string" value="false"/>
      <param name="Reg/Force3DoF" type="string" value="true"/>
      <param name="Reg/Strategy" type="string" value="1"/>
      <param name="Icp/VoxelSize" type="string" value="0.05"/>
      <param name="Icp/MaxCorrespondenceDistance" type="string" value="0.1"/>
    </node>

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find myagv_navigation)/rviz/rtabmap.rviz" output="screen"/>
      
    <node pkg="tf" type="static_transform_publisher" name="base_footprint_to_laser"
      args="0.0 0.0 0.2 3.1415 0.0 0 /base_footprint /laser_frame 40" />
  </group>
</launch>

● 启动组:将 RTAB-Map 相关节点分组到一个公共命名空间 ('rtabmap') 下,以便于管理和数据处理。

● RGB-D 同步节点:同步来自相机的 RGB 和深度图像,将原始相机数据转换为 RTAB-Map 可以处理的格式。

● RTAB-Map SLAM 节点:运行 RTAB-Map SLAM 算法,配置 SLAM 参数,如订阅的传感器数据、队列大小、优化和 ICP 相关参数。此节点处理实时传感器数据处理、地图生成和机器人姿势估计。

● RViz 可视化:启动 RViz 以实时可视化 RTAB-Map 生成的地图和机器人姿势。

● 静态变换发布器:定义并发布激光雷达与机器人基架之间的固定坐标变换,确保 SLAM 算法能够在同一坐标系内正确对齐传感器数据。

问题

虽然基本的映射功能已成功实现,但即使在使用 Jetson Nano 板时,在此过程中也存在明显的滞后。这表明 Jetson Nano 的性能不足以进行无缝映射,从而导致映射过程的潜在中断。

解决办法

解决方案在于利用 ROS 的多机通信功能。

ROS 多机通信

ROS 多机通信支持在 ROS 网络内的多个计算设备之间共享信息和任务。这在复杂的机器人应用中特别有用,因为单个设备(如 Jetson Nano)无法处理所有计算任务。通过将某些任务卸载到功能更强大的设备(例如高性能 PC),您可以实现更高效的处理。

从本质上讲,Jetson Nano 将处理一些 SLAM 计算,而更强大的 PC 会处理来自深度相机的数据,从而确保更流畅、更完整的地图构建体验。

实施 ROS 多机通信的步骤

1. 网络配置

● 确保 PC 和 Jetson Nano 在同一网络上,并且可以相互通信。

● 在每个设备上设置 ROS 环境变量,特别是“ROS_MASTER_URI”和“ROS_IP”(或“ROS_HOSTNAME”)。

PC 配置:

export ROS_MASTER_URI=http://<PC_IP>:11311
   export ROS_IP=192.168.1.100

Jetson Nano 配置:

export ROS_MASTER_URI=http://<PC_IP>:11311
   export ROS_IP=192.168.1.121

2. 启动 Core Node

● 在 PC 上启动核心 ROS 节点。这将允许 Jetson Nano 通过多机通信与 PC 的 ROS 内核进行通信。

3. 节点分布

● PC(SLAM 映射):在 PC 上运行 RTAB-Map 节点。它将订阅来自 Jetson Nano 的传感器数据并处理 SLAM 映射过程。

● Jetson Nano(传感器处理):在 Jetson Nano 上运行传感器驱动节点,例如深度相机节点,并发布图像和深度数据。

● (可选)运行节点以处理 SLAM 结果或映射任一设备上的数据,具体取决于其角色。

4. 数据传输

● 使用 ROS 主题在 PC 和 Jetson Nano 之间传输数据。例如,Jetson Nano 可以将相机的 RGB-D 数据发布到 /camera/color/image_raw 和 /camera/depth/image_raw 等主题,而 PC 的 RTAB-Map 节点订阅这些主题以执行映射。

预期成果

通过在 Jetson Nano 和更强大的 PC 之间分配工作负载,映射过程应该会变得更加顺畅。PC 卓越的处理能力将处理密集型任务,实现更流畅和完整的映射,与仅在 Jetson Nano 上运行所有内容相比,延迟显着减少。

总结

在这个技术案例中,我们成功地利用 Jetson Nano 板和 3D 相机实现了 RTAB-Map 进行三维映射。然而,在实现过程中,我们遇到了性能瓶颈,尤其是在 Jetson Nano 板上运行复杂的 SLAM 算法时,导致计算负载过重,影响了系统的实时性能和稳定性。

为了解决这个问题,我们引入了多机通信,将一些计算任务卸载到另一台计算机。这种优化不仅减轻了 Jetson Nano 的负担,还增强了整体系统性能,确保了更顺畅、更高效的 SLAM 映射过程。

03-08
### RTAB-Map 使用指南和教程 #### 3.1 安装与配置 为了安装RTAB-Map及其ROS包,可以按照官方文档中的说明进行操作。对于Ubuntu系统,推荐通过apt-get来安装稳定版本的软件包[^2]: ```bash sudo apt-get install ros-noetic-rtabmap-ros ``` 如果需要最新的功能或修复,则可以从源码编译最新版的RTAB-Map库和ROS封装。 #### 3.2 启动基本实例 启动一个简单的RTAB-Map SLAM会话可以通过roslaunch命令完成。下面是一个使用激光雷达传感器作为输入的例子: ```bash roslaunch rtabmap_ros rgbd_mapping.launch rtabmap_args:="--delete_db_on_start" ``` 此命令将会初始化一个新的地图数据库,并开始记录来自RGB-D摄像头的数据流以便构建环境的地图。 #### 3.3 参数调整 RTAB-Map提供了一系列可调参数以适应不同硬件平台及应用需求。例如,在资源受限的情况下,降低视觉特征提取的数量可以帮助提高处理速度;而在计算能力强的设备上增加这些设置可以获得更好的定位精度。具体来说,`Kp/DetectorStrategy` 和 `Vis/MinInliers` 是两个重要的参数选项[^1]。 #### 3.4 数据保存与加载 当完成了某个区域内的建图工作之后,用户可以选择将当前状态存储下来供以后重访时使用。这通常涉及到导出已创建的地图文件(.db),并通过相应的API接口读取它们恢复先前的状态继续探索未知空间。 #### 3.5 高级特性集成 除了基础的功能之外,RTAB-Map还支持与其他计算机视觉工具相结合扩展其能力范围。比如文中提到利用YOLOv3目标检测框架辅助机器人理解周围物体的存在位置关系,从而做出更加合理的导航决策[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值