12. isaacsim4.2教程-ROS 導航

1. Teleport 示例

ROS 服務的作用: 提供了一種同步、請求-響應的通信方式,用于執行那些需要即時獲取結果或狀態反饋的一次性操作或查詢。

Teleport 服務在 ROS 仿真(尤其是 Gazebo)和某些簡單機器人控制中扮演著瞬移機器人或對象的角色。

Teleport Service 是一個具體應用,它利用 ROS 服務機制來實現在仿真(或極少數簡單真實場景)中瞬間設置機器人/模型位置和朝向的功能,主要用于調試、測試和快速初始化。它是一個典型的 ROS 服務。

  1. 在 Isaac Sim 的示例中,打開 Isaac Examples?> ROS?> Teleport。此時,場景中會自動加載一個立方體和一個圓錐。

  2. 如果未打開 Action Graph 窗口,請通過菜單:Window > Visual Scripting > Action Graph

  3. 此時工作圖(graph)應只包含兩個節點:

    1. On Playback Tick

    2. ROS1 Teleport Service

  4. 要調用該服務,請在另一個終端中,加載 Isaac?Sim 的 ROS1 工作區,然后運行示例客戶端腳本:rosrun isaac_tutorials ros_service_client.py

你會看到立方體和圓錐像中了瞬移咒一樣,每次都會跳到隨機的新位置。😉

Pose Teleport Service 消息定義

該服務使用一個自定義的 IsaacPose ROS Service 消息,定義文件位于:

<noetic_ws>/src/isaac_ros_messages/srv/IsaacPose.srv

消息結構如下:

std_msgs/Header        header
string[]               names
geometry_msgs/Pose[]   poses
geometry_msgs/Twist[]  velocities
geometry_msgs/Vector3[] scales
  • names:一個字符串數組,包含要傳送對象的 prim 路徑,必須與場景中的路徑完全一致。

  • poses:一個 Pose 數組,與 names 一一對應,指定每個對象的目標位置。

  • (可選)velocitiesscales 可用于同時設置速度和縮放,但在本示例中未用到。

客戶端示例腳本

下面是示例中運行的客戶端腳本,位于:

<noetic_ws>/src/isaac_tutorials/scripts/ros_service_client.py
import rospy
import numpy as np
from isaac_ros_messages.srv import IsaacPose, IsaacPoseRequest
from geometry_msgs.msg import Posedef teleport_client(msg):rospy.wait_for_service("teleport")try:teleport = rospy.ServiceProxy("teleport", IsaacPose)teleport(msg)except rospy.ServiceException as e:print("Service call failed: %s" % e)# 隨機生成立方體的新位置
cube_pose = Pose()
cube_pose.position.x = np.random.uniform(-2, 2)
cube_pose.position.y = 0
cube_pose.position.z = 0
cube_pose.orientation.w = 1# 隨機生成圓錐的新位置
cone_pose = Pose()
cone_pose.position.x = 0
cone_pose.position.y = np.random.uniform(-2, 2)
cone_pose.position.z = 0
cone_pose.orientation.w = 1# 組裝服務請求
teleport_msg = IsaacPoseRequest()
teleport_msg.names = ["/World/Cube", "/World/Cone"]
teleport_msg.poses = [cone_pose, cube_pose]# 調用服務
teleport_client(teleport_msg)

2. ROS導航

學習目標

在本 ROS 示例中,我們將:

  • 演示 Omniverse Isaac Sim 與 ROS Navigation 棧的集成。

  • 使用地圖生成器(Occupancy Map Generator)。

