9. isaacsim4.2教程-ROS加相機/CLOCK

在本示例中,我們將學習如何:

  • 向場景中添加額外的相機并將其安裝在機器人上

  • 添加相機發布器(Camera Publishers)

  • 通過 rostopics 發送真實的合成感知數據(ground truth synthetic perception data)

前提條件

  • 已完成 ROS 的安裝:包括安裝 ROS,啟用 ROS 擴展,構建提供的 Isaac Sim ROS 工作區,并設置必要的環境變量。

  • 了解 ROS 主題(rostopic)的基本知識,以及發布器(Publisher)和訂閱器(Subscriber)是如何工作的。

  • 已完成 OmniGraph 和 添加相機與傳感器(Add Camera and Sensors)的教程。

  • 已完成 URDF 導入(TurtleBot)和通過 ROS 消息控制 TurtleBot 的教程,確保場景中已加載好一個 TurtleBot。

  • roscore 正在運行。

1. 相機發布器(Camera Publisher)

設置相機(Setting up Cameras)

????????在視圖中默認顯示的相機是“透視相機”(Perspective Camera)。你可以通過視圖窗口左上角的“Camera”按鈕來確認這一點。點擊“Camera”按鈕后,你會看到其他一些預設的相機視角,例如:頂部視角(Top)、正面視角(Front)和右側視角(Right Side)。

????????為了本教程的目的,我們將添加兩個固定(stationary)相機,命名為 Camera_1Camera_2,它們將從不同的角度觀察房間。添加相機到舞臺的具體方法可以參考“添加相機與傳感器(Add Camera and Sensors)”教程。

????????你可能希望打開多個視圖窗口(Viewports)以同時查看多個相機視角。打開額外視圖窗口的方法如下:

????????依次點擊 Window -> Viewport -> Viewport 2 打開新的視圖窗口,并在該視圖窗口的左上角點擊 “Camera” 按鈕,選擇你想要顯示的相機視角。

./isaac-sim.sh --/rendergraph/mgpu/backend=copyQueue --/app/gatherRenderResults=1 --/app/uiGather=0

一個相機在墻上,一個相機和小車綁定,運行上節的ros命令就可以控制小車移動

為 RGB 圖像發布器構建圖

  1. 打開可視化腳本編輯器(Visual Scripting)
    點擊菜單欄中的 Window > Visual Scripting > Action Graph

  2. 新建或編輯 Action Graph
    在 Action Graph 窗口中,點擊中間的“新建 Action Graph(New Action Graph)”圖標,
    如果你想將相機發布器添加到已有的圖中,也可以點擊“編輯 Action Graph(Edit Action Graph)”。

  3. 構建 Action Graph
    根據下圖所示,創建包含各個節點及其連接關系的圖,
    并按照下方表格設置每個節點的參數。

這里要選到相機本體,不能選到相機的xform

圖的說明(Graph Explained)

Isaac Create Render Product

此節點用于創建一個渲染產品(Render Product)對象,從指定的攝像機節點(camera prim)獲取渲染數據,并輸出渲染產品的路徑。你可以通過勾選或取消 enabled 字段來啟用或禁用該渲染。

ROS1 Camera Helper

該節點用于指定發布的數據類型(如 RGB 圖像),并定義將其發布到哪個 ROS 話題(rostopic),以及設置該消息所用的坐標系幀(frameId)。

Camera Helper 節點說明(Camera Helper Node)

Camera Helper 節點實際上封裝了一個復雜的后處理網絡,使用戶無需手動構建底層圖

當你點擊 “播放(Play)” 并且圖中包含 Camera Helper 節點時,會自動生成一個新的圖。你可以在 Action Graph 窗口左上角的圖標列表中看到它,路徑為:

/Render/PostProcess/SDGPipeline

