基于吸盘的scara机械臂
`正如题目所示,这次是一个scara机械臂。上一篇博客也是文章后提到这个,具体的话是用了stm32F103ZET6来做主控的,下面先贴整体图片吧。
前言
正如题目所示,这次是一个scara机械臂。上一篇博客也是文章后提到这个,具体的话是用了stm32F103ZET6来做主控的,下面先贴整体图片吧。
一、整体图片
二、使用步骤
1.引入库
代码如下(示例):
import math
l1 = 87.7
l2 = 106.2
PI = 3.14159265
# 注意此时的坐标系主要是y,x
target_coordinate = [-78, 82]
val = 180.0 / PI
# 计算出角度2的cos值
c2 = target_coordinate[1]*target_coordinate[1] + target_coordinate[0]*target_coordinate[0]
c2 = c2 - l1*l1 - l2*l2
c2 = c2 / (2*l1*l2)
# 计算出角度2的sin值 因为给定的坐标值为左手坐标系所以改值为负值
s2 = 1 - (c2*c2)
s2_Val = math.sqrt(s2)
if target_coordinate[0] > 0:
s2_Val = -s2_Val
else:
s2_Val = s2_Val
# 计算出角度2的值 通过atan2()的计算函数得出反正切函数
O2 = math.atan2(s2_Val, c2)
O2 = O2 * val
# 计算出a角度的值也是通过atan2反正切函数求出,该角度为原点O到目标位置的总角度
a = math.atan2(target_coordinate[0], target_coordinate[1]) * val
# 此时我们建立新的三角形,为OBC为一个直角正方形,通过改三角形来求出改角度通过a角度减去该角度得出第一自由度机械臂需要转过的角度
obc_sinVal = l2 * s2_Val
obc_cosVal = (l1 + l2 * c2)
# 计算出角度B也就是上面所说的的小角度
B = math.atan2(obc_sinVal, obc_cosVal) * val
# 计算出角度1
O1 = a - B
print(O1)
print(O2)
具体算法就是这个,用python写了一下验证算法版本,具体的算法推演过程可参考这个博客:scara机器人运动学正逆解
通过逆解来进行求取机械臂一和机械臂二的角度,再去驱动步进电机转动多少脉冲就好了。
稍微贴一下我验证的图片
这个就是我机械臂具体模样
坑一
在驱动后臂的步进电机的时候会带动起前臂转动,所以这里如果需要到某一个目标点位的话,要么一起运动,给相应的脉冲,要么就进行角度补偿。
坑二
因为涉及到使用对角度的解算,所以我比较推荐,写一个绝对定位的函数,来进行记录每一个机械臂转动过后的位置,这样无论是对机械臂的一个整体校准还是去转动某一个地方都是很方便的。
坑三
从最上方的摄像头不难看出是OPENMV,这里坑也很多,识别出来进行距离换算成像素点得到的比例值,无法用到对机械臂的臂一和臂二的放缩,因为那个计算两个转动角是需要直到L1和L2的对应着机械臂的臂一和臂二,最后是通过运动学的正解,也就是通过测定角度来反推演L1和L2的;因为还需要划分左右手坐标系,即还需要对OPENMV传回来的坐标进行变换才能使用。
总结
最后因为是使用吸盘来进行对色块的抓取,因为吸盘比较大,虽然计算出来的角度值稍微还是有误差的,但是抓取倒也没有失败过,具体就这样了。有小伙伴做这个东西的话,私信或者评论区发一下邮箱,我把我的代码发你。