2.1 前提條件

  1. 安裝 ROS Navigation 棧
    在終端中運行:

    sudo apt-get install ros-$ROS_DISTRO-navigation
    

    這樣就能獲取所有核心的導航功能包了。

  2. 獲取示例所需包
    本教程依賴以下三個 ROS 包,它們位于你的工作空間下的 src/navigation/ 目錄中:

    • carter_2dnav

    • carter_description

    • isaac_ros_navigation_goal

    這些包分別包含:

    • 啟動文件(launch files)

    • 導航參數配置

    • 機器人模型文件

    確保你已經完成了 ROS 和 ROS?2 的安裝,且正確配置了 ROS 環境變量(例如 source /opt/ros/$ROS_DISTRO/setup.bash),并且 src/navigation/ 已在你的 ROS_PACKAGE_PATH 中。

  3. 啟用 ROS 橋接并啟動 roscore

  4. 可選:如果你對 RTX 激光雷達(Lidar)傳感器的工作原理、相關節點,或如何獲取合成數據感興趣,可閱讀《RTX Lidar 傳感器原理與使用指南》,深入了解它們在導航中的應用。

2.2 ROS導航設置

下面是該 ROS Navigation 棧所需的主要話題及其消息類型,對應圖中的各個模塊:

ROS 話題 (Topic)消息類型 (Message Type)作用簡介
/tftf2_msgs/TFMessage發布各坐標系之間的變換,用于維護機器人在世界、里程計、傳感器等坐標系下的位置關系。
/odomnav_msgs/Odometry發布機器人里程計信息,常由里程計源(輪速計/仿真/SLAM)產生,用于局部規劃。
/mapnav_msgs/OccupancyGrid發布全局柵格地圖(占據柵格),供全局規劃器(global_planner)做路徑搜索。
/scansensor_msgs/LaserScan發布激光雷達掃描數據,驅動本地/全局代價地圖(costmap)和避障模塊。

各模塊如何利用這些話題

  1. /map &map_server→global_costmap→global_planner
    全局地圖加載后,global_costmap 將其轉成代價地圖,再由全局規劃器計算從起點到目標的粗略路徑。

  2. /odom & /tf → local_planner & local_costmap
    局部代價地圖不斷融合里程計和雷達數據,為 local_planner 提供實時障礙物信息,生成可執行的局部路徑。

  3. /scan → global_costmap & local_costmap
    激光數據同時更新全局和局部代價地圖,保證導航對新出現的障礙物能夠“眼觀六路、耳聽八方”。

  4. tf2_msgs/TFMessage
    /tf 話題上廣播的坐標變換,讓各節點能夠把傳感器數據、位姿、路徑都正確地“放”到同一個世界坐標系下。

2.3 Carter_ROS Omnigraph 節點說明

在 Isaac Examples → ROS → Navigation 中加載倉庫場景(warehouse scenario)。

Graph 說明

  1. 展開 Carter_ROS,右鍵點擊 ActionGraph,選擇 Open Graph。圖中的控制部分就是經典的兩輪小車graph,重點看ros部分:
    ?

  2. 下列 ROS Omnigraph 節點負責驅動機器人導航:

    Omnigraph 節點功能說明
    ros1_subscribe_twist訂閱 /cmd_vel 話題,將接收到的速度指令傳給差速與關節控制器,控制機器人運動。
    isaac compute odometry node它接收來自仿真環境或底層傳感器(如 IMU、輪編碼器)的原始運動數據,執行必要的計算(如積分、濾波、運動學解算),輸出機器人當前的狀態估計。
    ros1_publish_odometry接收來自 Compute Odometry Node完整狀態信息(位置、姿態、線速度、角速度),將其封裝成標準的 ROS nav_msgs/Odometry 消息,并發布到指定的 ROS topic 上。
    ros1_publish_raw_transform_tree接收來自 Compute Odometry Node位置和姿態信息,將其轉換為 ROS 的坐標變換 (tf transform),并按照指定的父子坐標系關系持續發布到 ROS tf 樹中。
    ros1_publish_transform_tree發布機器人基座坐標系(base_link)到底盤坐標系(chassis_link)的靜態變換;由于目標 prim 設置為 Carter_ROS,會把整個 Carter 機器人從 chassis_link 開始的層級樹都作為 base_link 的子樹一起發布。
    ros1_publish_transform_tree_01發布底盤坐標系(chassis_link)到激光雷達坐標系(carter_lidar)的靜態變換。
    ros1_publish_laser_scan發布由 isaac_read_lidar_beams_node 讀取的 2D 激光掃描(LaserScan)數據。
  3. 同樣在 Carter_ROS 下,右鍵點擊 ROS_Cameras,選擇 Open Graph。下列 ROS 相機相關 Omnigraph 節點負責圖像與相機信息的發布:
    這個好理解,就是有兩個相機,然后每個相機都要進行渲染畫面,然后分成三種類型和話題發布。

    Omnigraph 節點功能說明
    ros1_create_camera_left_info自動生成并發布 /camera_info_leftCameraInfo,默認已啟用 enable_camera_left 分支節點。
    ros1_create_camera_left_rgb自動生成并發布 /rgb_left 的 RGB 圖像,默認已啟用 enable_camera_leftenable_camera_left_rgb
    ros1_create_camera_left_depth自動生成并發布 /depth_left 的深度圖(32FC1),需啟用 enable_camera_leftenable_camera_left_depth
    ros1_create_camera_right_info自動生成并發布 /camera_info_rightCameraInfo,需啟用 enable_camera_right
    ros1_create_camera_right_rgb自動生成并發布 /rgb_right 的 RGB 圖像,默認已啟用 enable_camera_rightenable_camera_right_rgb
    ros1_create_camera_right_depth自動生成并發布 /depth_right 的深度圖(32FC1),需啟用 enable_camera_rightenable_camera_right_depth
  4. 為了讓所有外部 ROS 節點使用仿真時間,還額外添加了一個 ROS_Clock Graph,包含一個 ros1_publish_clock 節點,負責將仿真時間發布到 /clock 話題。