這個圖是由 Camera Helper 節點自動創建的,它的作用是:

  • 從你用 Isaac Create Render Product 節點創建的 Render Product 中,拉取原始渲染幀(也就是相機拍到的像素數據)

  • 把渲染幀做一系列加工:格式轉換(比如從 GPU buffer 轉成 CPU 可讀的圖像)、必要的打包或壓縮、以及你在 Helper 節點里指定的深度圖、語義分割、RGB 等模式對應的處理。

  • 最后把處理好的數據打包成 ROS 消息(sensor_msgs/Image、sensor_msgs/CameraInfo 等),并發送到你在 ROS1 Camera Helper 節點里配置的 /rgb 話題。

?? 注意:這個圖只在當前會話(session)中有效,不會被保存為你的資產(asset)的一部分,也不會出現在 Stage 樹中。

深度與其他感知真值數據

除了 RGB 圖像外,任何相機還可獲取以下合成傳感器和感知信息:

  • 相機信息(Camera Info)
    包含相機內參(焦距、光學中心、畸變系數等),便于后續做幾何校正或點云投影。

  • 深度(Depth)
    以每像素深度圖形式輸出,從相機到場景中各像素點的距離(單位通常是米)。

  • 點云(Point Cloud)
    將深度信息和相機內參結合,生成三維點集,可以更直觀地做空間感知和障礙物檢測。

在進行以下“邊界框”和“語義標注”發布前,請先參考Isaac Sim Replicator教程,學習如何給場景添加語義標簽(semantic annotation):

  • 2D 緊邊界框(BoundingBox?2D?Tight)

  • 2D 松邊界框(BoundingBox?2D?Loose)

  • 3D 邊界框(BoundingBox?3D)

  • 語義標簽(Semantic labels)

  • 實例標簽(Instance labels)

每個 Camera Helper 節點 一次只能檢索一種數據類型。你在節點屬性面板的 type 下拉菜單中選定后:

  1. 啟動仿真、生成底層 /Render/PostProcessing/SDGPipeline

  2. 該節點就鎖定為所選類型,無法再修改重用

  3. 如果要改類型,只能新建另一個 Camera Helper,或重新加載 Stage(重建管道)

在 Isaac Sim 自帶的示例場景中,有一個同時為多臺相機發布多個話題的完整案例,路徑為:

Isaac/Samples/ROS/Scenario/turtlebot_tutorial.usd

你可以打開它,看看是如何組織多個 Camera Helper、分別輸出 RGB、Depth、Segmentation、BoundingBox 等話題的。

2.驗證 ROS 連接

  1. 使用以下命令來查看正在傳輸的原始消息:
    rostopic echo /rgb你會在終端中看到該話題上不斷刷新的原始數據。

  2. 查看發布的圖像:在新的終端中(已 source 好 ROS 環境),確保 roscore 正在運行,模擬器也在“Play”狀態。運行下面的命令:
    rosrun image_view image_view image:=/rgb 
    這樣就能打開一個窗口,實時顯示發布到 /rgb 話題的圖像——它應當和你在視口里看到的畫面一模一樣。
    如果你在視口中移動攝像機,圖片也會同步“搖擺”,就像為你的仿真環境開了場“直播”!

我們也可以在?RViz?中查看圖像:

  1. 打開一個新的終端,并?source?好你的?ROS?環境;

  2. 輸入命令:rviz

  3. 在左側?Displays?面板中,點擊 “Add” → 選擇 “Image”

  4. 在新加入的?Image?Display 項里,將其?Topic?字段設置為與你在?Camera Helper?節點中配置的?topicName?一致——在本例中即:/rgb

這樣你就能在 RViz 中實時看到從仿真相機發布出來的圖像流啦!

如果遇到了問題,可以刪除render,重建圖,然后play,每次都會創建新的replicator,有些報錯可以這樣解決,甚至重啟一個isaacsim。

我第一次rviz也沒有出現rgb的圖像,然后一查發現

rosrun image_view image_view image:=/rgb 

這個圖像也不會出現了,rostopic echo /rgb也沒內容了,不知道什么原因,重啟之后重新play就都解決了

3.?ROS時鐘

在本例中,我們將:

  • 簡要討論ROS時鐘的發布者和訂閱者

  • 發布仿真時間作為Clock消息到ROS

  • 訂閱ROS Clock消息

仿真時間與時鐘

