手势控制机械臂
作者:hehung
一、作品简介
本项目使用树莓派400作为主控,使用Mediapipe实时识别用户手势动作和关键点,并将手势命令转换为机械臂舵机控制命令,控制6轴机械臂动作,能够实现机械臂的前后、上下、左右旋转、机械手抓握以及机械手旋转等动作,以此实现了自然交互式的手势控制。
二、系统框图
整个系统由树莓派400、舵机控制器(MaxinBit)、6轴机械臂、显示屏等组成,各个模块功能如下:
- 树莓派400为主要控制器;
- USB摄像头用于采集手势图像;
- 串口用于传递机械臂控制信息给舵机控制器,舵机控制器用于舵机控制器控制机械臂动作;
- HDMI连接显示器,显示解析后的手势关键点数据以及控制LOG;
- 机械臂支持键盘直接控制。
系统框图见下图:
三、各部分功能说明
项目全家福如下:
3.1 整体功能描述
项目整体功能如下:
- 树莓派400驱动USB摄像头采集实时画面,摄像头反馈实时画面给树莓派400;
- 树莓派400根据摄像头反馈的画面,调用mediapipe开源库分析出手部关键点;
- 树莓派400利用算法解析手部关键点信息,然后分析出具体手势命令,将手势命令转换为舵机控制占空比命令;
- 树莓派400驱动串口将舵机控制命令发送给舵机控制器;
- 舵机控制器解析出串口接收到的舵机控制命令,将命令转换为PWM命令输出给舵机,从而达到控制机械臂的目的。
功能架构图如下所示:
3.2 树莓派400功能描述
机械臂支持手势控制、键盘控制和键盘标定三种模式,以及串口发送控制命令。
三种模式的功能均由python实现,下面详细讲述三种控制模式以及串口发送命令流程。
3.2.1 串口发送
势控制、键盘控制和键盘标定三种模式都需要将舵机的控制命令发送到舵机控制器,发送命令利用串口实现。
树莓派400会驱动串口发送每个舵机的控制命令给舵机控制器。发送的命令格式如下:
START::0-pwm1:1-pwm2:2-pwm3:3-pwm4:4-pwm5:5-pwm6::END
其中,机械臂从下到上,舵机编号分别为①~⑥,见下图。
pwm1为舵机①的控制占空比;
pwm2为舵机②的控制占空比;
pwm3为舵机③的控制占空比;
pwm4为舵机④的控制占空比;
pwm5为舵机⑤的控制占空比;
pwm6为舵机⑥的控制占空比。
3.2.2 手势控制
使用python驱动USB摄像头采集实时图像数据,然后通过mediapipe解析出摄像头采集的21个手部关键点数据,通过对21个手部关键点数据进行分析,计算出手部位置(X、Y、Z轴坐标)、手势状态、手势偏移角度等信息,通过计算将这些信息转换为每个舵机的控制命令,即舵机占空比,最后将这些命令通过串口发送出去。
手势控制支持机械臂的前后移动、上下移动、左右旋转、机械爪子抓握与释放、机械爪子旋转等功能,可以利用单手对机械臂的进行控制,实现对物品的移动。
摄像头采集的图像会通过opencv显示在屏幕上,并且手距离摄像头太近会显示“The hand is too close in distance
”,表示手距离摄像头太近了;手距离摄像头太远会显示“The hand is too far away in distance”,表示手距离摄像头太远了;摄像头中没有检测到手,会显示“No hand Found”
手势控制流程图如下:
详细功能见演示视频。
3.2.3 键盘控制
使用python读取键盘指定按键是否按下,通过如下按键实现对机械臂的精准控制:
- 键盘“上”键控制舵机向上移动;
- 键盘“下”键控制舵机向下移动;
- 键盘“左”键控制舵机向左旋转;
- 键盘“右”键控制舵机向右旋转;
- 键盘“W”键控制舵机向前延伸;
- 键盘“S”键控制舵机向后收缩;
- 键盘“A”键控制舵机爪子向左旋转;
- 键盘“D”键控制舵机爪子向右旋转;
- 键盘“ENTER”键控制舵机爪子收缩;按住“ENTER”爪子握紧;松开“ENTER”爪子释放。
利用键盘控制可以实现利用机械臂对物品的精准控制与移动,详细功能见演示视频。
3.2.4 键盘标定
键盘标定算是一个辅助功能,主要用于辅助调试每个舵机的控制角度,即机械臂中每个舵机在各个位置的占空比输出值,可以辅助开发者对控制算法的输出命令的补偿,使控制更加精准,同时也可以理该校准功能知道每个舵机的最大最小输出值,用于软件方式进一步限定舵机转动范围,防止舵机损坏。标定功能实现如下:
- 程序启动默认对机械臂上面的舵机①进行控制;
- 按下键盘“右”键用于切换下一个舵机进行控制;
- 按下键盘“左”键用于切换上一个舵机进行控制;
- 按下键盘“上”键用于增加舵机占空比输出,每按下100ms增加0.1ms占空比;
- 按下键盘“下”键用于减小舵机占空比输出,每按下100ms减小0.1ms占空比;
利用这种控制方式可以实现对每个舵机的控制范围和位置的精准标定,补偿手势识别中的命令输出。
详细功能见视频演示。
3.2.5 功能控制方法说明
1. 进入代码所在目录,使用如下命令启动程序:
sudo python3 main.py
启动之后,终端显示如下:
2. 输入1,按下回车,开始手势控制演示,终端显示如下:
在终端控制界面下按下“ESC”可以退回到启动界面。
手势控制界面如下,终端会显示给舵机控制器发送的控制指令。
3. 在终端中输入2,按下回车,开始键盘控制,终端显示如下,键盘控制时会实时打印舵机控制命令。
4. 在终端中输入3,按下回车,开始键盘标定,终端显示如下:
3.3 舵机控制器功能描述
由于树莓派400只有两个PWM引脚可以用来做PWM输出使用,而机械臂为6轴,有6个舵机,2个PWM是不够的,我也想过使用普通IO口,通过软件定时器模拟的方式来实现PWM驱动舵机,但是这种方式输出的PWM频率是不固定的,真的用来输出固定频率的PWM有点勉强,所以使用了MaixBit单片机来实现。
舵机控制器的主要功能是接收串口发送过来的控制命令,将控制命令转换为PWM命令输出,用于控制舵机转动。
3.3.1 硬件线路连接
MaixBit使用了9个IO口来实现预定功能,其中两个IO口作为串口TX和RX使用,6个IO口作为PWM输出,1个IO口作为板载LED控制,用来做呼吸灯,显示工作状态。
各个引脚的功能如下:
3.3.1 舵机驱动说明
机械臂使用的舵机为SG90,控制范围为0~180度。
舵机控制方式为PWM,其控制后期为20ms(即50Hz),可控范围为2.5ms~12.5ms,其中2.5ms的占空比表示0度,12.5ms的占空比表示180度。
四、作品源码
作品源码上传到了EEWorld下载中心和gitee。
五、作品功能演示视频
视频上传到了EEWorld大学堂和BiliBili。
六、项目总结
本项目的实现还是花费了一些时间,因为较少接触linux系统,学习linux、在linux上搭建开发环境都是一种挑战,在树莓派上搭建mediapipe开发环境也经过了多次实践与尝试才搭建成功,手势控制机械臂功能也是在一次一次的调试后才勉强达到了预期的效果。该项目目前还存在控制精度不够的缺陷,主要原因是树莓派资源受限,视频采集到经过mediapipe分析会消耗较多的计算资源,从而表现出一种长延迟的现象,也就是说手势命令给出到树莓派给出控制命令这段时间差不多会消耗2秒左右,也就导致了控制不及时,表现出来就是手势控制不够灵活。后续就是加强linux相关知识,期望能够深入了解opencv以及mediapipe的底层实现原理,从底层构建专属于树莓派的组件应该会提升一些速度。当然最好的方式还是在硬件资源足够强大的平台(笔记电脑)上运行,可以达到较好的控制效果。
帖子分享链接汇总:
七、其他
本次参赛还是学习到了很多东西,掌握了linux系统开发的一些流程,linux系统环境搭建方式,驱动开发方法等,同时对树莓派有了一些新的认知,能够利用树莓派搭建更多好玩有用的东西,本次比赛成果也是我学习的一次进步。感谢EEWORLD以及digikey提供的平台与机会。
项目提交文档:
本文来自论坛,点击查看完整帖子内容。