2.4 生成 Occupancy Map

使用占據地圖生成器擴展(推薦)

要了解更多關于占據地圖生成器擴展的信息,請點擊此處。

  1. 在 Isaac Examples → ROS → Navigation 中加載倉庫場景(warehouse scenario)。

  2. 在視口左上角,點擊 Camera,從下拉菜單中選擇 Top(俯視圖)。

  3. 進入 Isaac UtilsOccupancy Map

  4. Occupancy Map 擴展面板中:

    • Origin 設置為 X: 0.0, Y: 0.0, Z: 0.0

    • Lower BoundZ 設置為 0.1

    • Upper BoundZ 設置為 0.62

    提示:將上界 Z 設為 0.62 米,是為了與 Carter 機器人上激光雷達距離地面的垂直高度保持一致。

  5. 在場景(Stage)中選中 warehouse_with_forklifts 這個 prim。

  6. 返回 Occupancy Map 擴展面板,點擊 BOUND SELECTION。此時,占據地圖的邊界將根據所選 warehouse_with_forklifts prim 自動更新。

此時,面板中的地圖參數就會類似于下圖所示。

移除 Carter_ROS prim 并生成導航地圖

  1. 移除 Carter_ROS prim
    在場景(Stage)中,選中 Carter_ROS prim,按 Delete 鍵將其移除。

  2. 計算并可視化占據圖像

    • Occupancy Map 擴展面板中,依次點擊 CALCULATE,然后點擊 VISUALIZE IMAGE

    • 彈出可視化窗口后,設置:

      • Rotate Image:選擇 180 degrees

      • Coordinate Type:選擇 ROS Occupancy Map Parameters File (YAML)

    • 點擊 RE-GENERATE IMAGE,重新生成圖像(因為 ROS 相機與 Isaac Sim 相機坐標系不同,需要翻轉)。

  3. 導出 YAML 參數

    • 在可視化面板下方,即刻會顯示一段符合 ROS 格式的 Occupancy Map 參數(YAML 文本)。

    • 復制全部文本內容。

      image: carter_warehouse_navigation.png
      resolution: 0.05
      origin: [-11.975, -17.975, 0.0000]
      negate: 0
      occupied_thresh: 0.65
      free_thresh: 0.196
  4. 創建并保存 YAML 文件
    在你的 carter_2dnav ROS 包的 map 目錄下(路徑示例:<noetic_ws>/src/navigation/carter_2dnav/map/),新建一個名為carter_warehouse_navigation.yaml 的文件,將剪貼板中復制的 YAML 文本粘貼到該文件中并保存。

  5. 保存可視化圖像
    回到 Omniverse Isaac Sim 可視化窗口,點擊 Save Image。將文件命名為?carter_warehouse_navigation.png,將它保存在與 carter_warehouse_navigation.yaml 相同的目錄中。