????????為了使外部ROS節點與仿真時間同步,通常會使用一個時鐘話題。許多ROS節點(例如RViz)使用參數use_sim_time,當設置為True時,它將指示節點開始訂閱/clock話題,并與發布的仿真時間同步。這個參數可以通過ROS啟動文件或命令行界面進行設置。稍后我們將看到如何在終端中設置該參數,并觀察它對某些ROS節點的影響。

運行ROS時鐘發布者

操作步驟

  1. 創建Action圖:

    • 轉到 Create -> Visual Scripting -> Action Graph 來創建一個Action圖。

  2. 將以下OmniGraph節點添加到Action圖中:

    • On Playback Tick節點:每個仿真幀執行其他圖節點。

    • Isaac Read Simulation Time節點:用于獲取當前仿真時間。注意:默認情況下,仿真時間是單調遞增的,這意味著無論仿真是否暫停并重新播放,時間都會繼續增加。這主要是為了防止仿真重置時時間倒退的問題。如果希望仿真重置時從0開始,可以將resetOnStop設置為True。

    • ROS1 Publish Clock節點:用于將仿真時間發布到/clock話題。

  3. ROS Clock發布器:

    • 以上配置后,ROS1發布時鐘信息,其他ROS節點可以通過訂閱/clock話題來獲取仿真時間并同步。

    • 輸入以下命令來啟動RViz:

      rosrun rviz rviz
      

      注意RViz窗口底部顯示的 ROS TimeROS Elapsed Time,這些值目前顯示的是Wall 時間,應與 Wall TimeWall Elapsed 字段相匹配。

    • 在一個新的ROS終端中,使用以下命令將 use_sim_time 參數設置為 true,以確保RViz使用仿真時間。
      rosparam set /use_sim_time true
      

      確保在設置之前Isaac Sim的仿真是停止的。
    • ?關閉RViz并重新啟動,這時你會注意到 ROS TimeROS Elapsed Time 都會顯示為0。
    • 點擊 Play 啟動Isaac Sim仿真。在RViz中,ROS Time 會與從Isaac Sim通過 /clock 話題發布的仿真時間相匹配。

發布系統時間

盡管發布仿真時間是最常見的工作流程,但某些工作流可能需要消息包含系統時間。要通過時鐘話題發布系統時間,請按照以下步驟操作:

  1. 創建Action圖:

    • 轉到 Create -> Visual Scripting -> Action Graph 來創建一個Action圖。

  2. 將以下OmniGraph節點添加到Action圖中:

    • On Playback Tick節點:每個仿真幀執行其他圖節點。

    • Isaac Read System Time節點:用于獲取當前系統時間。

    • ROS1 Publish Clock節點:將系統時間發布到/clock話題。

  3. ROS時鐘發布器(帶系統時間):

    • 配置上述節點后,系統時間將通過 /clock 話題發布。

  4. 在Isaac Sim中點擊Play:

    • 啟動Isaac Sim仿真后,可以在ROS終端中使用以下命令查看從Isaac Sim發布的系統時間:

      rostopic echo /clock

相機助手和RTX激光雷達節點

  • 在之前的教程中你已經見過 ROS Camera Helper 節點,而在后續教程中你將見到 ROS RTX Lidar Helper 節點。

  • 這兩個節點都會自動生成一個傳感器發布管道。為了確保它們的發布器使用系統時間,請確保將它們的 useSystemTime 輸入設置為 True

運行ROS時鐘訂閱者

  1. 創建Action圖:

    1. 打開一個新的場景,轉到 Create -> Visual Scripting -> Action Graph 來創建一個新的Action圖。

  2. 將以下OmniGraph節點添加到Action圖中:

    1. On Playback Tick節點:每個仿真幀執行其他圖節點。

    2. ROS1 Subscribe Clock節點:訂閱外部時間戳數據。

  3. 啟動仿真:

    1. 點擊 Play 啟動仿真后,選擇Action圖中的 ROS1 Subscribe Clock節點,在屬性窗口中查看它的 timeStamp 輸出。此時,時間戳應為0。

  4. 手動發布時鐘消息:

    1. 在一個新的ROS終端中運行以下命令手動發布時鐘消息一次:

      rostopic pub  -1 /clock rosgraph_msgs/Clock "clock: { secs: 1, nsecs: 200000000 }"
      

      執行后,ROS1 Subscribe Clock OmniGraph節點中的 timeStamp 值應更改為 1.2

    2. 你可以更改發布命令中的 secsnsecs 值,觀察這些值如何反映在 ROS1 Subscribe Clock OmniGraph節點的 timeStamp 字段中。例如:

      rostopic pub -1 /clock rosgraph_msgs/Clock "clock: { secs: 3, nsecs: 500000000 }"
      

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

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

