NVIDIAISAAC軟件開發(fā)工具包的模塊化和易于使用的感知堆棧繼續(xù)加速各種移動機器人的發(fā)展。ISAAC引入了PythonAPI,使那些熟悉Python的人更容易構(gòu)建機器人應(yīng)用程序。
在這篇文章中,我們將探討這個特性,并分享如何使用Python構(gòu)建您自己的ISAAC應(yīng)用程序的分步指南。我們在ISAACSDK中介紹Python編程,并舉例說明如何創(chuàng)建應(yīng)用程序;如何使用代碼、模塊和數(shù)據(jù)流;以及如何處理不同的數(shù)據(jù)類型。我們用示例來總結(jié)文章,將子圖添加到同一個應(yīng)用程序中,并將其部署到Jetson上。我們還將向您展示如何使用Jupyter筆記本電腦,這是一個面向Python開發(fā)人員的強大UI工具。對于更高級的Python開發(fā)人員,我們還提供了在移動機器人上部署ISAAC應(yīng)用程序以及在ISAACSim中部署協(xié)作機器人手臂的例子。
圖1。使用Jupyter筆記本和ISAACSDKPythonAPI在ISAACSim中控制虛擬機器人。
ISAACSDK中Python編程入門
為了指導(dǎo)您使用Python創(chuàng)建一個ISAAC應(yīng)用程序,請創(chuàng)建一個應(yīng)用程序文件。從apps文件夾下的新文件夾開始,//apps/mybot。用下面的代碼創(chuàng)建一個構(gòu)建文件,并將其保存在//apps/mybot/BUILD下,以便Bazel能夠識別它。
ISAACSDK中Python編程入門為了指導(dǎo)您使用Python創(chuàng)建一個ISAAC應(yīng)用程序,請創(chuàng)建一個應(yīng)用程序文件。從apps文件夾下的新文件夾開始,//apps/mybot。用下面的代碼創(chuàng)建一個構(gòu)建文件,并將其保存在//apps/mybot/BUILD下,以便Bazel能夠識別它。
load("http://engine/build:","isaac_py_app")isaac_py_app(name="mybot",srcs=[""],data=[],modules=[],deps=["http://engine/pyalice",],)
在構(gòu)建文件中,//engine/pyalice是PythonAPI的支持代碼,是用Python編寫的robot應(yīng)用程序。將下面的代碼放入//apps/mybot/并用bazelrunapps/mybot:mybot運行它。您可以通過控制臺spew判斷它正在運行,您可以使用經(jīng)典的CTRL-C隨時停止它。
fromimportApplicationapp=Application(name="mybot")()了解代碼、模塊和數(shù)據(jù)流
ISAACSDK為機器人應(yīng)用程序提供了許多構(gòu)建塊,稱為代碼。
其中一些代碼可以按原樣提供,比如錄音機。其他模塊打包為模塊,必須在代碼集可用之前顯式加載這些模塊。將以下模塊添加到剛剛創(chuàng)建的Bazel構(gòu)建文件中,以便加載它們。
modules=["message_generators","viewers",],
現(xiàn)在可以使用在之前創(chuàng)建的應(yīng)用程序?qū)嵗龔腜ython加載它們:
_module('message_generators')_module('viewers')
在ISAACSDK中,數(shù)據(jù)由傳感器生成,并在代碼實例之間流動,直到它們被執(zhí)行器消耗。要從加載的codelet創(chuàng)建實例,請在調(diào)用之前將以下代碼添加到Python應(yīng)用程序應(yīng)用程序運行.
node_src=('src')component_src=\node_(_,'ImageLoader')
這里創(chuàng)建了一個名為src的節(jié)點。消息生成器模塊提供的ImageLoader的組件以ImageLoader的名稱創(chuàng)建,并附加到src的節(jié)點上。它將指定PNG文件中的圖像數(shù)據(jù)作為ColorCameraProto消息發(fā)布,就像它們來自真實的相機一樣。您可以指定要從中加載數(shù)據(jù)的圖像以及其他幾個參數(shù)以及消息發(fā)布的頻率。有關(guān)詳細信息,請參閱ISAAC消息_generators.ImageLoader。
三維立體分揀機器人component_['color_filename']='/home/bob/Pictures/'component_['focal_length']=[35.0,35.0]component_['optical_center']=[300.0,400.0]component_['tick_period']='1hz'
node_sink=('sink')component_sink=\node_(,'ColorCameraViewer')
數(shù)據(jù)應(yīng)該在代碼之間流動。但是,必須在它們之間建立連接才能使數(shù)據(jù)流動。從文檔中可以看出,CameraGenerator有三個輸出通道。選擇ColorCameraProto消息發(fā)布到的color_left頻道。類似地,您可以看到ColorCameraViewer代碼從color_listener通道讀取消息。連接它們:
(component_src,'color',component_sink,'color_listener')
再次運行應(yīng)用程序,并檢查Sight是否有圖像。
在Python中使用不同的ISAAC圖像數(shù)據(jù)類型ISAACSDK允許您在應(yīng)用程序中使用多個數(shù)據(jù)源:
記錄的傳感器數(shù)據(jù)模擬傳感器數(shù)據(jù)在本節(jié)中,我們將解釋如何在Python應(yīng)用程序中使用這些數(shù)據(jù)類型。
使用攝像頭ISAACSDK支持許多帶有V4L2Cameracodelet的USB攝像頭。
在本節(jié)中,您將使用Realsense攝像頭,它由realsense模塊中的RealsenseCamera代碼集支持。類似地,你可以從視線中看到攝像機鏡頭,就像之前的圖像一樣。因為這是對ImageLoader的直接替換,所以可以使用命令行參數(shù)在它們之間進行切換。有關(guān)如何在Python中處理命令行參數(shù)的更多信息,argparse-命令行選項、參數(shù)和子命令的解析器。您將得到如下代碼示例:
parser=(description='SamplePythonAPIapp')_argument('--source',type=str,dest='source',help='Thesourcetogetdatafrom',choices=['camera','image'],default='camera')args,_=_known_args()if=='image':_module('message_generators')component_src=\node_(_,'src')component_['color_filename']='/home/bob/Pictures/'component_['focal_length']=[35.0,35.0]component_['optical_center']=[300.0,400.0]component_['tick_period']='1hz'(component_src,'color',viewer_component,'color_listener')elif=='camera':_module('realsense')camera=("cam").add()=480=640_framerate=30_framerate=30(camera,'color',viewer_component,'color_listener')()
如前所示,PythonAPI提供了處理不同環(huán)境的靈活性。
使用木桶使用真實的傳感器數(shù)據(jù)是直觀的,但是這樣做并不總是實際可行的。木桶能幫上忙。Cask是用于記錄ISAACSDK中的消息的格式。在ISAACSDK中,可以記錄一個消息流,并在以后回放以用于調(diào)試或分析。要從Realsense攝像頭錄制圖像流,請嘗試在//apps/samples/camera:record_realsense運行示例應(yīng)用程序。
有了錄音桶,你可以在沒有真正的傳感器的情況下隨時隨地重放和播放消息流。假設(shè)記錄的容器位于/home/bob/cask/的文件夾中。您可以使用Replay代碼來檢索消息:
player_node=('player')player_component=player_()player_['cask_directory']='/home/bob/cask'(player_component,'color',viewer_component,'color_listener')
類似地,您可以向Python應(yīng)用程序添加一個cask作為一個可能的選項,就像您使用realsenesscamera一樣。這里,名稱color是用于記錄彩色相機圖像流的通道名稱。然后你就可以查看視頻流,就好像它來自真實的攝像機一樣。
使用模擬傳感器如前所述,您已經(jīng)有了一個Python應(yīng)用程序,可以在記錄的傳感器數(shù)據(jù)和真實傳感器數(shù)據(jù)之間切換?,F(xiàn)在再添加一個可能的數(shù)據(jù)源:來自ISAACSimUnity3D的模擬傳感器。將Sim選項添加到命令行參數(shù)源,并將模擬相機消息流連接到查看器以進行可視化,如以下代碼示例所示:
_argument('--source',type=str,dest='source',help='Thesourcetogetdatafrom',choices=['cask','camera','image','sim'],default='sim')…if=='image':...elif=='cask':...elif=='camera':...elif=='sim':('packages/navsim/apps/navsim_')('interface/output','color','viewer/ColorCameraViewer','color_listener')()
檢索ISAAC是Unity3D。有關(guān)詳細信息,請參閱ISAACSimUnity3D。
啟動ISAAC是Unity3D:
快遞分揀機器人多少錢./build/_64--scenemedium_warehouse
默認(rèn)情況下,Python應(yīng)用程序嘗試與同一主機上的模擬對話。如果應(yīng)用程序正在另一臺主機上運行,請為組件interface/output配置相應(yīng)的主機參數(shù)。有關(guān)詳細信息,請參閱。運行該應(yīng)用程序,模擬攝像機的鏡頭可以看到。
鏡頭來自安裝在模擬機器人上的模擬攝像機。試著在模擬圖形用戶界面上玩一些可移動的物體,比如納米盒子,看看模擬相機的工作原理和真相機一樣。
用子圖把它拉到一起正如您所注意到的,組件和連接它們的邊組成了一個圖形。這樣的圖可以從JSON文件加載,也可以根據(jù)需要從Python應(yīng)用程序加載。有關(guān)詳細信息,請參閱MIG。
例如,模擬通信子圖packages/navsim/apps/navsim_封裝了用于使用TCP與ISAACSimUnity3D或NVIDIAOmniverse通信的節(jié)點、組件和邊。要使其對應(yīng)用程序可用,請將以下Bazel數(shù)據(jù)依賴項添加到您先前創(chuàng)建的生成文件中:
data=["http://packages/navsim/apps:navsim_tcp_subgraph",],
在Python應(yīng)用程序中,可以使用以下命令加載它:
('packages/navsim/apps/navsim_')
子圖組件更像是由一組節(jié)點組成的配方,而不是容器。加載子圖更像是按照配方創(chuàng)建節(jié)點和組件。在視圖中,您可以看到從子圖創(chuàng)建的所有節(jié)點。通過將它們與其他節(jié)點連接,可以使用創(chuàng)建更復(fù)雜的應(yīng)用程序。
圖4。顯示各種子圖使用情況的計算圖。
當(dāng)加載多個子圖時,命名沖突MIGht會發(fā)生,因為在任何應(yīng)用程序中,節(jié)點都需要具有唯一的名稱。若要避免此類沖突,請使用另一個參數(shù)加載子圖:
('packages/navsim/apps/navsim_','simulation',)
這里,第二個參數(shù)是JSON文件中指定的所有節(jié)點的“nodenameprefix”。例如,packages/navsim/apps/navsim_文件指定一個名為interface的節(jié)點。前面的語句將創(chuàng)建一個名為的節(jié)點,而不是interface。
在Jetson上部署應(yīng)用程序現(xiàn)在有了一個Python應(yīng)用程序。在真正的Jetson板上運行只需要一個命令:
./engine/build/-h-p//apps/mybot:mybot-pkg-djetpack43
有關(guān)將應(yīng)用程序部署到Jetson的更多信息,請參閱入門和在Jetson上部署和運行。
使用SSH連接到您的Jetson板或從GUI打開一個終端并檢查文件夾/home/nvidia/deploy/bob/mybot-pkg。如果您在Jetson和開發(fā)設(shè)置上使用不同的用戶名,請將nvidia替換為Jetson板上的用戶名,將bob替換為開發(fā)設(shè)置上的用戶名。
使用以下命令在Jetson上運行應(yīng)用程序:
nvidia@Jetson:~/deploy/bob/mybot-pkg$./runapps/mybot/
如果您正在使用存儲庫之外的資源,請考慮將它們添加到應(yīng)用程序的Bazel依賴項中,以便可以使用將它們與應(yīng)用程序一起自動部署到。
如果您在PC機上使用ISAACSimUnity3D,則可以正常通信。
使用Jupyter筆記本因為這里有pythonapi,所以Jupyter筆記本肯定可以工作。將以下生成文件與空的一起使用:
isaac_jupyter_app(name="mybot",modules=["message_generators","viewers",],notebook="",)
以類似于Jetson板或X86工作站的方式部署應(yīng)用程序,并使用以下命令啟動Jupyter:
jupyternotebookapps/mybot/
你現(xiàn)在可以走了。run函數(shù)被阻塞,只有在robotic應(yīng)用程序停止時才返回。要以交互方式使用robotics應(yīng)用程序,請相應(yīng)地使用start和stop函數(shù)。
Python在模擬移動機器人中的應(yīng)用在使用模擬傳感器工作的部分,有一個模擬機器人,上面安裝了模擬攝像機。ISAACSimUnity3D是用來模擬移動機器人的。對于在ISAACSimUnity3D中控制帶有差分基座的模擬機器人的示例robot應(yīng)用程序,請檢查//apps/navsim:navsim_navigate中的應(yīng)用程序。組件和子圖可以在JSON文件apps/navsim/navsim_中找到。有關(guān)詳細信息,請參見ISAACSimUnity3D。
用Python模擬機器人手臂除了移動機器人,用Jupyter筆記本電腦進行簡單的聯(lián)合控制SDK也可以用于構(gòu)建機器人手臂的應(yīng)用程序。有了OmniverseISAAC,你可以在沒有真正硬件的情況下使用模擬機械手臂。有關(guān)更多信息,請按照用Jupyter筆記本電腦進行簡單的聯(lián)合控制上的“UR10in用Jupyter筆記本電腦進行簡單的聯(lián)合控制用Jupyter筆記本電腦進行簡單的聯(lián)合控制Sim”會話說明操作。應(yīng)用程序?qū)⒃谀M中控制機械臂,如圖5所示。
圖5。通用機器人的UR10正在使用Jupyter筆記本電腦進行模擬控制。
以下是應(yīng)用程序中發(fā)生的情況。第一件事是加載一個子圖,允許通過TCP與模擬器通信。
(filename="packages/navsim/apps/navsim_",prefix="simulation")
若要為關(guān)節(jié)生成平滑運動,請為節(jié)點加載另一個子圖:
流水線分揀機器人設(shè)計(filename="packages/planner/apps/multi_joint_lqr_",prefix="lqr")
該子圖封裝LQR規(guī)劃器的節(jié)點,生成當(dāng)前關(guān)節(jié)狀態(tài)和目標(biāo)關(guān)節(jié)位置的命令。將仿真節(jié)點與規(guī)劃器的節(jié)點連接起來,以使機械臂關(guān)節(jié)狀態(tài)消息和命令消息在它們之間流動:
(simulation_node["output"],"joint_state",lqr_interface,"joint_state")(lqr_interface,"joint_command",simulation_node["input"],"joint_position")
用Python編碼的代碼集PyCodeletJointPositionControl從滑塊讀取目標(biāo)關(guān)節(jié)位置值,并將這些值作為CompositeProto消息發(fā)布:
蜘蛛手分揀機器人大概價格classJointPositionControl(Codelet):defstart(self):=_proto_tx("CompositeProto","command")self._widget=CompositeWidget("position",)deftick(self):_msg=self._()
有關(guān)詳細信息,請參見創(chuàng)建Python代碼。
然后,JointPositionControl代碼集連接到一個節(jié)點,并連接到LQRplanner的目標(biāo)輸入通道:
widget_node=("command_generator")joint_commander=widget_(JointPositionControl)(joint_commander,"command",lqr_interface,"joint_target")
啟動應(yīng)用程序應(yīng)用程序啟動你可以隨意使用手臂。
帶模擬攝像機的模擬機械臂在OmniverseISAACSim中,要有一個帶攝像頭的機械臂,請加載stageomni:/Isaac/Samples/Isaac_SDK/Scenario/sortbot_。在OmniverseISAACSim中啟動仿真和機器人引擎橋,并將視口從透視切換到腕部攝影機,如圖6和7所示。
圖6。ISAACSim中機器人的透視圖。
與之前的應(yīng)用程序一樣,您可以將模擬攝影機通道連接到ColorCameraViewer代碼板以可視化畫面,并將DepthCameraViewer連接到可視化模擬深度傳感器數(shù)據(jù)。
_module("viewers")viewers=("viewers")color_viewer=(,"ColorViewer")(simulation_node["output"],"color",color_viewer,"color_listener")depth_viewer=(,"DepthViewer")(simulation_node["output"],"depth",depth_viewer,"depth_listener")depth__visualization_depth=3
圖7。ISAAC模擬中機器人的手腕視圖。
總結(jié)在本文中,您使用pythonapi從頭創(chuàng)建了一個機器人應(yīng)用程序。您使應(yīng)用程序可以使用真實的攝影機、錄制的攝影機數(shù)據(jù)和模擬攝影機。我們還向您展示了如何使用pythonapi處理模擬移動機器人和模擬機械臂。做機器人玩得開心!
YangLiu是一名軟件工程師,負(fù)責(zé)開發(fā)NVIDIAISAACSDK的各個部分。他獲得了達拉斯德克薩斯大學(xué)計算機科學(xué)博士學(xué)位。
審核
物流分揀機器人原理圖智能分揀機器人的發(fā)展規(guī)化