本文轉載自微軟發布的關于chatGPT擴展到機器人領域的能力。以下內容選擇部分內容,關于chatGPT控制機械臂,以完成繪制微軟徽標的過程。
我們將 ChatGPT 的功能擴展到機器人,并通過語言直觀地控制機器人手臂、無人機和家庭助理機器人等多個平臺。
你有沒有想過用你自己的話告訴機器人該怎么做,就像你對人類一樣?只是告訴你的家庭助理機器人:“請加熱我的午餐”,然后讓它自己找到微波爐,這不是很神奇嗎?盡管語言是我們表達意圖的最直觀方式,但我們仍然嚴重依賴手寫代碼來控制機器人。我們的團隊一直在探索如何改變這一現實,并使用OpenAI的新AI語言模型ChatGPT實現自然的人機交互。
ChatGPT 是一種在大量文本和人類交互語料庫上訓練的語言模型,使其能夠對各種提示和問題生成連貫且語法正確的響應。我們這項研究的目標是看看ChatGPT是否可以超越文本思考,并推理物理世界來幫助完成機器人任務。我們希望幫助人們更輕松地與機器人互動,而無需學習復雜的編程語言或有關機器人系統的詳細信息。這里的關鍵挑戰是教 ChatGPT 如何解決考慮物理定律、操作環境背景以及機器人的物理動作如何改變世界狀態的問題。
事實證明,ChatGPT 可以自己做很多事情,但它仍然需要一些幫助。我們的技術論文描述了一系列設計原則,可用于指導語言模型解決機器人任務。這些包括但不限于特殊的提示結構、高級 API 和通過文本的人工反饋。我們相信,我們的工作只是我們開發機器人系統方式轉變的開始,我們希望激勵其他研究人員進入這個令人興奮的領域。繼續閱讀有關我們的方法和想法的更多技術細節。
當今機器人技術面臨的挑戰,以及 ChatGPT 如何提供幫助
當前的機器人管道始于工程師或技術用戶,他們需要將任務的要求轉換為系統代碼。工程師坐在循環中,這意味著他們需要編寫新的代碼和規范來糾正機器人的行為。總的來說,這個過程很慢(用戶需要編寫低級代碼),昂貴(需要具有深厚機器人知識的高技能用戶)和低效(需要多次交互才能使事情正常工作)。
ChatGPT 解鎖了一種新的機器人范式,并允許(潛在的非技術)用戶坐在循環中,在監控機器人性能的同時向大型語言模型 (LLM) 提供高級反饋。通過遵循我們的設計原則,ChatGPT 可以為機器人場景生成代碼。無需任何微調,我們就利用LLM的知識來控制各種任務的不同機器人外形。在我們的工作中,我們展示了ChatGPT解決機器人難題的多個示例,以及在操縱,空中和導航領域的復雜機器人部署。
使用ChatGPT的機器人技術:設計原則
催生法學碩士是一門高度實證的科學。通過反復試驗,我們構建了一種方法和一套設計原則,用于編寫機器人任務的提示:
1. 首先,我們定義一組高級機器人 API 或函數庫。該庫可以特定于特定的機器人,并且應映射到機器人的控制堆棧或感知庫中的現有低級實現。為高級 API 使用描述性名稱非常重要,這樣 ChatGPT 就可以推理它們的行為;
2. 接下來,我們為 ChatGPT 編寫一個文本提示,描述任務目標,同時明確說明高級庫中的哪些函數可用。提示還可以包含有關任務約束的信息,
3. 或者 ChatGPT 應該如何形成它的答案(特定的編碼語言,使用輔助解析元素);用戶通過直接檢查或使用模擬器來評估 ChatGPT 的代碼輸出。如果需要,用戶使用自然語言向 ChatGPT 提供有關答案質量和安全性的反饋。
4.當用戶對解決方案感到滿意時,可以將最終代碼部署到機器人上。
理論夠了...ChatGPT到底能做什么?
讓我們看一個例子...您可以在我們的代碼存儲庫中找到更多案例研究。
(這里我們只舉例一個比較有趣的例子,原文中還有其他機器人的例子)
循環用戶:當復雜任務需要對話時
接下來,我們在機器人手臂的操作場景中使用了 ChatGPT。我們使用對話反饋來教模型如何將最初提供的 API 組合成更復雜的高級函數:ChatGPT 自己編碼。使用基于課程的策略,該模型能夠將這些學到的技能邏輯地鏈接在一起,以執行堆疊塊等操作。
此外,該模型還展示了一個有趣的示例,即在用木塊構建Microsoft徽標時橋接文本域和物理域。它不僅能夠從其內部知識庫中調用徽標,還能夠“繪制”徽標(作為SVG代碼),然后使用上面學到的技能來確定哪些現有的機器人動作可以構成其物理形式。
以下是與chatGPT關于如何控制機器人手臂以制作具有Microsoft徽標顏色的SVG文件的對話。
用戶:
想象一下,我們正在使用一個機械手機器人。這是一個具有 6 個自由度的機械臂,其末端執行器上連接著一個抽吸泵。我希望你能協助我向這個機器人發送命令,給定一個場景和一個任務。
在任何時候,您都可以訪問以下功能:
grab():打開抽吸泵抓取物體
release():關閉抽吸泵以釋放物體
get_position(對象):給定一個對象名稱的字符串,返回真空泵接觸對象頂部的坐標和方向 [X, Y, Z, Y, 偏航, 俯仰, 滾動]
move_to(位置):它將抽吸泵移動到給定位置 [X, Y, Z, 偏航, 俯仰, 橫滾]。
您可以使用這些函數創建新函數,但不允許使用任何其他假設函數。
保持解決方案簡單明了。位置以毫米為單位,角度以度為單位。您也可以使用標簽“問題 - ”提出澄清問題。下面是一個示例方案,演示了如何提出澄清問題。
假設一個場景包含兩個球體。
聊天:
問題 - 有兩個領域。你想讓我拿哪一個?
用戶:
球體 1,請。使用 python 代碼來表達您的解決方案。準備好了嗎?
聊天:
是的,我準備好了。請描述場景和任務。
用戶:
場景中有以下對象:白墊、方框、藍方塊、黃色方塊、綠色方塊、紅色方塊、棕色方塊 1、棕色方塊 2。這些積木是高度為 40 毫米的立方體,位于 80 毫米深的盒子內。這些塊只能從盒子的頂部到達。我想讓你學習撿起一個物體并握住它的技巧。為此,您需要在物體上方移動安全距離(100 毫米),到達物體,抓住它并將其提起。
聊天:
理解。這是一個 Python 函數,它采用對象的名稱,將機器人手臂移動到對象上方,抓住它,然后將對象移動到對象上方 100 毫米的安全距離。請注意,該函數假定機器人手臂最初處于安全的起始位置。
import timedef pick_up_object(object_name):# get the position of the objectobject_pos = get_position(object_name)# move the robot arm to a safe position above the objectsafe_pos = [object_pos[0], object_pos[1], object_pos[2]+100, object_pos[3], object_pos[4], object_pos[5]]move_to(safe_pos)# move the robot arm to the object's positionmove_to(object_pos)# grab the objectgrab()time.sleep(1) # wait for the object to be firmly attached# move the robot arm back to the safe position above the objectmove_to(safe_pos)
要使用此功能,只需調用pick_up_object并以字符串形式提供要拾取的對象的名稱,例如 pick_up_object(“紅色塊”)。
用戶:
偉大!現在我想讓你學習如何在一個位置放置和反對。考慮到您拿著一個通用對象,您首先需要移動到目標位置上方的安全位置,將對象放下,然后釋放它。
聊天:
理解。這是一個Python函數,它占據了應該放置物體的位置,將機器人手臂移動到該位置上方,將物體放下,然后釋放它。請注意,該函數假定機器人手臂正在握住一個物體。
def place_object(position):# move the robot arm to a safe position above the target locationsafe_pos = [position[0], position[1], position[2]+100, position[3], position[4], position[5]]move_to(safe_pos)# move the robot arm to the target locationmove_to(position)# release the objectrelease()# move the robot arm back to the safe position above the target locationmove_to(safe_pos)
要使用此功能,只需調用 place_object 并將目標位置作為 6 個數字的列表提供,例如 place_object([100, 200, 50, 0, 0, 0])。請注意,位置的單位以毫米為單位,方向角以度為單位。
用戶:
偉大!現在我希望你使用這些技能來撿起綠色塊并放在白色墊子上。所有塊的高度均為 40 毫米。
聊天:
確定!這是Python代碼,用于拾取綠色塊并將其放在白色墊上:
# get the positions of the green block and white padgreen_pos = get_position("green block")white_pos = get_position("white pad")# pick up the green blockpick_up_object("green block")# calculate the position to place the block on the white padplace_pos = [white_pos[0], white_pos[1], white_pos[2]+40, 0, 0, 0]# place the block on the white padplace_object(place_pos)
此代碼使用 get_position 函數獲取綠色塊和白墊的位置,使用我們之前定義的pick_up_object函數拾取綠色塊,計算將塊放置在白墊上的位置,并使用我們之前定義的place_object函數將塊放置在白墊上。請注意,我們將塊的高度(40 mm)添加到白色墊子的高度上,以確保塊放置在墊子的頂部。
用戶:
偉大!現在我希望你把兩個棕色塊堆疊在綠色塊的頂部。
聊天:
確定!以下是將兩個棕色塊堆疊在綠色塊頂部的 Python 代碼:
# get the positions of the green block and both brown blocksgreen_pos = get_position("green block")brown1_pos = get_position("brown block 1")brown2_pos = get_position("brown block 2")# pick up the first brown blockpick_up_object("brown block 1")# calculate the position to place the block on top of the green blockplace_pos = [green_pos[0], green_pos[1], green_pos[2]+40, 0, 0, 0]# place the first brown block on top of the green blockplace_object(place_pos)# pick up the second brown blockpick_up_object("brown block 2")# calculate the position to place the block on top of the first brown blockplace_pos = [green_pos[0], green_pos[1], green_pos[2]+80, 0, 0, 0]# place the second brown block on top of the first brown blockplace_object(place_pos)
此代碼使用 get_position 函數獲取綠色塊和兩個棕色塊的位置,使用我們之前定義的 pick_up_object 函數拾取第一個棕色塊,計算將第一個棕色塊放置在綠色塊頂部的位置,并使用我們之前定義的place_object函數將第一個棕色塊放在綠色塊的頂部。然后,它拾取第二個棕色塊,計算將第二個棕色塊放置在第一個棕色塊之上的位置,并使用我們之前定義的place_object函數將第二個棕色塊放在第一個棕色塊的頂部。請注意,我們將綠色塊的高度(40 mm)添加到前一個塊的高度上,以確保該塊放置在前一個塊的頂部。
用戶:
棒!我現在想使用這些塊在白墊上構建微軟的徽標。它由四種顏色組成,形成一個正方形,左下角為藍色,右下角為黃色,左上角為紅色,右上角為綠色。
聊天:
確定!以下是使用塊在白色墊上構建Microsoft徽標的Python代碼:
# get the positions of the blocks and the white padwhite_pad_pos = get_position("white pad")blue_pos = get_position("blue block")yellow_pos = get_position("yellow block")red_pos = get_position("red block")green_pos = get_position("green block")# pick up the blue blockpick_up_object("blue block")# calculate the position to place the blue blockplace_pos = [white_pad_pos[0]-20, white_pad_pos[1]-20, white_pad_pos[2]+40, 0, 0, 0]# place the blue block on the white padplace_object(place_pos)# pick up the yellow blockpick_up_object("yellow block")# calculate the position to place the yellow blockplace_pos = [white_pad_pos[0]+20, white_pad_pos[1]-20, white_pad_pos[2]+40, 0, 0, 0]# place the yellow block on the white padplace_object(place_pos)# pick up the red blockpick_up_object("red block")# calculate the position to place the red blockplace_pos = [white_pad_pos[0]-20, white_pad_pos[1]+20, white_pad_pos[2]+40, 0, 0, 0]# place the red block on the white padplace_object(place_pos)# pick up the green blockpick_up_object("green block")# calculate the position to place the green blockplace_pos = [white_pad_pos[0]+20, white_pad_pos[1]+20, white_pad_pos[2]+40, 0, 0, 0]# place the green block on the white padplace_object(place_pos)
此代碼使用 get_position 函數獲取白墊和所有四個塊的位置,使用我們之前定義的pick_up_object函數依次拾取每個塊,計算將塊放置在白墊上的位置,并使用我們之前定義的place_object函數將塊放在白墊上。我們使用塊顏色來確保正確構建徽標。我們將藍色塊放在左下角位置,黃色塊放在右下位置,紅色塊放在左上角位置,綠色塊放在右上角位置,如提示中指定。
將機器人技術帶出實驗室,走向世界
我們很高興發布這些技術,旨在將機器人技術帶給更廣泛的受眾。我們相信,基于語言的機器人控制將是將機器人技術帶出科學實驗室并交到日常用戶手中的基礎。
也就是說,我們確實強調,ChatGPT 的輸出并不意味著在沒有仔細分析的情況下直接部署在機器人上。我們鼓勵用戶利用仿真的強大功能,以便在潛在的實際部署之前評估這些算法,并始終采取必要的安全預防措施。我們的工作只代表了機器人領域大型語言模型交叉點的一小部分,我們希望激發未來的大部分工作。
審核編輯黃宇
-
機器人
+關注
關注
210文章
28205瀏覽量
206532 -
AI
+關注
關注
87文章
30146瀏覽量
268419 -
python
+關注
關注
56文章
4782瀏覽量
84453 -
OpenAI
+關注
關注
9文章
1043瀏覽量
6408 -
ChatGPT
+關注
關注
29文章
1548瀏覽量
7495
發布評論請先 登錄
相關推薦
評論