前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >日本yolov8用户案例演示!

日本yolov8用户案例演示!

原创
作者头像
大象机器人
修改2024-03-22 11:46:36
600
修改2024-03-22 11:46:36
举报
文章被收录于专栏:移动机器人移动机器人

这篇文章转载来自SWITCH SCIENCE的SuzukiSumiya,本篇文章转载已获作者授权。

原文链接来自:https://www.switch-science.com/blogs/magazine/jetson-maker-faire-tokyo-2023

1.引言

这篇文章来自SWITCH SCIENCE的SuzukiSumiya 在Maker Faire Tokyo 2023上演示了通过模拟人手臂的姿态来控制机械臂。演示的内容是使用USB摄像头通过图像识别估计手臂,并将myCobot制作成类似的手臂形状。

视频链接:https://youtu.be/h1H6pSvhQxQ

该项目主要使用Ultralytics YOLOv8来进行姿态的估计,结合机器视觉和机械臂的控制等功能。本篇文章我们将复写这个项目,一步一步的开始如何建立起这个项目。

2.技术介绍

YOLOv8

Ultralytics YOLOv8 是一种尖端、最先进 (SOTA) 模型,它建立在先前 YOLO 版本成功的基础上,并引入了新功能和改进,以进一步提高性能和灵活性。

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,作为这一系列的最新版本,包含以下特点和改进:

更快的检测速度:YOLO 系列以其快速的检测速度而闻名,每个后续版本都在这方面进行了优化。

更高的准确性:通过使用更先进的神经网络架构和学习算法,YOLOv8 可能会提高物体检测的准确性。

更好的泛化能力:改进的算法可能更有效地处理不同类型的图像数据,包括在复杂背景和不同光照条件下的检测。

适应性和可扩展性的增强:新版本可能会提供更多的定制选项和设置,使其能够更好地适应不同的应用场景和需求。

优化的资源使用:对计算效率的改进可能会使 YOLOv8 在资源有限的设备上运行得更好,如在移动设备或嵌入式系统中。

简单点说,给它一张图片识别,YOLOv8能够快速的识别出图片中的物体,并且将它标记出来。

myCobot 280 M5

myCobot 280 M5 是 Elephant Robotics 和 M5Stack 合作开发的最小、最轻的 6 轴协作机器人。

The myCobot 280 M5 is the smallest and lightest 6-axis collaborative robot developed in collaboration by Elephant Robotics and M5Stack.

python-pymycobot mycobot系列的控制库https://github.com/elephantrobotics/pymycobot

Jetson Orin Nano

Jetson Orin Nano 是 NVIDIA 的一种嵌入式人工智能计算模块,具有高性能和低功耗。

https://developer.nvidia.com/buy-jetson?product=all&location=JP

3.开发过程

开发环境:

软件:

操作系统:Linux

编译语言:Python

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] 坐标。

简单使用的方法:

代码语言:python
复制
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:

代码语言:python
复制
        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]

然后计算腰部到肩部之间的角度,这个角度主要关注的是上半身的一个简化模型,可能用于模拟肩部的运动或整个上半身的倾斜。

代码语言:python
复制
#计算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

接下来在计算手部,肘部,肩部三个关键点形成的角度,这个角度涉及更复杂的姿势分析,因为它包括了从手部到膝部再到肩部的整个链条,结合这两种角度的计算,可以让机械臂模仿人体姿势更加精准和自然。

代码语言:python
复制
            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))

最后将获取到的角度,通过条件判断控制机械臂进行手臂的模拟运动。

代码语言:python
复制
#机械臂在计算的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)

4.总结

SuzukiSumiya在maker faire tokyo 2023上展示了Jetson Orin Nano 和myCobot以及yolov8-pose相结合实现了一个非常有趣的demo。可以学到多个方面的知识和技能,包括计算机视觉、机器人编程、数学计算,以及如何将这些元素结合起来创建一个交互式的系统。

下面的视频是对SuzukiSumiya做这个项目的一个访谈。

https://www.youtube.com/watch?v=DB5WiUQVhek

如果你有什么其他有趣的项目,也可以联系我们,我们会分享你的项目在各个平台让大家都关注到。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档