當前位置: 華文星空 > 知識

一個簡陋的人機協作Demo

2022-02-04知識

背景

ABB今年推出了一款新的協作機器人CRB1100,這款機器人本體方面其實和傳統的工業機器人是一樣的,也就是IRB1100.

之所以說它是協作機器人是在機器人的前面加了一個用於檢測是否有東西接近的安全激光, 這個安全激光可以設定不同的檢測區域,同時監控機器人速度,位置等資訊。當某些區域出現物體時,機器人的速度會降低,甚至停止,從而實作人和機器人在同一空間內工作,不需要圍欄,也就是人機協作。

這項技術的套用在ABB已經有超過十年的歷史,也就是所謂的SafeMove。套用這項技術,其實不管機器人是小負載的六軸機器人,還是幾百公斤負載的機器人都可以允許人接近機器人,在同一空間內工作。

SafeMove - IRC5 Options (IRC5 Controller | ABB Robotics)

激光用於安全檢測最普遍的還不是機械臂行業,而是移動機器人甚至是無人駕駛的汽車上。一般來說無論是SLAM還是磁導航的AGV都會配備激光傳感器,檢測是否有障礙物。

激光檢測障礙物是目前最穩定且最成熟的安全解決方案。

另一個安全檢測的解決思路是視覺,視覺的優點也很明顯:相機成本更低,傳遞的資訊更加豐富(線掃激光只有2維平面),且在極端天氣下影響更小。雖然視覺精度比激光低,但是對於檢測障礙物來說是夠用的。

所以我嘗試了用相機來搭一個簡單的demo,透過檢測相機視野內是否有人,然後發送給機器人。

方案

流程:1)相機不停的拍照片 2)判斷圖片中是否有人或者有人的身體 3)如果有人則給機器人控制器發送有人,沒人則發送沒人。

核心就是判斷相機有沒有人,這我偷了個懶,。。。。用了百度AI平台的一個多物體檢測的工具,只需要把圖片發到百度雲上,百度會返回一個jason數據,返回圖片中的有哪些物體。

因為我的目的只是判斷有沒有人就可以,所以不需要做目標位置檢測,只需要做分類就可以。

具體常式可以參考下面的連結,內送流量備援容錯機制體檢測這個功能有1w次的免費檢測額度。

感謝我侄子最近放暑假在我家,我看他用百度AI平台來做語音轉文字,so easy。。所以我才了解到有這個工具。類似的AI平台應該很多,可以挖掘一下。

當然如果真的是用於安全檢測,這種雲端的方式肯定不行,需要在本地進行部署,而且相機也可能不知一個。

給機器人發送有沒有人的資訊用的Robotstudio來做仿真,通訊方式就是socket發送資訊,所以不需要買一個機器人來實驗。

RobotStudio去年免費了一年,今年還是不是免費不太確定。

實作

首先,百度AI平台需要一個鑒權認證,目的是繫結個人的賬戶,這樣後面就知道你用了多少次他們的服務,才好收錢嘛。。。。。具體參考:

通用參考 - 鑒權認證機制 | 百度AI開放平台 (baidu.com)

''' ! Description: ! Detect person and send to robot ! Author: Kaiyuan Cao ! Version: 1.0 ''' # encoding:utf-8 import requests import base64 import pp import json import socket import cv2 #baidu鑒權認證 host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官網獲取的AK】&client_secret=【官網獲取的SK】' response = requests . get ( host ) if response : resp = response . json () access_token = resp [ 'access_token' ]

然後繫結機器人的socket埠,這裏相機斷作為Server,機器人端做Client, 因為我都是在本機跑的,所以IP用127.0.0.1。port隨便寫一個,如果和機器人連上了,打印連線的地址。

#connect robotstudio 埠 s = socket.socket() host='127.0.0.1' port=8008 s.bind((host,port)) # 繫結伺服端地址和埠 s.listen(5) c, addr = s.accept() # 返回客戶端地址和一個新的 socket 連線 print( 'Connected with', addr)

前面import 了cv2主要就是保存個圖片用

#選擇相機 cap=cv2.VideoCapture(0) i=0 message='nobody'

然後就是迴圈「檢測-->返回檢測結果-->判斷檢測結果-->發送給機器人」

這裏相機圖片1000ms才存一張,所以看起來會一卡一卡的,主要目的還是省錢。。。。減少檢測的次數。。。

檢測那部份就是無腦copy就可以了,百度雲會返回一長串的jason數據,有興趣可以看看,我這邊只用他result部份,判斷裏面有沒有人,以及可信度多少就可以了。

while ( 1 ): ret , frame = cap . read () cv2 . imshow ( "capture" , frame ) #保存相機圖片 if ret == True : gray = cv2 . resize ( frame ,( 640 , 480 )) #影像大小為320*240 cv2 . imwrite ( 'C:/Users/CNKACAO1/Pictures/test picture/Laptop_Carema/environment.jpg' , gray ) i += 1 cv2 . waitKey ( 1000 ) #不斷重新整理影像,重新整理頻率1000ms # 二進制方式開啟圖片檔 f = open ( 'C:/Users/CNKACAO1/Pictures/test picture/Laptop_Carema/environment.jpg' , 'rb' ) img = base64 . b64encode ( f . read ()) #人體檢測 request_url = "https://aip.baidubce.com/rest/2.0/image- classify/v2/advanced_general" params = { "image" : img } request_url = request_url + "?access_token=" + access_token headers = { 'content-type' : 'application/x-www-form-urlencoded' } response = requests . post ( request_url , data = params , headers = headers ) if response : result = response . json () . get ( 'result' ) for object in result : if object . get ( 'root' ) == '人物-人物特寫' and ( object . get ( 'score' ) > 0.4 ): #如果有人message置1 message = 'Somebody' break else : message = 'Nobody' #如果沒人message置0 c . send ( message . encode ( "utf-8" )) #發送給robotstudio print ( message ) print ( result )

實際跑下來,如果人在螢幕中占比比較大的情況下檢測效果還是非常不錯的,而人一旦比較遠就會出現檢測不到人的情況,而如果只出現人的一些部位,比如手掌,也可以檢測出來,畢竟不是專門用來做人體檢測的工具,跑個demo效果還不錯。

在robotstudio端需要設定一下socket介面,這裏要註意的是,在配置系統的時候,需要在pc-interface這個選項上打勾才能使用socket。

ABB 機器人裏用的是rapid語言, 主要是建立一個socket介面,連線一下,然後就等著接收數據。

MODULE Module1 !*********************************************************** ! ! Module : Module1 ! ! Description : ! < Insert description here > ! ! Author : Kaiyuan Cao ! ! Version : 1.0 ! !*********************************************************** !*********************************************************** ! ! Procedure main ! ! This is the entry point of your program ! !*********************************************************** PROC main () VAR socketdev socket1 ; VAR string receive_string ; SocketClose socket1 ; SocketCreate socket1 ; SocketConnect socket1 , "127.0.0.1" , 8008 ; TPWrite "CONNECTED" ; WHILE TRUE DO SocketReceive socket1 \ Str : = receive_string ; TPWrite receive_string ; ENDWHILE ENDPROC ENDMODULE

實際跑下來效果還可以

我用的是我的筆記本網絡攝影機,也不知道為什麽會有0.35的score檢測到美女,So stupid。。。。

這個demo基本就到這裏了。。。

簡陋 但是勝在不需要花錢。。。