An occupancy map 現在就準備好了

2.5 運行 ROS Navigation

  1. Isaac Examples → ROS → Navigation 中加載倉庫場景(warehouse scenario)。

  2. 點擊 Play 按鈕,啟動仿真。

  3. 打開一個新終端,運行以下 ROS 啟動文件,開啟導航流程:
    這時 RViz 會自動打開,加載機器人的 URDF 模型、全局占據地圖,以及覆蓋其上的局部代價地圖。

    roslaunch carter_2dnav carter_navigation.launch
  4. 為驗證所有坐標變換(TF)都正常廣播,再打開一個新終端,運行:
    rosrun rqt_tf_tree rqt_tf_tree

    彈出的 TF 樹圖應與下圖大致相符。

  5. 由于 carter_navigation.launch 中已定義機器人的初始位姿,啟動時機器人會自動定位好;如有需要,也可在 RViz 中點擊 2D Pose Estimate 按鈕,手動重置位姿。

  6. 在 RViz 中,點擊工具欄上的 2D Nav Goal,然后在地圖上點擊并拖拽至目標點。
    ROS Navigation 棧會立即規劃一條軌跡,機器人也會像開了自動駕駛模式一樣,朝著目的地優雅行駛!

可以看到拖拽到損失很大的障礙物處是沒法繼續移動的。

3. 多機器人ROS導航

3.1 建map

  1. Create -> Isaac -> Environments -> Hospital.

  2. Perspective--Top. 選中 Hospital prim and press F

  3. Next, go to Isaac Utils -> Occupancy Map.

  4. In the Occupancy Map extension, ensure the Origin is set to X: 0.0, Y: 0.0, Z: 0.0. For the lower bound, set Z: 0.1. For the Upper Bound, set Z: 0.62. Keep in mind, the upper bound Z distance has been set to 0.62 meters to match the vertical distance of the Lidar onboard Carter with respect to the ground.

  5. Select the Hospital prim in the stage. In the Occupancy Map extension, click on BOUND SELECTION. The bounds of the occupancy map should be updated to incorporate the selected Hospital prim.

  6. ?CALCULATE followed by VISUALIZE IMAGE.

  7. For Rotate Image, select 180 degrees and for Coordinate Type select ROS Occupancy Map Parameters File (YAML). Click RE-GENERATE IMAGE. Occupancy map parameters formatted to YAML will appear in the field below. Change the image name to your preference. Copy the full text.

  8. Create a YAML file for the occupancy map parameters called carter_hospital_navigation.yaml and place it in the map directory which is located in the sample carter_2dnav ROS package (carter_2dnav/map/carter_hospital_navigation.yaml).

  9. Insert the previously copied text in the carter_hospital_navigation.yaml file.

3.2 開始運行

  • Load scenario:

    • For the hospital environment, go to Isaac Examples -> ROS -> Multi Robot Navigation -> Hospital Scene.

    • For the Office scenario, go to Isaac Examples -> ROS -> Multi Robot Navigation -> Office Scene.

  • Click on Play to begin simulation.

  • In a new terminal, run the ROS launch file and set the env_name parameter to either hospital or office to begin Multiple Robot Navigation with the desired environment.

    roslaunch carter_2dnav multiple_robot_carter_navigation.launch env_name:=hospital

To verify that all of the transforms are broadcasting, run the following command in a new terminal to visualize the ROS TF frame tree:

rosrun rqt_tf_tree rqt_tf_tree

Since the positions of each robot is defined in multiple_robot_carter_navigation.launch, the robots should already be properly localized.

  1. In RViz, 點擊 Tool Properties -> 2D Nav Goal -> Topic, 設置 topic namespace to either /carter1, /carter2 or /carter3 選擇給哪一個導航

  2. Next, click on the 2D Nav Goal button and then click and drag at the desired location point in the map. The ROS Navigation stack will now generate a trajectory and the specified robot will start moving towards its destination! Repeat this process for every other robot.

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

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

