機器人有助于為制造業(yè)、物流業(yè)、醫(yī)療保健業(yè)和服務業(yè)等行業(yè)創(chuàng)造新效率并提升人們的生活質(zhì)量, NVIDIA Isaac 憑借改進的機器人開發(fā)、模擬和部署功能,可加速這一進程。
對于機器人領域的開發(fā)者而言,“Isaac 就是 Omniverse 平臺里面,一個完全在 GPU 上實現(xiàn),很好地將機器人相關的一些深度學習、強化學習、SLAM、圖像處理等等的算法,融合在一個 GEMs 的高性能軟件包中的炫酷仿真引擎。” 這是知乎大咖稚輝(知乎坐擁 130 多萬粉絲的知名 KOL、AI 工程師)對于 Isaac 的評價。本期文章我們將分享稚輝 Isaac 仿真平臺搭建以及 ROS 試用教程。
Isaac 仿真平臺搭建以及 ROS 試用教程
最近在搞一個機器人項目嘛,所以借著機會了解了一下之前 NVIDIA大力推廣的 Omniverse 平臺,Omniverse 是 NVIDIA 推出的一個元宇宙模擬平臺,而 Isaac 是其中專門用于機器人環(huán)境模擬的一個引擎,試了一下還挺有意思的。
其實最早 Omniverse 設計的初衷是提供一個能讓工程師們協(xié)作創(chuàng)作的虛擬工具,畢竟號稱元宇宙引擎嘛,在數(shù)字世界里做基建必然是一個需要大量不同場景的工程師們配合實現(xiàn)的工作,后來該項目逐漸演變成了一個更加宏大的全行業(yè)框架。
發(fā)布會上提到會通過一種 USD(Universal Scene Description,這個縮寫我直呼內(nèi)行)的基礎數(shù)據(jù)格式來打通各種不同的軟件之間的配合。USD 不僅僅只是導入和導出的一種格式而已, USD 之于 Omniverse 就像 HTML(一種標記語言,可以將網(wǎng)絡上的文檔格式統(tǒng)一)之于網(wǎng)站。
而 Isaac 就是 Omniverse 平臺里面,一個完全在 GPU 上實現(xiàn),很好地將機器人相關的一些深度學習、強化學習、SLAM、圖像處理等等的算法,融合在一個 GEMs 的高性能軟件包中的炫酷仿真引擎。之前做機器人仿真的時候,最常用的是 VREP(現(xiàn)在叫 CoppeliaSim 了)、ROS 里面的 Gazebo、WeBot 等,這些仿真器用到的主要物理引擎都是開源的 Bullet 和 ODE。
與上面提到的這些仿真器相比,Isaac 的優(yōu)勢在于:
-
超逼真的光照渲染效果:一個字,以假亂真。NVIDIA 做啥起家的大家都知道了,RTX ON 之后這渲染效果相比于前面提到的開源引擎有質(zhì)的飛躍,直接來到照片級的逼真度。
-
性能的提升:實時的光照渲染和物理引擎的算力需求都是很高的,Isaac 針對 NVIDIA 硬件(GPU)進行了優(yōu)化,可以生成高效的平臺優(yōu)化的交叉編譯應用程序。
-
生態(tài)支持度好:Isaac 集成了其中許多 CUDA 加速的開源庫,例如 NPP、OpenCV、ROS、PCL (wip)、Eigen 等。
-
自帶常用的算法庫:Isaac SDK 附帶了一系列高性能算法,這些算法被稱為 GEM,此外除了機器人控制類的算法,Issac 還為主業(yè)打游戲副業(yè)煉丹的同學們準備了深度神經(jīng)網(wǎng)絡模塊的集成,例如立體聲深度估計、目標檢測、 Tracking 算法等等。
當然了對我這種顏值狗來說,渲染效果美麗 + Modern UI 的軟件界面就足夠讓我對其他軟件 Say No 了。下圖展示了 Isaac 的生態(tài)系統(tǒng):
那么接下來本文簡單介紹一下 Issac 的安裝流程以及使用記錄。
準備的環(huán)境
使用的是我自己的臺式機,硬件配置如下:
項目 |
概述 |
OS |
Ubuntu 20.04 LTS |
kernel |
5.13.0-35-generic |
英特爾 i7-12700F |
|
MEM |
64GB |
GPU |
GeForce RTX 3080 |
Driver Ver |
470.103.01 |
CUDA Ver |
11.4 |
按照 NVIDIA 官方 Omniverse 安裝指南(鏈接如下):
https://docs.omniverse.nvidia.com/prod_install-guide/prod_install-guide/workstation.html
首先,下載 Omniverse 的啟動器程序(需要注冊一下,鏈接如下):https://www.nvidia.com/en-us/omniverse/
操作系統(tǒng)可以選擇 Windows 或 Linux,這里我用的是 Ubuntu 所以選 Linux 版本,可以得到名為 omniverse-launcher-linux.AppImage 的文件,下載好之后需要授予它執(zhí)行權(quán)限,并將其放在主頁目錄下,命令:
chmod+xomniverse-launcher-linux.AppImage
./omniverse-launcher-linux.AppImage
運行此啟動器程序?qū)?Omniverse 窗口,但需要 NVIDIA 帳戶登錄才能使用,沒有的話注冊一下就行個人使用是免費的。
首次啟動時,系統(tǒng)會提示是否要安裝名為 “Cache” 的軟件,這個是用于提供一種軟件緩存機制,用于管理網(wǎng)絡通信加載內(nèi)容的,建議安裝它。
啟動器的軟件界面
順便說一下,Omniverse會開啟一個后臺服務,你可以從瀏覽器訪問 http://localhost:3080 來打開后臺管理頁面查看每個服務的操作狀態(tài)。
然后需要在啟動器軟件中安裝 Nucleus 服務:
Nucleus 就是個數(shù)據(jù)服務器,用于連接其他軟件,同時在當多個人進行項目時,通過連接到此服務器進行協(xié)作開發(fā)。軟件中也有很多有意思的 Tutorial 可以自己嘗試學習:
安裝完成后用之前注冊的賬號登錄即可,登錄后將看到一個文件管理器,可以在其中管理項目內(nèi)容。
接下來,我們添加機器人模擬器環(huán)境 Isaac Sim。Isaac Sim 是一個機器人仿真工具包,在 Omniverse 上運行,Isaac Sim 具有構(gòu)建虛擬機器人世界和實驗的基本功能,還能通過渲染能力提供進行數(shù)據(jù)集合成的工具和工作流程。Isaac Sim 通過 ROS/ROS2 支持導航和操作應用程序。
Isaac 的架構(gòu)圖如下:
由于渲染能力過猛,Isaac 對于硬件的配置要求有一丟丟高,推薦的配置為- RTX2070 及以上的顯卡,內(nèi)存至少 32GB,NVIDIA 的驅(qū)動程序版本需要 470.57.02 或更高版本。
參考以下安裝指南安裝 Isaac Sim:
https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/install_basic.html#isaac-sim-app-install-basic
從 EXCHANGE 選項卡中選擇并安裝:
根據(jù)教程,Isaac Sim 應該有一個按鈕來下載 Isaac Sim Assets(示例數(shù)據(jù)等)后啟動,但可能是網(wǎng)絡問題我這邊無法下載,所以通過手動添加方式解決,參考:
https://forums.developer.nvidia.com/t/known-issue-error-checking-isaac-sim-assets/204522
具體解決方案是從主窗口的 mount 選項卡右鍵單擊導航器的 localhost,創(chuàng)建具有以下參數(shù)的文件夾:
項目 |
內(nèi)容 |
Name |
Isaac |
Type |
Amazon S3 |
Host |
http://d28dzv1nop4bat.cloudfront.net |
Service |
s3 |
Redirection |
https://d28dzv1nop4bat.cloudfront.net |
下面的命令安裝:
sudoaptinstall./code_1.51.1-1605051630_amd64.deb
sudoaptinstall-yapt-transport-https
sudoaptupdate
然后我們安裝一下 VS Code 來代替自帶的編輯器,在官網(wǎng)下載 deb 安裝包
https://code.visualstudio.com/Download
此外,從 Isaac Sim 打開 VSCode 時的配置文件(如 setting.json)使用的是 .vscode,該文件位于 Isaac Sim 的安裝根目錄~/.local/share/ov/pkg/isaac_simxxx 中。
安裝 ROS 和 ROS2
在 Ubuntu 上安裝要與配合的 ROS 和 ROS2,只需按照官方安裝指南進行安裝即可:https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/install_ros.html
然后,在 Isaac Sim 端啟用 ROS Bridge 擴展,在窗口狀態(tài)量菜單中 Window->Extensions 中搜索 “ROS”:
啟用 “ROS Bridge” 和 “ROS UI” :
如果使用 ROS2,那就啟用 ROS2 Bridge 而不是 ROS Bridge。
現(xiàn)在 ROS 就可以和 Isaac Sim 通信啦,接下來我們編寫一個簡單的程序進行測試。
Python代碼測試
Isaac Sim 可以從官方自帶的一些 python 腳本獨立啟動,啟動腳本位于 Omniverse 中的 Isaac Sim 目錄中,例如,啟動作為示例提供的名為 “franka” 的制造機器人演示的命令如下所示:
cd~/.local/share/ov/pkg/isaac_sim-2021.2.1
./python.shstandalone_examples/api/omni.isaac.franka/follow_target.py
打開的時間可能比較久需要有點耐心...
當然還有其他很多別的腳本可以供參考,接下來我們將自己編寫 Python 腳本實現(xiàn)以下內(nèi)容:
1、在場景中放置對象
2、在場景中放置一個機器人并用鍵盤控制運動
放置對象
我們可以使用 omni.isaac.core 對象模塊放置對象,包含以下函數(shù):
-
DynamicCuboid
-
DynamicCapsule
-
DynamicCone
-
DynamicCylinder
-
DynamicSphere
-
VisualCuboid
-
VisualCapsule
-
VisualCone
-
VisualCylinder
-
VisualSphere
-
FixedCuboid
這些函數(shù)允許我們在場景中放置立方體、膠囊、圓錐體、圓柱體和球體,Dynamic 開頭的對象受到物理引擎的作用,比如重力,當把它們放置在空中時,它會直接掉落。Visual 開頭的對象則只會用于外觀,不會受到力的作用,也不會進行碰撞檢測,因此其他對象可以直接穿過它。例如以下代碼:
from omni.isaac.kit import SimulationApp
import numpy as np
simulation_app = SimulationApp({"headless": False})
from omni.isaac.core import World
from omni.isaac.core.objects import DynamicCuboid, DynamicCapsule, DynamicCone
from omni.isaac.core.objects import DynamicCylinder, DynamicSphere, FixedCuboid
my_world = World(stage_units_in_meters=0.01)
d_cube = my_world.scene.add(
DynamicCuboid(
prim_path="/dynamic_cube",
name="dynamic_cube",
position=np.array([0, 0, 0.5]) * 100,
size=np.array([0.1, 0.1, 0.1]) * 100,
color=np.array([255, 255, 255]),
)
)
d_cap = my_world.scene.add(
DynamicCapsule(
prim_path="/dynamic_capsule",
name="dynamic_capsule",
position=np.array([0.5, 0, 0.5]) * 100,
radius=0.05 * 100,
height=0.05 * 100,
color=np.array([255, 0, 0]),
)
)
d_cone = my_world.scene.add(
DynamicCone(
prim_path="/dynamic_cone",
name="dynamic_cone",
position=np.array([-0.5, 0, 0.5]) * 100,
radius=0.05 * 100,
height=0.05 * 100,
color=np.array([0, 0, 255]),
)
)
d_cyl = my_world.scene.add(
DynamicCylinder(
prim_path="/dynamic_cylinder",
name="dynamic_cylinder",
position=np.array([0, 0.5, 0.5]) * 100,
radius=0.05 * 100,
height=0.05 * 100,
color=np.array([0, 255, 0]),
)
)
d_sph = my_world.scene.add(
DynamicSphere(
prim_path="/dynamic_sphere",
name="dynamic_sphere",
position=np.array([0.5, 0.5, 0.5]) * 100,
radius=0.05 * 100,
color=np.array([255, 0, 255]),
)
)
f_cube = my_world.scene.add(
FixedCuboid(
prim_path="/fixed_cube",
name="fixed_cube",
position=np.array([-0.5, 0.5, 0.5]) * 100,
size=np.array([0.1, 0.1, 0.1]) * 100,
color=np.array([255, 255, 255]),
)
)
my_world.scene.add_default_ground_plane()
my_world.reset()
while simulation_app.is_running():
True) =
simulation_app.close()
效果是這樣的:
稍微修改一下,加入一些互動,比如用鍵盤控制一個小車:
from omni.isaac.kit import SimulationApp
import numpy as np
import carb
import omni.appwindow
simulation_app = SimulationApp({"headless": False})
from omni.isaac.jetbot import Jetbot
from omni.isaac.jetbot.controllers import DifferentialController
from omni.isaac.core import World
my_world = World(stage_units_in_meters=0.01)
my_jetbot = my_world.scene.add(
Jetbot(
prim_path="/World/Jetbot",
name="my_jetbot",
position=np.array([0, 0.0, 2.0])
)
)
my_controller = DifferentialController(name="simple_control")
my_world.scene.add_default_ground_plane()
command_ = [0.0, 0.0]
def sub_keyboard_event(event, *args, **kwargs):
"""Handle keyboard events
w,s,a,d as arrow keys for jetbot movement
Args:
event (int): keyboard event type
"""
global command_
if(
event.type == carb.input.KeyboardEventType.KEY_PRESS
or event.type == carb.input.KeyboardEventType.KEY_REPEAT
):
if event.input == carb.input.KeyboardInput.W:
command_ = [20, 0.0]
if event.input == carb.input.KeyboardInput.S:
command_ = [-20, 0.0]
if event.input == carb.input.KeyboardInput.A:
command_ = [0.0, np.pi / 5]
if event.input == carb.input.KeyboardInput.D:
command_ = [0.0, -np.pi / 5]
if(event.type == carb.input.KeyboardEventType.KEY_RELEASE):
command_ = [0.0, 0.0]
return True
appwindow_ = omni.appwindow.get_default_app_window()
input_ = carb.input.acquire_input_interface()
keyboard_ = appwindow_.get_keyboard()
sub_keyboard_ = input_.subscribe_to_keyboard_events(keyboard_,sub_keyboard_event)
my_world.reset()
while simulation_app.is_running():
my_world.step(render=True)
if my_world.is_playing():
my_jetbot.apply_wheel_actions(my_controller.forward(command=command_))
simulation_app.close()
效果如下,用鍵盤的 WASD 可以控制小車運動:
更多的 API 可以參考官方的文檔,后續(xù)再補充更多內(nèi)容。
審核編輯 :李倩
-
仿真
+關注
關注
50文章
4091瀏覽量
133663 -
ROS
+關注
關注
1文章
278瀏覽量
17022 -
深度學習
+關注
關注
73文章
5504瀏覽量
121217
原文標題:Isaac “家族” 揭秘 | 知乎大咖深度解讀系列(1)
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達企業(yè)解決方案】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論