ROS move_base 混合功能導航 RealSense D435i + 3D 點云地圖 + 樓層切換 + 路徑錄制 + 路徑規劃

Mixed-Navigation

這個博客也是記錄我們的一個開源項目,其作用是混合功能導航。由于現有的 Fast-Lio-Localization 只實現了定位功能,但對于路徑規劃和樓層切換沒有具體實現,因此我們開出了這個倉庫作為參考。該倉庫的核心功能如下:

  • 可以使用 RealSense D435i 相機的點云作為局部代價地圖;
  • 可以使用激光雷達 PointCloud2 格式作為局部代價地圖;
  • 對任意高度的 3D 點云地圖抽取指定高度范圍作為 2D 全局地圖;
  • 對不同樓層的地圖實現了管理與服務調用式的切換;
  • 可以在 Rviz 上錄制不同路徑導航點;
  • 同一個樓層允許添加多個導航路徑;

我們建議你直接跳轉我們的開源倉庫,所有功能更新與 Bug 修復都會在第一時間同步到倉庫中,博客的更新可能存在滯后。

  • Mixed Navigation: https://github.com/GaohaoZhou-ops/Mixed-Navigation/tree/main#

這篇博客剩余的內容就直接復制項目中 ReadMe-CN.md 文件。


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
$ sudo apt-get install libopenvdb-dev
$ sudo apt-get install ros-noetic-teb-local-planner

conda 環境

因為將點云文件轉化為 2D 柵格地圖需要一些 python 的庫,建議在新建一個 conda 環境進行操作以避免影響到本機環境。

$ conda create -n mapconv python=3.10
$ conda activate mapconv
$ pip install "numpy<2.0"
$ pip install cython open3d PyYAML Pillow commentjson pyntcloud rospkg

Step2. 源碼編譯

拉取源碼

在安裝完依賴庫后使用下面的命令編譯源碼,假設你的工作空間名字是 nav_ws

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

因為這里沒有對另外兩個包中的源碼進行修改,所以在拉取后還需要切換一下分支:

$ cd nav_ws/src/
$ git clone https://github.com/IntelRealSense/realsense-ros.git
$ cd realsense-ros
$ git checkout ros1-legacy$ cd nav_ws/src/
$ git clone https://github.com/SteveMacenski/spatio_temporal_voxel_layer.git
$ cd 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/resources/floors 包中的結構如下所示:

$ cd src/mixed_nav/resources/floors
.
├── floor0
│   ├── floor0.pgm
│   ├── floor0.yaml
│   └── waypoints.json
├── floor1
│   ├── floor1.pgm
│   ├── floor1.yaml
│   └── waypoints.json
├── floor3
│   ├── floor3.pgm
│   ├── floor3.yaml
│   └── waypoints.json
├── room_zheng.ply      # 下載好的點云地圖文件
└── z_config.json

使用自己現成的地圖文件

如果你已經有了一份點云地圖文件,將其移動到 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/tools/pc2pgm.py 并結合可選參數將點云地圖文件轉換成 2D 柵格地圖,假設你的地圖名為 room_zheng.ply,下面命令執行后會將點云文件中高度在 [0.1,0.8][0.1,0.8][0.1,0.8] 范圍內的點云壓縮成一個 2D 地圖,并保存到 resources/floors 文件夾下:

$ python scripts/pc2pgm.py resources/room_zheng.ply  --floor_name floor0 --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 軸的高度范圍重新生成:

下面的命令會同時加載一份 3D 點云地圖,由于點云文件通常比較大,因此可能會消耗一定時間,如果你不想加載點云文件可以修改 map_server.launch 文件中的參數配置取消顯示:

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

在這里插入圖片描述


Step5. 設置導航點

在完成地圖編輯后使用下面的命令啟動導航點記錄節點,你需要在 src/Mixed-Navigation/mixed_nav/launch/record_nav_points.launch 文件中明確指出當前地圖所在的樓層 floor_name 以讓 map_server 加載地圖信息:

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

記錄節點每次啟動后可以錄制多條導航軌跡,新開一個終端并調用服務 /start_record_nav_point 來告知節點當前路徑名,這里假設為 path_alpha

$ cd nav_ws
$ source devel/setup.bash 
$ rosservice call /start_record_nav_point "path_name: 'path_alpha'" 

然后在 rviz 窗口中使用 2D Nav Goal 按鈕按照順序逐個創建導航點;如果你在錄制過程中操作失誤,可以調用服務 /undo_record_nav_point 取消最近一次記錄。

當一條路徑錄制結束后調用服務 /finish_record_nav_point 告知當前結束錄制。
在這里插入圖片描述

最終得到的路徑會保存到 src/Mixed-Navigation/mixed_nav/resources/floors/floor_name/waypoints.json 文件中:

{"path_alpha": [{"position": {"x": 1.382780909538269,"y": 3.176682710647583,"z": 0.0},"orientation": {"x": 0.0,"y": 0.0,"z": 0.0114526433511636,"w": 0.9999344163295266}},],// ..."path_beta": [{"position": {"x": 3.6949002742767334,"y": 3.6009724140167236,"z": 0.0},"orientation": {"x": 0.0,"y": 0.0,"z": 0.011048003717325597,"w": 0.9999389689445362}},]}

Step6. 啟動仿真導航

如果你已經安裝好 RealSense SDK 那么可以順便啟動相機,這樣能夠將點云映射到局部代價地圖上以實現更動態的導航避障,如果你目前沒有連接相機也不會影響仿真:

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

在這里插入圖片描述

在仿真 rviz 界面中使用 2D Pose Estimate 按鈕給一個初試姿態如下圖所示:
在這里插入圖片描述

使用下面的命令啟動仿真導航:

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

功能一:自由路徑導航

在rviz中提供一個 2D Nav Goal 可以模擬自由導航到目的地:
在這里插入圖片描述

功能二:逐點導航

該功能需要確保 waypoints 文件夾中的導航路徑文件存在且內容無誤,使用下面的命令朝 /track_points/goal 話題發布一個路徑組名 path_group_name 以及死區半徑 dead_zone_radius 可以讓其自動沿著路徑組 path_beta 進行逐點導航。本質是逐點發布導航點到 /move_base_simple/goal 話題中讓 move_base 完成路徑規劃功能,期間實時監聽 base_link 是否到達死區內,如果到達則發布下一個點

$ rostopic pub /track_points/goal mixed_nav/PathNavigationActionGoal "header:seq: 0stamp:secs: 0nsecs: 0frame_id: ''
goal_id:stamp:secs: 0nsecs: 0id: ''
goal:path_group_name: 'path_beta'dead_zone_radius: 0.2" 

在這里插入圖片描述


Step7. 切換地圖

如果你想要使用不同高度或樓層作為導航地圖,使用下面的命令可以進行地圖切換,切換成功后對應的地圖點云文件也會同步修改:

$ cd nav_ws
$ source devel/setup.bash
$ rosservice call /switch_floor "floor_name": 'floor0'
floor0floor1floor3
在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93322.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初識c語言————宏定義和調用

目錄&#xff1a;一.不帶參數的宏二.帶參數宏一.不帶參數的宏不帶參數的宏是指用#define指令定義的簡單文本替換規則&#xff0c;它沒有參數列表&#xff0c;直接替換標識符為相應的文本其一般形式為&#xff1a;#define 宏名 文本例如&#xff1a;#define pi 3.14這個代…

數據結構:滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Complete Binary Tree)

目錄 重要的術語澄清 完美二叉樹 (Perfect Binary Tree) 完全二叉樹 (Complete Binary Tree) 大比拼 (Comparison) 相互關系的第一性推導 我們來深入探討兩種在算法中非常重要的、具有特定“形狀”的二叉樹&#xff1a;滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Compl…

OpenJDK 17的C1和C2編譯器實現中,方法返回前插入安全點(Safepoint Poll)的機制

OpenJDK 17 JIT編譯器堆棧分析-CSDN博客 在OpenJDK 17的C1和C2編譯器實現中&#xff0c;方法返回前插入安全點&#xff08;Safepoint Poll&#xff09;的機制主要涉及以下關鍵步驟&#xff0c;結合源代碼進行分析&#xff1a; 1. 安全點輪詢樁&#xff08;Safepoint Poll Stu…

【論文筆記】STORYWRITER: A Multi-Agent Framework for Long Story Generation

論文信息 論文標題&#xff1a;StoryWriter: A Multi-Agent Framework for Long Story Generation 論文作者&#xff1a;Haotian Xia, Hao Peng et al. (Tsinghua University) 論文鏈接&#xff1a;https://arxiv.org/abs/2506.16445 代碼鏈接&#xff1a;https://github.com/…

Cohere 開發企業級大型語言模型(LLM)

Cohere 是一家專注于開發企業級大型語言模型&#xff08;LLM&#xff09;的公司。該公司推出了一系列名為 “Command” 的模型&#xff0c;其中最強大的 “Command A” 于今年三月首次亮相 Cohere 還提供嵌入模型&#xff0c;這是一種將文件轉化為神經網絡可以理解的緊湊數值形…

Rust Web框架Axum學習指南之入門初體驗

一、準備階段 確保已經安裝 rust&#xff0c;開發環境使用 vscode 或者 rustrover 都可以。接著就可以創建項目&#xff0c;通過編輯器創建或者命令行創建都可以&#xff1a; cargo new axum-admin二、添加依賴 添加依賴如下&#xff1a; [package] name "axum-admin&quo…

autofit.js: 自動調整HTML元素大小的JavaScript庫

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

RocketMQ 命名服務器(NameServer)詳解

&#x1f680; RocketMQ 命名服務器&#xff08;NameServer&#xff09;詳解 NameServer 是 RocketMQ 架構中的輕量級路由發現服務&#xff0c;它不參與消息的收發&#xff0c;但承擔著整個集群的“地址簿”和“導航系統”的關鍵角色。 理解 NameServer 的設計與工作原理&#…

代碼隨想錄算法訓練營四十三天|圖論part01