相關文章

DeepSpeed-FastGen:通過 MII 和 DeepSpeed-Inference 實現大語言模型的高吞吐文本生成

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" DeepSpeed-FastGen&#xff1a;通過 MII 和 DeepSpeed-Inference 實現大語言模型的高吞吐文本生成 摘要 隨著大語言模型&#xff08;LLM&#xff09;被廣泛應用&#xff0c;其部署與擴展變得至關重要&#xff0…

操作系統:操作系統的結構(Structures of Operating System)

目錄 簡單結構&#xff08;Simple Structure&#xff09; 整體式結構&#xff08;Monolithic Structure&#xff09; 什么是 Kernel&#xff08;內核&#xff09;&#xff1f; 層次結構&#xff08;Layered Structure&#xff09; 微內核結構&#xff08;Microkernel&#x…

Python柱狀圖

1.各國GDP柱狀圖2.各國GDP時間線柱狀圖

FastGPT:企業級智能問答系統,讓知識庫觸手可及

在信息爆炸的時代&#xff0c;企業如何高效管理和利用海量知識&#xff1f;傳統搜索和文檔庫已難以滿足需求。FastGPT正成為企業構建智能知識核心的首選。一、FastGPT&#xff1a;不止于問答的智能知識引擎FastGPT 顛覆了傳統知識庫的局限&#xff0c;其核心優勢在于&#xff1…

探索 MyBatis-Plus

引言在當今的 Java 開發領域&#xff0c;數據庫操作是一個至關重要的環節。MyBatis 作為一款優秀的持久層框架&#xff0c;已經被廣泛應用。而 MyBatis-Plus 則是在 MyBatis 基礎上進行增強的工具&#xff0c;它簡化了開發流程&#xff0c;提高了開發效率。本文將詳細介紹 MyBa…

Hive【安裝 01】hive-3.1.2版本安裝配置(含 mysql-connector-java-5.1.47.jar 網盤資源)

我使用的安裝文件是 apache-hive-3.1.2-bin.tar.gz &#xff0c;以下內容均以此版本進行說明。 以下環境測試安裝成功&#xff1a; openEuler 22.03 (LTS-SP1)系統 MySQL-8.0.40 1.前置條件 MySQL數據庫 我安裝的是 mysql-5.7.28 版本的&#xff0c;安裝方法可參考《Linux環境…

璞致 PZSDR-P101:ZYNQ7100+AD9361 架構軟件無線電平臺,重塑寬頻信號處理范式

璞致電子 PZSDR-P101 軟件無線電平臺以 "異構計算 寬頻射頻 工業級可靠性" 為核心設計理念&#xff0c;基于 Xilinx ZYNQ7100 處理器與 ADI AD9361 射頻芯片構建&#xff0c;為工程師提供從 70MHz 到 6GHz 的全頻段信號處理解決方案。無論是頻譜監測、無線通信原型…

【基礎】go基礎學習筆記

基礎及關鍵字if for switch都支持使用隱形聲明&#xff08;:&#xff09;來快速聲明一個變量&#xff0c;無需在上面一行額外聲明&#xff0c;這可以增加代碼簡潔性&#xff0c;但不太符合其他常規語言的寫法&#xff0c;需要習慣一下if for switch都不需要使用&#xff08;&am…

AI驅動的企業知識管理革新

Baklib&#xff1a;人工智能引領的知識管理平臺Baklib 是領先的 AI 驅動知識管理系統&#xff0c;專為企業打造智能化、模塊化的知識共享平臺。功能覆蓋在線幫助中心、內聯網、CMS 網站、客戶支持系統、視頻中心、活動教學平臺和客戶社區&#xff0c;全面提升組織在知識管理、員…

使用 FFmpeg 實現 RTP 音頻傳輸與播放

