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