深度優先搜索&#xff08;dfs&#xff09;理論基礎 dfs就是可一個方向去搜直到盡頭再換方向&#xff0c;換方向的過程就涉及到了回溯。 代碼框架 因為dfs搜索可一個方向&#xff0c;并需要回溯&#xff0c;所以用遞歸的方式來實現是最方便的。 先來回顧一下回溯法的代碼框架…

飛算JavaAI金融風控場景實踐:從實時監測到智能決策的全鏈路安全防護

目錄一、金融風控核心場景的技術突破1.1 實時交易風險監測系統1.1.1 高并發交易數據處理1.2 智能反欺詐系統架構1.2.1 多維度欺詐風險識別1.3 動態風控規則引擎1.3.1 風控規則動態管理二、金融風控系統效能升級實踐2.1 風控模型迭代加速機制2.1.1 自動化特征工程結語&#xff1…

Vue 組件二次封裝透傳slots、refs、attrs、listeners

最近寫了一個開源項目&#xff0c;有些地方需要二次封裝&#xff0c;需要透傳一些數據&#xff0c;需要注意的是ref&#xff0c;我這里使用倆種方式間接傳遞ref&#xff0c;具體如下&#xff1a; 使用&#xff1a; import VideoPlayer from ./index.jsVue.use(VideoPlayer)inde…

介紹大根堆小根堆

文章目錄一、核心定義與結構特性示例&#xff08;以“數組存儲堆”為例&#xff09;二、堆的兩個核心操作1. 插入操作&#xff08;以小根堆為例&#xff09;2. 刪除極值操作&#xff08;以小根堆為例&#xff0c;刪除根節點的最小值&#xff09;三、小根堆 vs 大根堆&#xff1…

【Html網頁模板】賽博朋克數據分析大屏網頁

目錄專欄導讀? 項目概述&#x1f3a8; 設計理念&#x1f6e0;? 技術架構核心技術棧設計模式&#x1f3af; 核心功能1. 視覺效果系統&#x1f308; 色彩體系2. 數據可視化模塊&#x1f4ca; 主圖表系統&#x1f4c8; 性能監控面板3. 實時數據流系統? 數據流動畫&#x1f4ca;…

【經典上穿突破】副圖/選股指標,雙均線交叉原理,對價格波動反應靈敏,適合捕捉短期啟動點

【經典上穿突破】副圖/選股指標&#xff0c;雙均線交叉原理&#xff0c;對價格波動反應靈敏&#xff0c;適合捕捉短期啟動點 這是一款結合短線與中線信號的趨勢跟蹤指標&#xff0c;通過雙均線交叉原理捕捉股價突破時機&#xff0c;適用于個股分析和盤中選股。 核心功能模塊&…

RK3568 NPU RKNN(四):RKNN-ToolKit2性能和內存評估

文章目錄1、前言2、目標3、完整的測試程序4、運行測試程序5、程序拆解6、總結1、前言 本文僅記錄本人學習過程&#xff0c;不具備教學指導意義。 2、目標 使用野火提供的示例程序&#xff0c;體驗 RKNN-ToolKit2 在PC端使用連板推理&#xff0c;進行性能和內存評估。 3、完…

ASP.NET 上傳文件安全檢測方案

一、前端初步過濾&#xff08;防誤操作&#xff09;<!-- HTML部分 --><input type"file" id"fileUpload" accept".jpg,.png,.pdf,.docx" /><button onclick"validateFile()">上傳</button><script>func…

Nacos Server 3.0.x安裝教程

前言 注&#xff1a; 1.Nacos Server 3.0.x 要求 JDK版本不低于17。 2.Nacos 2.2.0 及以上版本需要 Java 11 或更高版本。 3.Java 8&#xff0c;需要下載 Nacos 2.1.x 及以下版本 JDK17安裝 JDK官方下載地址&#xff1a;Oracle官網JDK下載地址 JDK17&#xff1a;JDK17下載地…

【數據庫干貨】六大范式速記

1NF、2NF、3NF、BCNF、4NF、5NF都是數據庫設計中的范式&#xff08;Normalization&#xff09;&#xff0c;用于確保數據庫中的數據結構盡可能地減少冗余&#xff0c;避免更新異常、插入異常、刪除異常等問題&#xff0c;從而提高數據的存儲效率和一致性。 本篇文章簡單講解下各…

Java開發主流框架搭配詳解及學習路線指南

文章目錄一、前言&#x1f517;二、主流Java框架搭配2.1 Spring Boot MyBatis-Plus Spring Cloud2.2 Spring Boot Spring Data JPA Spring Cloud2.3 Quarkus/Vert.x (響應式編程棧)三、技術選型建議四、Java學習路線指南階段1&#xff1a;Java基礎 (4-6周)階段2&#xff1a…

flutter-使用device_info_plus獲取手機設備信息完整指南

文章目錄1. 概述2. 安裝與配置3. 基本使用方法3.1. 創建實例3.2. 區分平臺獲取信息4. 詳細信息獲取4.1. Android 設備信息4.2. iOS 設備信息4.3. Web 瀏覽器信息4.4. Windows 設備信息5. 實戰示例6. 注意事項6.1. 權限問題6.2. 隱私保護6.3. 平臺差異處理6.4. 性能考慮7. 常見問…