当前位置: 首页 > news >正文

Nvidia Orin + RealSense D435i 与3D地图实现导航

这个博客是我的一个开源项目的同步版,实现了在 Nvidia Orin 上用 RealSense D435i 作为局部代价地图、3D 点云地图抽取指定高度作为 2D 地图的 move_base 路径规划。

  • Github 项目链接:https://github.com/GaohaoZhou-ops/Mixed-Navigation

这个项目会持续维护,但会优先更新到 Github 上,建议直接看 Github 上的内容。如果你遇到了什么问题在这篇博客和 Github 上留言都是等效的,我看到了会一样处理。

下面的部分是直接照搬我项目的 ReadMe 文件,如果有出现重复的描述还请见谅。


Mixed Nav

这个包是一个混合导航demo,将3D点云文件抽取指定高度映射成 2D 地图文件,并用到了 RealSense D435i、Spatio Temporal Voxel Layer、move_base 等插件,并提供了仿真和真机两种启动方式。目的是和我的另一个开源项目结合使用,实现用 Mid360 + Fast-Lio 魔改版的建图、定位、导航。

代码中涉及到的开源仓库如下所示:

  • RealSense-ROS:https://github.com/IntelRealSense/realsense-ros
  • Spatio-Temporal Voxel Layer:https://github.com/SteveMacenski/spatio_temporal_voxel_layer

代码在以下环境中通过了测试,更多的平台测试将持续推出:

DevicePlantformOSROS
Nvidia Orin DKArmUbuntu 20.04Noetic

这个工程中涉及到的部分资源可以在下面的网盘链接中找到:

https://pan.baidu.com/s/1N1MpEK--n21-cuk45Z0BBA?pwd=sf9y

Step1. 安装依赖

基础依赖库

在你的环境中需要安装不限于以下几个依赖:

$ sudo apt-get install ros-noetic-navigation ros-noetic-tf2-sensor-msgs libopenvdb-dev

conda 环境

因为将点云文件转化为 2D 栅格地图需要一些 python 的库,建议在新建一个 conda 环境进行操作以避免影响到本机环境。

$ conda create -n mapconv python=3.10
$ conda activate mapconv
$ pip install numpy open3d PyYAML Pillow

Step2. 源码编译

拉取源码

在安装完依赖库后使用下面的命令编译源码,假设你的工作空间名字是 nav_ws

$ cd nav_ws/src
$ git clone --recursive git@github.com:GaohaoZhou-ops/Mixed-Navigation.git

因为这里没有对另外两个包中的源码进行修改,所以在拉取后还需要切换一下分支:

$ cd nav_ws/src/realsense-ros
$ git checkout ros1-legacy$ cd nav_ws/src/spatio_temporal_voxel_layer
$ git checkout noetic-devel

修改 realsense-ros 源码

需要对 realsense-ros/realsense2_camera/CMakeLists.txt 文件进行修改,主要是添加 OpenCV 相关的部分:

