1.引言:
自OpenAI發布ChatGPT以來,世界正迅速朝著更廣泛地將AI技術融合到機器人設備中的趨勢發展。機械手臂,作為自動化與智能化技術的重要組成部分,在制造業、醫療、服務業等領域的應用日益廣泛。隨著AI技術的進步,機械手臂不僅能執行復雜的操作任務,還能通過自然語言處理技術進行更加直觀的交互,極大提高了靈活性和用戶友好性。
就比如說微軟的一個人工智能研究中心,研究如何用自然語言來控制機器人設備的一個研究,
所以我想做一個類似的項目,通過允許用戶使用自然語言來控制機械手臂,它可以大大降低機器人編程的門檻,使得非專業人士也能輕松地操作和實驗。
論文link:
https://www.microsoft.com/en-us/research/uploads/prod/2023/02/ChatGPT___Robotics.pdf
該項目一共分為上下兩篇,本篇文章主要內容是整個人工智能系統的設計和構建的過程,未來的下一篇文章將要介紹在開發項目的過程中遇到的而困難,如何解決,以及該項目有什么擴展的性的功能。
2.項目背景與動機:
想象如果有有一天,你命令一個機械臂“幫我收拾一下桌面,將垃圾丟到垃圾桶里”,機械臂就開始聽從命令,清理你的桌面的垃圾,那該是多么幸福的一件事情呀。
所以準備工作,我們需要一臺小型的機械臂(主要是大的機械臂太貴了),一臺能夠上網的電腦,以及一顆炙熱的心!該項目主要是借鑒微軟的那篇改變機器人使用的研究來入手。
3.技術概覽:
前提本項目是基于python的環境下進行編譯的。
首先我們先來介紹一下本項目會使用到的一些軟件層面上技術:
ChatGPT:(整個項目最關鍵的核心技術)
https://openai.com/chatgpt
ChatGPT是一項人工智能技術,基于GPT(Generative Pre-trained Transformer)模型的架構,GPT是一種基于深度學習的自然語言處理模型,通過大規模的無監督預訓練和有監督微調來實現語言理解和生成任務。
換句話來說,你可以簡單人理解為你在跟一個知識十分淵博的人進行聊天,你可以對它預設一些角色,例如“”你是一個醫生”,你就可以跟他聊醫學相關的知識,但是請注意并不是所生成的所有聊天都是正確的需要進行自我判斷。
Speech recognition:(搭配處理自然語言必不可少的功能模塊)
我們這邊使用的是Google的一種語音識別服務,Speech-to-text,它允許開發者將語音轉化成文本的形式。并且它也支持多種語言和方言,包括但不限于英語,西班牙語,法語,德語,中文等等,可以滿足全球用戶的需求。
你可以進行在線的嘗試語音轉文本:
https://cloud.google.com/speech-to-text?hl=en#features
pymycobot:(mycobot 280機械臂的控制功能模塊)
https://github.com/elephantrobotics/pymycobot
pymycobot 是大象機器人專門為了my系列產品的機械臂開發的控制模塊,這個功能模塊的開發,大大降低了機械臂編程控制的門檻。pymycobot 提供了大量的機械臂的控制接口,例如關節控制,坐標控制,配套的機械臂的夾爪控制等等,對機械臂變成的初學者是相當有好的。
解釋這些技術如何合作實現自然語言控制機械手臂的功能。
接下來介紹一下硬件設備:
mycobot 280 M5Stack
mycobot 280 M5Stack 是Elephant Robotics 和M5Stack 合作的一款6自由度的協作性機器人。它外觀結構設計小巧精致,一體式全包裹機身設計,采用高精度伺服電機,無任何外漏線纜。mycobot重量只有850g,機械臂末端最大的負載能夠達到250g,最大工作半徑達到280mm,重復定位精度能夠到0.5mm的誤差范圍內。
4.設計思路與實現過程:
https://www.youtube.com/watch?v=Sq1QZB5baNw&pp=ygUVY2hhdGdwdCBjb250cm9sIHJvYm90
大家可以看一下近期OpenAI發布的一條視頻,人跟機器人聊天,機器人來處理自然語言并且生成相對應的動作執行。
也有一些其他的額機械臂也集成了類似的場景。
https://www.youtube.com/watch?v=IGsYgSdrT4Y
我要做的項目就是類似于這個小型版!通過自然語言跟機械臂進行溝通,然后,機械臂執行相對應的指令。
接下來我將要說明項目的過程。
語音識別轉文本功能speech-to-text:
為什么要用語音識別轉文本功能呢?用過chatgpt的人知道chatgpt有內置的語音聊天的功能,但是我們要集成到PC端和機械臂當中去使用,就不能夠使用ChatGPT的web版本,而是要在本地的計算機當中實現,就要用到ChatGPT的API接口。
ChatGPT API的形式的話只能夠接收“文本”的形式來使用,所以speech-to-text可以講我們講話轉化成文本的形式輸入到電腦當中。
def speech_to_text(): recognizer = sr.Recognizer() with sr.Microphone() as source: print("start speaking...") audio = recognizer.listen(source) try: # text = recognizer.recognize_google(audio, language='zh-CN') text = recognizer.recognize_google(audio, language='en-US') print("you said: " + text) return text except sr.UnknownValueError: print("Google Speech Recognition could not understand audio") return None except sr.RequestError as e: print("Could not request results from Google Speech Recognition service; {0}".format(e)) return None
調用ChatGPT API &預訓練
獲取了語音的文本形式,就可以調用API在本地跟ChatGPT進行聊天了。以下是OpenAI 提供調用ChatGPT API的使用方法。
def generate_control_code(prompt): openai.api_key = '' prompt = f"{pre_training}The command the user wants to execute is:'{prompt}'." try: response = openai.Completion.create( engine="gpt-3.5-turbo", prompt=prompt, temperature=0.5, max_tokens=100, top_p=1.0, frequency_penalty=0.0, presence_penalty=0.0 ) code = response.choices[0].text.strip() return code except Exception as e: print(f"error: {e}") return ""
代碼當中的API_KEY需要自己去官方申請(需要付費)。
可以關注一下prompt這一句話,這將是要提及到的預訓練。
prompt = f"{pre_training}The command the user wants to execute is:'{prompt}'."
如果想要獲取精準的回復,需要提前給ChatGPT知道它需要干什么,要讓他干什么,按照我們的想法來輸出。我們先用web版本來進行測試,因為API的搭建比較復雜。
以下是我的prompt(針對于這個項目),我只想要它輸出機械臂執行的代碼給我所以我是這么做的。
Generate Python code that matches the following requirements: Use an instance of the MyCobotController class robot to perform a specific action. The instance already contains methods such as move_to_zero() to return to the initial position, grab_position() to move to the grab position, and plus_x_coords(value), plus_y_coords(value), plus_z_coords(value) to move specific distances on the X, Y, and Z axes. You don’t need to output other textual content, just output the code directly, for example, the robot arm returns to the origin. robot.move_to_zero() Here is what I said: I want the robot arm to return to the origin, and then go to the position to be grabbed to perform grabbing.
這里可以看到能夠成功的完成我的基本需求,但是他輸出了代碼的注釋,這會影響我們之后的結果,所以還是需要進行修改。(讓他只輸出代碼,不要輸出注釋。)
構建新的機械臂API
為什么要構建新的API呢,pymycobot不是已經提供了嗎?
當然,pymycobot 提供的API很全面,也很多。我們如果給的語音比較復雜,ChatGPT會生成其他的復雜的代碼可能會導致出錯。我根據我想要目前測試的一些需求構建了一個新的機械臂的API。
class MyCobotController: def __init__(self, port, baud): self.mc = MyCobot(port, baud) self.speed = 80 self.mode =0 self.coords = [] def grab_position(self): # self.mc.send_angles([4.83, 13.97, (-99.31), (-1.75), 4.39, (-0.26)], 80) self.mc.send_coords([149.2, (-48.3), 201.7, (-176.98), 4.55, (-84.66)], 80, 0) time.sleep(2) def move_to_zero(self): self.mc.send_angles([0,0,0,0,0,0],70) time.sleep(2) def gripper_open(self): self.mc.set_gripper_state(0,80,1) time.sleep(2)
目的是為了快速的將整個項目搭建起來,之后還可以在豐富其中的內容。
這么做是有原因的,比如說,要讓機械臂去到一個點位進行抓取,用pymycobot的方法可能是下面這樣的:
robot.send_angles([0,0,0,0,0,0],80) time.sleep(2) #open gripper robot.set_grippr_value(1,80,1) time.sleep(1) #clos grippr robot.set_grippr_value(0,80,1) time.sleep(1)
這樣的話就要輸出很多行的代碼,在其他復雜的情況下可能會導致出錯,重新構建一個方法的話咱就只需要調用一個方法就可以執行了,兩行代碼就能解決。
class Newmycobot(): def grab_action(self): self.send_angles([0,0,0,0,0,0],80) time.sleep(2) #open gripper self.set_grippr_value(1,80,1) time.sleep(1) #clos grippr self.set_grippr_value(0,80,1) time.sleep(1) robot = Newmycobot() robot.grab_action()
5.初步成果與展示:
我們先來個快速的調試,用web版本的ChatGPT來實踐一下。
復制生成的代碼去運行。
可以看到簡單的測試是OK的。
6. 結論:
本次的記錄就到這里,整個項目還未完成,在未來不久的日子里我將會繼續完善這個項目,下一篇的內容我會完善整個項目,以及分享一下在開發的過程出現的一些問題是如何進行解決的。如果你喜歡這篇文章的話,歡迎在下方留言給出你的想法。
審核編輯 黃宇
-
人工智能
+關注
關注
1791文章
47279瀏覽量
238513 -
機械臂
+關注
關注
12文章
515瀏覽量
24588 -
自然語言
+關注
關注
1文章
288瀏覽量
13350 -
ChatGPT
+關注
關注
29文章
1561瀏覽量
7675
發布評論請先 登錄
相關推薦
評論