這篇文章轉載來自SWITCH SCIENCE的SuzukiSumiya,本篇文章轉載已獲作者授權。
原文鏈接來自:https://www.switch-science.com/blogs/magazine/jetson-maker-faire-tokyo-2023
1.引言
這篇文章來自SWITCH SCIENCE的SuzukiSumiya 在Maker Faire Tokyo 2023上演示了通過模擬人手臂的姿態(tài)來控制機械臂。演示的內(nèi)容是使用USB攝像頭通過圖像識別估計手臂,并將mycobot制作成類似的手臂形狀。
視頻鏈接:https://youtu.be/h1H6pSvhQxQ
該項目主要使用Ultralytics YOLOv8來進行姿態(tài)的估計,結合機器視覺和機械臂的控制等功能。本篇文章我們將復寫這個項目,一步一步的開始如何建立起這個項目。
2.技術介紹
YOLOv8介紹
Ultralytics YOLOv8 是一種尖端、最先進 (SOTA) 模型,它建立在先前 YOLO 版本成功的基礎上,并引入了新功能和改進,以進一步提高性能和靈活性。 YOLOv8 的設計目標是快速、準確且易于使用,使其成為各種對象檢測和跟蹤、實例分割、圖像分類和姿態(tài)估計任務的絕佳選擇。https://docs.ultralytics.com/
Ultralytics YOLOv8 is a cutting-edge, state-of-the-art (SOTA) model that builds upon the success of previous YOLO versions and introduces new features and improvements to further boost performance and flexibility. YOLOv8 is designed to be fast, accurate, and easy to use, making it an excellent choice for a wide range of object detection and tracking, instance segmentation, image classification and pose estimation tasks.
YOLOv8,作為這一系列的最新版本,包含以下特點和改進:
更快的檢測速度:YOLO 系列以其快速的檢測速度而聞名,每個后續(xù)版本都在這方面進行了優(yōu)化。
更高的準確性:通過使用更先進的神經(jīng)網(wǎng)絡架構和學習算法,YOLOv8 可能會提高物體檢測的準確性。
更好的泛化能力:改進的算法可能更有效地處理不同類型的圖像數(shù)據(jù),包括在復雜背景和不同光照條件下的檢測。
適應性和可擴展性的增強:新版本可能會提供更多的定制選項和設置,使其能夠更好地適應不同的應用場景和需求。
優(yōu)化的資源使用:對計算效率的改進可能會使 YOLOv8 在資源有限的設備上運行得更好,如在移動設備或嵌入式系統(tǒng)中。
簡單點說,給它一張圖片識別,YOLOv8能夠快速的識別出圖片中的物體,并且將它標記出來。
myCobot 280 M5
myCobot 280 M5 是 Elephant Robotics 和 M5Stack 合作開發(fā)的最小、最輕的 6 軸協(xié)作機器人。 它采用一體化模塊化設計,重量僅為850克,格外輕巧。 配備6個高性能伺服電機,具有響應快、慣量低、轉動平穩(wěn)等特點。
The myCobot 280 M5 is the smallest and lightest 6-axis collaborative robot developed in collaboration by Elephant Robotics and M5Stack. It adopts an integrated modular design, weighing only 850 grams, making it exceptionally lightweight. Equipped with 6 high-performance servo motors, it features rapid responsiveness, low inertia, and smooth rotation.
mycobot 280 支持多平臺開發(fā)Linux,Windows,MacOS,并且控制接口全部開源支持目前市面上主流的編程語言python,c++/c#等。
python-pymycobot mycobot系列的控制庫https://github.com/elephantrobotics/pymycobot
Jetson Orin Nano
Jetson Orin Nano 是 NVIDIA 的一種嵌入式人工智能計算模塊,具有高性能和低功耗。它基于 NVIDIA 的 Orin 芯片,該芯片具有 12 個 Arm 核心和一個 NVIDIA Ampere GPU。這使 Jetson Orin Nano 能夠運行復雜的人工智能應用程序,例如機器視覺、自然語言處理和增強現(xiàn)實。
https://developer.nvidia.com/buy-jetson?product=all&location=JP
開發(fā)過程
開發(fā)環(huán)境:
軟件:
操作系統(tǒng):Linux
編譯語言:Python
python 庫:
import cv2
import math
import time
from ultralytics import YOLO
from pymycobot.mycobot import MyCobot
yolov8模型:yolov8n-pose.pt
https://docs.ultralytics.com/tasks/pose/
硬件:
USB 攝像頭*1
myCobot 280 M5Stack *1
Jetson Orin Nano*1
顯示器,鍵盤鼠標*1
代碼實現(xiàn)
yolov8姿態(tài)估計模型-yolov8n-pose
yolov8有訓練好的姿態(tài)估計模型,可以直接使用。姿態(tài)估計是一項任務,其涉及識別圖像中特定點的位置,通常被稱為關鍵點。這些關鍵點可以代表物體的各種部位,如關節(jié)、地標或其他顯著特征。關鍵點的位置通常表示為一組2D [x, y] 或3D [x, y, visible] 坐標。
簡單使用的方法:
import torch
from ultralytics.yolov8 import YOLO
import cv2
#引入模型
model = YOLO('yolov8n-pose.pt')
#打開圖片
img = cv2.imread('image.jpg')
# 將圖片引入模型
results = model(img)
# 展示結果
for r in results:
im_array = r.plot() # 繪制包含預測結果的BGR numpy數(shù)組
im = Image.fromarray(im_array[..., ::-1]) # RGB PIL圖像
im.show() # 顯示圖像
im.save('results.jpg') # 保存圖像
在項目中需要獲取人手比的手腕,肘部和肩部的x,y坐標來進行計算角度,然后將相同的角度發(fā)送到mycobot的第二第三關節(jié)。
Code:
if keypoints_tensor is not None and keypoints_tensor.size(1) > 0:
# 提取特定關鍵點的坐標和置信度
x_mimi = keypoints_tensor[0][3][0]
y_mimi = keypoints_tensor[0][3][1]
conf_mimi = confidence_score[0][3]
x_kosi = keypoints_tensor[0][13][0]
y_kosi = keypoints_tensor[0][13][1]
conf_kosi = confidence_score[0][13]
x_kata = keypoints_tensor[0][5][0]
y_kata = keypoints_tensor[0][5][1]
conf_kata = confidence_score[0][5]
x_hizi = keypoints_tensor[0][7][0]
y_hizi = keypoints_tensor[0][7][1]
conf_hizi = confidence_score[0][7]
x_te = keypoints_tensor[0][9][0]
y_te = keypoints_tensor[0][9][1]
conf_te = confidence_score[0][9]
然后計算腰部到肩部之間的角度,這個角度主要關注的是上半身的一個簡化模型,可能用于模擬肩部的運動或整個上半身的傾斜。
#計算AB之間的向量
vector_AB = (x_kata - x_hizi, y_kata - y_hizi)
#用函數(shù)計算這個向量的角度
angle_rad1 = math.atan2(vector_AB[1], vector_AB[0])
#將角度從弧度轉為度
angle_deg1 = math.degrees(angle_rad1)
#計算后調(diào)整的角度值用于控制機械臂
mycobot1 = int(angle_deg1)-90
接下來在計算手部,肘部,肩部三個關鍵點形成的角度,這個角度涉及更復雜的姿勢分析,因為它包括了從手部到膝部再到肩部的整個鏈條,結合這兩種角度的計算,可以讓機械臂模仿人體姿勢更加精準和自然。
x1=x_te #手部的x,y
y1=y_te
x2=x_hizi #肘部的X,Y
y2=y_hizi
x3=x_kata # 肘部的x,y
y3=y_kata
#定義三個做標點
point1 = (x1, y1)
point2 = (x2, y2)
point3 = (x3, y3)
# 計算向量
vector1 = (x2 - x1, y2 - y1)
vector2 = (x3 - x2, y3 - y2)
# 計算向量長度
length1 = math.sqrt(vector1[0] ** 2 + vector1[1] ** 2)
length2 = math.sqrt(vector2[0] ** 2 + vector2[1] ** 2)
# 計算點積
dot_product = vector1[0] * vector2[0] + vector1[1] * vector2[1]
# 計算角度(弧度)
angle_rad = math.atan2(vector2[1], vector2[0]) - math.atan2(vector1[1], vector1[0])
# 如果角度向右彎曲則為 0 度
# 如果角度從右向左轉動則為 180 度
# 如果在一條直線上,則為 -90 度(或 +90 度,以哪個為準)
if angle_rad > math.pi:
angle_rad -= 2 * math.pi
elif angle_rad < -math.pi:
angle_rad += 2 * math.pi
# 將角度轉換為度數(shù)
mycobot2 = int(math.degrees(angle_rad))
最后將獲取到的角度,通過條件判斷控制機械臂進行手臂的模擬運動。
#機械臂在計算的mycobot1,mycobot2可接受的范圍內(nèi)分別是是 -180 至 180 度和 -155 至 155 度
if -180 <= mycobot1 and mycobot1 <= 180 and -155 <= mycobot2 and mycobot2 <= 155 and conf_hizi >= 0.75:
#符合條件led燈會變藍
mc.send_angles ([90,-mycobot1,mycobot2,0,-90,0],100)
mc.set_color(0, 0, 255)
print("A點的角度(度數(shù)法):", conf_hizi)
else:# 不符合條件LED等會變紅
print("A點的角度(度數(shù)法):", conf_hizi)
mc.set_color(255, 0, 255)
總結
SuzukiSumiya在maker faire tokyo 2023上展示了Jetson Orin Nano 和mycobot以及yolov8-pose相結合實現(xiàn)了一個非常有趣的demo。可以學到多個方面的知識和技能,包括計算機視覺、機器人編程、數(shù)學計算,以及如何將這些元素結合起來創(chuàng)建一個交互式的系統(tǒng)。
下面的視頻是對SuzukiSumiya做這個項目的一個訪談。
https://www.youtube.com/watch?v=DB5WiUQVhek
如果你有什么其他有趣的項目,也可以聯(lián)系我們,我們會分享你的項目在各個平臺讓大家都關注到。m0_71627844/article/details/135062016
審核編輯 黃宇
-
開源
+關注
關注
3文章
3349瀏覽量
42501 -
python
+關注
關注
56文章
4797瀏覽量
84691 -
機械臂
+關注
關注
12文章
515瀏覽量
24588
發(fā)布評論請先 登錄
相關推薦
評論