find_package(OpenCV REQUIRED)     # 添加 OpenCV 库
find_package(catkin REQUIRED COMPONENTSmessage_generationnav_msgsroscppsensor_msgsstd_msgsstd_srvsnodeletcv_bridgeimage_transporttfddynamic_reconfigurediagnostic_updaterOpenCV REQUIRED               # 添加 OpenCV 库)...include_directories(include${realsense2_INCLUDE_DIR}${catkin_INCLUDE_DIRS}${OpenCV_INCLUDE_DIRS}        # 添加 OpenCV 头文件目录)...target_link_libraries(${PROJECT_NAME}${realsense2_LIBRARY}${catkin_LIBRARIES}${CMAKE_THREAD_LIBS_INIT}${OpenCV_LIBRARIES}           # 添加 OpenCV 库文件目录)

然后使用下面的命令编译源码:

$ cd nav_ws
$ catkin_make

Step3. 获取地图点云文件

使用示例地图文件

如果你暂时还没有完成建图,可以从上面的网盘链接中下载名为 room_zheng.ply 的点云地图文件并将其移动到 mixed_nav/resources 位置:

在这里插入图片描述

此时你的工程目录结构应该如下所示:

$ cd nav_ws
$ tree -L 2└── src├── CMakeLists.txt -> /opt/ros/noetic/share/catkin/cmake/toplevel.cmake├── mixed_nav├── ReadMe.md├── realsense-ros└── spatio_temporal_voxel_layer

其中 mixed_nav 包中的结构如下所示:

$ cd src/mixed_nav
$ tree 
.
├── CMakeLists.txt
├── config
│   ├── costmap_common_params.yaml
│   ├── dwa_local_planner_params.yaml
│   ├── global_costmap_params.yaml
│   └── local_costmap_params.yaml
├── include
│   └── mixed_nav
├── launch
│   ├── navigation_sim.launch
│   └── view_map.launch
├── package.xml
├── resources
│   ├── 2d_room_zheng.pgm
│   ├── 2d_room_zheng.yaml
│   ├── images
│   └── room_zheng.ply      # 下载好的点云地图
├── rviz
│   ├── nav_rviz.rviz
│   └── view_map.rviz
├── scripts
│   ├── pc2pgm.py
│   └── simulation.py
└── src

使用自己现成的地图文件

如果你已经有了一份点云地图文件,将其移动到 src/mixed_nav/resources 目录中即可。

使用 Fast-Lio 进行建图

可以参考我另外一个仓库用 Fast-Lio 进行建图,完成建图后将点云文件移动到 src/mixed_nav/resources 目录中即可。

【待补充】


Step4. 转换点云地图文件

进入到 nav_ws/src/mixed_nav 目录下并激活 conda 环境:

$ cd nav_ws/src/mixed_nav
$ conda activate mapconv

然后使用脚本 scripts/pc2pgm.py 并结合可选参数将点云地图文件转换成 2D 栅格地图,假设你的地图名为 room_zheng.ply,下面命令执行后会将点云文件中高度在 [0.1,0.8][0.1,0.8][0.1,0.8] 范围内的点云压缩成一个 2D 地图,并保存到 resources 文件夹下:

$ python scripts/pc2pgm.py resources/room_zheng.ply --min_z 0.1 --max_z 0.8

成功运行的输入示例如下:

未指定 --map_name,使用默认名称: 2d_room_zheng
正在加载点云文件: resources/room_zheng.ply...
点云加载成功,包含 17734527 个点。
正在根据高度范围过滤点云 (min_z: -0.7 m, max_z: 0.2 m)...
过滤后剩余 3463479 个点。
计算出的地图尺寸: 634 x 194 像素。
正在保存PGM地图文件到: resources/2d_room_zheng.pgm
/home/orin/Desktop/nav_ws/src/mixed_nav/scripts/pc2pgm.py:70: DeprecationWarning: 'mode' parameter is deprecated and will be removed in Pillow 13 (2026-10-15)img = Image.fromarray(map_data, mode='L')
正在保存YAML配置文件到: resources/2d_room_zheng.yaml处理完成!
地图文件: resources/2d_room_zheng.pgm
配置文件: resources/2d_room_zheng.yaml您现在可以使用ROS map_server加载此地图:
rosrun map_server map_server /home/orin/Desktop/nav_ws/src/mixed_nav/resources/2d_room_zheng.yaml

该脚本提供了其他几个可选参数,使用 --help 查看具体功能。

【可选】使用下面的命令查看一下生成的点云地图是否满足你的需求,如果不满足可以通过修改 ZZZ 轴的高度范围重新生成:

$ cd nav_ws
$ source devel/setup.bash 
$ roslaunch mixed_nav view_map.launch

在这里插入图片描述


Step5. 启动仿真导航

使用下面的命令启动仿真导航:

$ cd nav_ws
$ source devel/setup.bash 
$ roslaunch mixed_nav navigation_sim.launch

如果你已经安装好 RealSense SDK 那么可以顺便启动相机,这样能够将点云映射到局部代价地图上以实现更动态的导航避障,如果你目前没有连接相机也不会影响仿真:

$ cd nav_ws
$ source devel/setup.bash 
$ roslaunch realsense2_camera rs_rgbd.launch 

请添加图片描述

在仿真 rviz 界面中使用 2D Pose Estimate 按钮给一个初试姿态如下图所示:

请添加图片描述

再提供一个 2D Nav Goal 可以模拟导航目的地:

请添加图片描述


Step6. 使用真机导航

【未完待续】

http://www.dtcms.com/a/313430.html

相关文章:

  • Ubuntu系统VScode实现opencv(c++)视频的处理与保存
  • [硬件电路-129]:模拟电路 - 继电器的工作原理、关键指标、常用芯片与管脚定义
  • SpringAI的使用
  • Socket编程——TCP协议
  • 从一到无穷大 #51:突破阿姆达尔定律:COZ因果剖析与串行优化八法
  • Java学习第一百零一部分——网关(Gateway)
  • java测试题(ssm框架)
  • 02.Redis 安装
  • MPLS 静态LSP
  • TV电视版软件集合分享
  • 深入理解Java并发编程:原理、实战与最佳实践
  • Redis 7 中的 Set 和 Zset 使用
  • 基于transformer的目标检测——匈牙利匹配算法
  • 深入解析HashMap:原理与性能优化
  • Vim编辑器详解:从入门到高效使用
  • 从零开始的CAD|CAE开发: LBM源码实现分享
  • 编程语言分类
  • JAVAEE--5.多线程之常见的锁策略
  • AI Competitor Intelligence Agent Team
  • 【openlayers框架学习】七:绘制线要素以及点击画线功能
  • 力扣热题100----------141.环形链表
  • 基于BiLSTM+CRF实现NER
  • 【机器人】VLN-R1 微调 | 增强训练 | 连续导航
  • Web3合约ABI,合约地址生成部署调用及创建,连接钱包,基础交易流程
  • ARPO:让LLM智能体更高效探索
  • 【Linux网络编程基础--socket地址API】
  • 多 4G 通讯模组共存时的干扰问题深度解析与解决方案
  • leecode-每日一题-2106. 摘水果
  • vmfusion启动centos6.10 一直卡到call 169.254.169.254
  • 全面解析 BGE Embedding 模型:训练方式、模型系列与实战用法