这篇文章转载来自SWITCH?SCIENCE的SuzukiSumiya,本篇文章转载已获作者授权。
原文链接来自:https://www.switch-science.com/blogs/magazine/jetson-maker-faire-tokyo-2023
这篇文章来自SWITCH?SCIENCE的SuzukiSumiya?在Maker?Faire?Tokyo?2023上演示了通过模拟人手臂的姿态来控制机械臂。演示的内容是使用USB摄像头通过图像识别估计手臂,并将mycobot制作成类似的手臂形状。
视频链接:https://youtu.be/h1H6pSvhQxQ
该项目主要使用Ultralytics?YOLOv8来进行姿态的估计,结合机器视觉和机械臂的控制等功能。本篇文章我们将复写这个项目,一步一步的开始如何建立起这个项目。
Ultralytics?YOLOv8?是一种尖端、最先进?(SOTA)?模型,它建立在先前?YOLO?版本成功的基础上,并引入了新功能和改进,以进一步提高性能和灵活性。?YOLOv8?的设计目标是快速、准确且易于使用,使其成为各种对象检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。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,作为这一系列的最新版本,包含以下特点和改进:
简单点说,给它一张图片识别,YOLOv8能够快速的识别出图片中的物体,并且将它标记出来。
myCobot?280?M5?是?Elephant?Robotics?和?M5Stack?合作开发的最小、最轻的?6?轴协作机器人。?它采用一体化模块化设计,重量仅为850克,格外轻巧。?配备6个高性能伺服电机,具有响应快、惯量低、转动平稳等特点。
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?支持多平台开发Linux,Windows,MacOS,并且控制接口全部开源支持目前市面上主流的编程语言python,c++/c#等。
python-pymycobot?mycobot系列的控制库https://github.com/elephantrobotics/pymycobot
Jetson?Orin?Nano?是?NVIDIA?的一种嵌入式人工智能计算模块,具有高性能和低功耗。它基于?NVIDIA?的?Orin?芯片,该芯片具有?12?个?Arm?核心和一个?NVIDIA?Ampere?GPU。这使?Jetson?Orin?Nano?能够运行复杂的人工智能应用程序,例如机器视觉、自然语言处理和增强现实。
https://developer.nvidia.com/buy-jetson?product=all&location=JP
软件:
操作系统: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
yolov8姿态估计模型-yolov8n-pose
yolov8有训练好的姿态估计模型,可以直接使用。姿态估计是一项任务,其涉及识别图像中特定点的位置,通常被称为关键点。这些关键点可以代表物体的各种部位,如关节、地标或其他显著特征。关键点的位置通常表示为一组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数组
????im?=?Image.fromarray(im_array[...,?::-1])??#?RGB?PIL图像
????im.show()??#?显示图像
????im.save('results.jpg')??#?保存图像
在项目中需要获取人手比的手腕,肘部和肩部的x,y坐标来进行计算角度,然后将相同的角度发送到mycobot的第二第三关节。
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)
#用函数计算这个向量的角度
angle_rad1?=?math.atan2(vector_AB[1],?vector_AB[0])
#将角度从弧度转为度
angle_deg1?=?math.degrees(angle_rad1)
#计算后调整的角度值用于控制机械臂
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
#?将角度转换为度数
mycobot2?=?int(math.degrees(angle_rad))
最后将获取到的角度,通过条件判断控制机械臂进行手臂的模拟运动。
#机械臂在计算的mycobot1,mycobot2可接受的范围内分别是是?-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点的角度(度数法):",?conf_hizi)
else:#?不符合条件LED等会变红
print("A点的角度(度数法):",?conf_hizi)
mc.set_color(255,?0,?255)
SuzukiSumiya在maker?faire?tokyo?2023上展示了Jetson?Orin?Nano?和mycobot以及yolov8-pose相结合实现了一个非常有趣的demo。可以学到多个方面的知识和技能,包括计算机视觉、机器人编程、数学计算,以及如何将这些元素结合起来创建一个交互式的系统。
下面的视频是对SuzukiSumiya做这个项目的一个访谈。
https://www.youtube.com/watch?v=DB5WiUQVhek
如果你有什么其他有趣的项目,也可以联系我们,我们会分享你的项目在各个平台让大家都关注到。