相關文章

微信小程序171~180

1.封裝購物車接口API import http from /utils/httpexport const reqAddCrt ({ goodsId, count, ...data }) > {return http.get(/cart/addToCart/${goodsId}/${count}, data) }export const reqCartList () > {return http.get(/cart/getCartList) }export const reqU…

修改 docker 容器的掛載配置(保持數據不丟的情況)

一、核心原理Docker 容器的運行時配置(包括掛載)是啟動時確定的,一旦啟動無法直接修改。因此,需通過以下步驟實現:保存原容器中的數據(避免丟失);基于原鏡像創建新容器,同…

MVCC(多版本并發控制)介紹及實現原理

一、什么是MVCC? MVCC(Multi-Version Concurrency Control,多版本并發控制)是數據庫中用于解決并發訪問問題的一種機制。它通過為數據維護多個版本,讓讀寫操作在不同版本上獨立進行,從而避免了傳統鎖機制中…

密碼學基礎概念詳解:從古典加密到現代密碼體系

一、引言:為什么我們需要密碼學? 在數字化時代,信息已成為核心生產要素,而信息安全則是保障社會運轉的基石。當我們在電商平臺輸入銀行卡密碼時,當我們通過即時通訊工具發送私密消息時,當企業在云端存儲核心…

小鵬汽車視覺算法面試30問全景精解

小鵬汽車視覺算法面試30問全景精解 ——智能駕駛 車路協同 視覺創新:小鵬汽車視覺算法面試核心考點全覽 前言 小鵬汽車作為中國智能電動汽車的創新引領者,致力于通過AI與自動駕駛技術推動智能出行的變革。小鵬視覺算法團隊深耕自動駕駛感知、車路協同、智能座艙、3D重建…

程序是如何生成的-以c語言為例

