【玄铁杯第三届RISC-V应用创新大赛】项目提交 - 手势控制机械臂
[复制链接]
本帖最后由 hehung 于 2023-12-7 18:41 编辑
手势控制机械臂
作者:hehung
一、项目背景
机械臂在工业、医疗等领域有着广泛的应用,目前机械臂的控制大多依赖于专用控制器,虽然可以达到较高的精度,但是使用不够灵活直观,随着技术的发展,利用AI视觉技术识别人体手势,然后根据手势控制机械臂,可以实现更自然的机械臂控制,提高系统易用性。
二、作品简介
本项目使用Licheepi4A作为主控,将采集到的图片数据发送到服务器,服务器使用MediaPipe实时识别用户手势动作和关键点,并将控制数据发送给Licheepi4A,Licheepi4A接收到数据之后控制6轴机械臂动作,能够实现机械臂的前后、上下、左右旋转、机械手抓握以及机械手旋转等动作,以此实现了自然交互式的手势控制。
三、系统框图
- Licheepi4A为主要控制器;
- USB摄像头用于采集手势图像;
- 串口用于传递机械臂控制信息,用于舵机控制器控制机械臂动作;
- HDMI连接显示器,显示解析后的手势关键点数据以及控制LOG;
- WIFI用于传递图片以及关键数据的交互。
四、各部分功能说明
项目全家福图如下:
项目功能架构图如下:
4.1 Licheepi4A功能描述
Licheepi4A的代码均由Python实现。使用python采集USB摄像头的数据,并将图片打包,使用UDP协议发送到服务器(电脑),并使用另外一个线程接收图片以及控制数据,将收到的图片使用opencv显示出来,并将控制数据解析出来,重新打包发送到舵机控制器。
舵机控制命令数据格式如下:
START::0-pwm1:1-pwm2:2-pwm3:3-pwm4:4-pwm5:5-pwm6::END
其中,机械臂从下到上,舵机编号分别为1~6。
pwm1为舵机1的控制占空比;
pwm2为舵机2的控制占空比;
pwm3为舵机3的控制占空比;
pwm4为舵机4的控制占空比;
pwm5为舵机5的控制占空比;
pwm6为舵机6的控制占空比。
4.2 服务器功能描述
服务器也是使用python实现,我使用我的笔记本电脑作为服务器,服务器接收Licheepi4A发送过来的图片,并通过mediapipe解析出手势关键点数据,通过关键点数据分析,解析出控制命令,并将控制命令和添加了手势关键点的图片一起打包发送回Licheepi4A。
4.2 舵机控制器功能描述
舵机控制器由maix-bit单片机实现,原因是该单片机为K210,可以映射多个PWM端口,而且也可以使用micropython来控制。
使用micropython实现了如下功能:读取串口数据并将接收的串口数据中每个舵机PWM控制周期解析出来,然后使用PWM控制每个舵机的动作。
4.2.1 舵机控制功能
机械臂使用的舵机为SG90,控制范围为0~180度。
舵机控制方式为PWM,其控制后期为20ms(即50Hz),可控范围为2.5ms~12.5ms,其中2.5ms的占空比表示0度,12.5ms的占空比表示180度。
舵机硬件如下图所示,其中舵机编号3在最近两天调试不小心弄坏了,没有备用的,时间也不够买新的替换,所以我固定起来,不让他动作,这也导致了机械臂动起来活动范围小了一些,不能伸缩。
五、视频演示
视频演示了手势控制机械臂如下两部分:
- 基础动作演示:上下动作、左右旋转动作、前后动作、机械手抓握动作(包括抓握的力度大小可控)、机械手的旋转动作;
- 抓握演示:演示了使用机械臂抓握一个小物品动作,以及鞠躬动作。
视频上传到了BiliBili:
六、项目源码
项目源码上传到了gitee:
仓库代码说明:
Licheepi4A代码运行说明,因为会使用串口,所以需要将串口设置为普通权限运行,并且需要安装串口模块包,参考我发布的帖子:
- Licheepi4A上运行的代码需要安装python opencv库。
- Server上运行代码需要安装python mediapipe以及opencv库。
七、发布的博文
【玄铁杯第三届RISC-V应用创新大赛】1. 开箱以及ssh远程登录 https://bbs.eeworld.com.cn/thread-1257482-1-1.html
【玄铁杯第三届RISC-V应用创新大赛】2. 更新系统 https://bbs.eeworld.com.cn/thread-1259460-1-1.html
【玄铁杯第三届RISC-V应用创新大赛】3. windows访问licheepi4A共享文件夹 https://bbs.eeworld.com.cn/thread-1260326-1-1.html
【玄铁杯第三届RISC-V应用创新大赛】4. licheepi4A驱动USB摄像头 https://bbs.eeworld.com.cn/thread-1260327-1-1.html
【玄铁杯第三届RISC-V应用创新大赛】5. yolov5n环境搭建 https://bbs.eeworld.com.cn/thread-1263834-1-1.html
【玄铁杯第三届RISC-V应用创新大赛】6. yolov5n环境搭建 - 续(完结) https://bbs.eeworld.com.cn/thread-1264628-1-1.html
【玄铁杯第三届RISC-V应用创新大赛】7. 挂载SD卡扩容 https://bbs.eeworld.com.cn/thread-1264624-1-1.html
【玄铁杯第三届RISC-V应用创新大赛】8. Lihcepi4A中python串口通信 https://bbs.eeworld.com.cn/thread-1266037-1-1.html
八、项目总结
本项目设计还是花费了较多的时间,主要原因是Licheepi4A是基于RASC-V实现的,系统以及配套软件都不成熟,导致很多功能实验下来才发现,以我微薄的功底还是实现不了,因为时间关系,也不能细细研究,所以只能一只找替代方案。
该项目目前实现了预定的功能,但是并没有采用预定方案来做,原因如上述描述。最初设定方式是,直接在Licheepi4A上使用mediapipe来识别手势,然后直接使用Licheepi4A上引出的引脚来驱动机械臂舵机,结果想象很丰满,现实很残酷,遇到如下几个问题:
- Licheepi4A在mediapipe没有用起来,主要是目前还不兼容RISC-V,以我的能力也适配不起来,所以该方案放弃;
- 因为Licheepi4A上用不起来mediapipe,所以打算使用官方已经适配成功的YOLOv5n,虽然实验是成功了,识别图片也成功了,但是识别一张图片要2s以上的时候,所以对于机械臂这种需要实时控制的系统上,这样的延迟是绝对不能接受的,该方案放弃;
- Licheepi4A引出的IO口都不带PWM功能,只有串口,SPI和I2C,我也尝试过使用普通IO口,然后用模拟PWM的方式来驱动,但是实验下来发现驱动的周期和占空比都不精确,周期设置了20ms,结果示波器采集下来为24ms,而且还不稳定,在23~25ms之间波动,所以舵机驱动不起来,该方案方式;
虽然遇到了上面这些问题,但是我也找到了替代方案:
- 对于上述第1个和第2个问题,既然Licheepi4A上直接识别满足不了要求,我就直接在电脑上识别:Licheepi4A采集手势视频,然后通过UDP传递给电脑,电脑通过mediapipe识别出手势数据,并且标注出关键点,然后识别出手势在图片中的位置以及动作,转换为控制命令,再将处理后的图片和控制命令发送回Licheepi4A;Lihceepi4A接收到标注后的图片,并使用opencv显示出来;Licheepi4A将控制命令通过串口发送给舵机控制器;舵机控制器控制舵机动作;
- 因为Licheepi4A外引出来的IO口没有PWM功能,所以我使用其他单片机(MaixBit)做了一个舵机控制器。
九、其他
本次参赛还是学习到了很多东西,之前一只玩的是单片机,裸机开发,最多用一些那些实时嵌入式系统,还没怎么用过Linux系统做开发,本次也是我的一次进步,学些到了很多东西,感谢EEWORLD以及平头哥提供的平台与机会。
下面是文档:
|