&#x1f50a; 使用 FFmpeg 實現 RTP 音頻傳輸與播放&#xff08;Ubuntu&#xff09; 在音視頻開發或遠程通信場景中&#xff0c;RTP&#xff08;Real-time Transport Protocol&#xff09; 是一種常用的實時音頻傳輸協議。本文將介紹如何使用 FFmpeg 在 Ubuntu 上實現從一臺主…

Android 導出聯系人為 vCard(.vcf)

有時需要將聯系人數據導出為可共享的標準格式&#xff1a;vCard&#xff08;.vcf&#xff09;格式&#xff0c;可被系統直接導入通訊錄一、導出聯系人為 vCard&#xff08;.vcf&#xff09;? 支持字段我們支持導出的字段包括&#xff1a;姓名個人電話家庭電話工作電話郵箱備注…

大模型-bacth之chunked prefills

一、chunked prefills 1.1 chunked prefills核心思想 ORCA雖然很優秀&#xff0c;但是依然存在兩個問題&#xff1a;GPU利用率不高&#xff0c;流水線依然可能導致氣泡問題。 我們來看sarathi-serve做的一個實驗。左右兩圖分別刻畫了在不同的batch size下&#xff0c;prefil…

multiprocessing模塊使用方法(一)

結合Python代碼示例說明multiprocessing模塊的使用方法、Linux啟動命令、服務部署及真實應用場景&#xff1a;一、multiprocessing基礎用法 Python的multiprocessing模塊通過創建子進程實現并行計算&#xff0c;核心步驟如下&#xff08;引用&#xff09;&#xff1a;創建進程對…

vector如何判斷應該擴容?

std::vector 的擴容機制是 C 容器性能優化的一個核心點。它的判斷標準、行為特征和實現細節如下所示&#xff1a;? 一、vector 的核心結構 std::vector 內部維護三個指針&#xff1a; begin -> 指向數據起始位置 end -> 指向當前已使用的元素末尾&#xff08;size…

ICMP考點

在網絡工程師、運維工程師、安全工程師等崗位的面試中&#xff0c;??ICMP&#xff08;Internet Control Message Protocol&#xff0c;互聯網控制報文協議&#xff09;?? 是高頻必考知識點。ICMP作為IP協議的“輔助協議”&#xff0c;雖然不直接傳輸用戶數據&#xff0c;但…

服務器帶寬具體是指什么意思?

企業在選擇服務器租用或托管服務時&#xff0c;需要根據自身的業務情況來選擇合適的服務器帶寬&#xff0c;以便于能夠讓其業務持續穩定的運行工作&#xff0c;做到及時響應用戶的訪問請求&#xff0c;但是很多用戶對于帶寬一詞沒有過多的概念&#xff0c;本文就來探討一下服務…

CANape之ASAP2 Studio介紹

提到ECU的測量標定工具&#xff0c;很多小伙伴第一個想到的就是CANape。但其實&#xff0c;除了強大的測量標定功能之外&#xff0c;CANape還有很多其他功能。例如&#xff0c;CANape中集成的小工具——ASAP2 Studio&#xff0c;其支持對A2L文件&#xff08;由ASAM組織所定義&a…

【debug日記】MONAI SwinUNETR 目標檢測項目調試總結(AI自動總結)

MONAI SwinUNETR 目標檢測項目調試總結 日期: 2025年7月25日 項目: 使用 MONAI&#xff0c;以預訓練的 SwinUNETR 為骨干網絡&#xff0c;微調 RetinaNet 進行3D肺結節檢測。 本文檔旨在記錄在項目配置、數據處理和模型訓練過程中遇到的一系列問題及其解決方案&#xff0c;作為…

AI同傳領域,字節跳動與科大訊飛激戰進行時

在AI同聲傳譯市場&#xff0c;行業巨頭科大訊飛長期占據主導地位&#xff0c;但新晉玩家字節跳動正以迅猛姿態發起挑戰。7月24日&#xff0c;字節旗下火山引擎正式發布豆包同聲傳譯模型 Seed LiveInterpret 2.0&#xff0c;主打“人類級延遲”和“0樣本聲音復刻”&#xff0c;試…