一,序言 從代碼到能跑的程序,整個過程就像 “把外文翻譯成母語,再組裝成能直接用的東西”,一步步來更清楚: 源代碼(程序員寫的代碼,如C語言文件)↓ 預處理(處理#開頭的命…

風險識別清單:構建動態化的風險管理體系

在項目管理實踐中,風險識別是確保項目成功的關鍵環節。PMBOK提出的風險提示清單(Prompt List)為項目團隊提供了一個系統化的思考框架,幫助突破個人經驗局限,實現更全面的風險覆蓋。這一工具的價值不僅在于其提供的標準…

從“點狀用例”到“質量生態”:現代軟件測試的演進、困局與破局

測試的三次范式躍遷業務高速迭代下的四大困局質量工程化:流程、平臺、度量三位一體左移與右移:把缺陷扼殺在搖籃,也把監控鋪到墳墓自動化金字塔的再平衡:UI、API、單元、契約、e2e數據驅動測試:從“拍腦袋”到“科學實…

【C++】繼承和多態擴展學習

目錄 1. 菱形虛擬繼承原理剖析 1.1.虛基表 2. 單繼承和多繼承的虛函數表深入探索 2.1 單繼承虛函數表深入探索 2.2 多繼承虛函數表深入探索 ?編輯 2.3 菱形繼承、菱形虛擬繼承 3. 繼承和多態考察的一些常見問題 1. 菱形虛擬繼承原理剖析 繼承的文章中我們講到C的多繼承…

Visual Studio Code 遠端云服務器開發使用指南

目錄 一、下載安裝 1、官方下載 2、下載加速方案 二、基于Ubuntu系統的開發環境搭建方案 1、開發環境配置 2、云服務器架構 3、工作流程關系 4、總結 三、推薦插件 1、免配置插件 1. Remote-SSH - 遠程登錄Linux服務器 2. C/C - 必備的C/C開發插件 3. C/C Extensi…

技術演進中的開發沉思-41 MFC系列:定制 AppWizard

MFC開發,最為重要的無非就是用“MFC AppWizard” 對話框做開發了,第一次使用感覺像拆收音機的孩子 —— 左邊是項目類型選擇,右邊是一堆打勾的選項,點完 “完成”,屏幕上就冒出了能直接編譯運行的窗口程序。那時還不知…

Libevent(3)之使用教程(2)創建事件

Libevent(3)之使用教程(2)創建事件 Author: Once Day Date: 2025年6月29日 一位熱衷于Linux學習和開發的菜鳥,試圖譜寫一場冒險之旅,也許終點只是一場白日夢… 漫漫長路,有人對你微笑過嘛… 本文檔翻譯于:Fast portable non-bl…

Kotlin 作用域函數 let 的實現原理

Kotlin 中的 let 是一個 標準庫擴展函數,它廣泛用于作用域函數(Scope Functions)中,尤其適用于對可空對象(nullable)做非空判斷并執行代碼塊的場景。 示例代碼 val name: String? "123" name?…

從FDTD仿真到光學神經網絡:機器學習在光子器件設計中的前沿應用工坊

FDTD仿真與光學神經網絡的基礎概念 FDTD(時域有限差分)是一種數值方法,用于求解麥克斯韋方程組,廣泛應用于光子器件設計。光學神經網絡通過光波導、衍射元件等物理結構實現矩陣運算,具有低能耗、高并行的優勢。 機器學…

在Ubutu22系統上面離線安裝Go語言環境【教程】

0.引言 Go語言(又稱Golang)是Google開發的一種靜態強類型、編譯型、并發型編程語言,由Robert Griesemer、Rob Pike和Ken Thompson于2007年開始設計,2009年正式發布。 1.到官網下載壓縮包 2.從win10系統離線上傳壓縮包給ubuntu22…

CMake實踐:CMake3.30版本之前和之后鏈接boost的方式差異

目錄 1.背景 2.boost引入CMake時機 3.CMake 3.30 之前(含 3.29)鏈接 Boost 的方式 4.CMake 3.30 及之后鏈接 Boost 的方式 5.CMake3.30后引入Boost的步驟 6.遷移建議(3.30 之前 → 3.30 之后) 7.CMake 3.30 移除FindBoost的…

告別掛馬風險!PBootCMS完美替代方案BadouCMS

開發企業網站時一直比較喜歡用pbootcms,標簽套用很簡單,使用也方便。 但是pbootcms一直有被掛馬的問題,官方好像也不怎么更新了!換過好幾個cms,比如eyoucms、dedecms、帝國等等,感覺都不怎么能用得習慣,還…

開發者如何集成AI繪畫?智創聚合API簡化Midjourney接入

在 AI 繪畫領域,Midjourney 的大名如雷貫耳,其強大的圖像生成能力,能將我們腦海中的奇思妙想,迅速轉化為精美的視覺畫面,深受設計師、藝術家以及廣大創意愛好者的青睞。然而,使用 Midjourney 的過程中&…

pycharm回車、刪除、方向鍵和快捷鍵等不能使用原因

解決方法 :菜單欄中的Tools取消勾選Vim Emulator 原因 :新版的pycharm安裝中,默認安裝了vim擴展,一旦安裝了pycharm在編寫代碼時會默認使用Vim編輯器

修復ffmpeg.dll丟失錯誤|6種解決ffmpeg.dll方法詳細教程

看到電腦提示“ffmpeg.dll丟失”,很多人會懵。ffmpeg.dll 是個處理視頻、音頻的關鍵文件。它要是沒了或壞了,軟件就打不開或直接閃退。常見原因是軟件安裝不全、文件被刪、或者中病毒。下面說說它是干嘛的,再給解決辦法。一.ffmpeg.dll 到底是…