资源简介
通过openmv对图像进行识别,并直接用openmv和pca9685对舵机进行控制,减少通信耗时,以达成:在图像中找到位置偏差时能迅速摆动机械臂校正 的效果.对物体为定点抓取,若检测到颜色不对时能换到另一个给定点位再次检测.[有各种迭代版本,欢迎讨论]
代码片段和文件信息
‘‘‘
机械臂指令管理
‘‘‘
# import ucollections
import uheapq
from configs import config
class Command:
‘‘‘指令基类‘‘‘
is_active = False # 指令是否有效
CMD_TYPE = ‘CMD_TYPE‘ # 指令的类型
TIMER_PERIOD = config[‘TIMER_PERIOD‘]
def active_cmd(self):
self.is_active = True
class DelayCommand(Command):
‘‘‘延时类指令‘‘‘
CMD_TYPE = ‘CMD_DELAY‘
def __init__(self delay_ms):
self.delay_ms = delay_ms # 延时的时间 ms
self.time_cnt = 0 # 已经经过的时间
def active_cmd(self):
‘‘‘激活当前指令‘‘‘
self.is_active = True # 激活该指令
self.time_cnt = 0 # 时间计数清零
def update(self):
‘‘‘定时器回调函数 period是Timer的周期(常数)‘‘‘
self.time_cnt += self.TIMER_PERIOD
if self.time_cnt > self.delay_ms:
self.is_active = False # 指令执行结束
class JointMoveCommand(Command):
‘‘‘单个关节角度的控制信号‘‘‘
CMD_TYPE = ‘CMD_JOINT_MOVE‘
def __init__(self joint theta rspeed=None):
self.is_active = False
self.joint = joint # 关节ID
self.theta = theta # 关节的目标角度
if rspeed is None:
self.rspeed = config[‘JOINT_DEFAULT_ROTATIONAL_SPEED‘]
else:
self.rspeed = rspeed # 转速 rotational speed
def active_cmd(self):
‘‘‘激活当前的指令‘‘‘
self.is_active = True
def update(self):
‘‘‘更新关节旋转角度‘‘‘
# 每次舵机移动的幅度
step = (self.rspeed / 1000) * self.TIMER_PERIOD
cur_theta = self.joint.get_radius()
if abs(self.theta - cur_theta) <= step*15:
step=step/(2.7+(abs(self.theta - cur_theta)/step/10)*(-1))
if abs(self.theta - cur_theta) <= step:
# 如果差距小于step的绝对值 一步到位
self.joint.set_radius(self.theta)
self.is_active = False # 标记完成了当前的指令
elif self.theta > self.joint.theta:
self.joint.set_radius(cur_theta + step)
else:
self.joint.set_radius(cur_theta - step)
class JointMoveBatch(Command):
‘‘‘多个关节的控制信号‘‘‘
CMD_TYPE = ‘CMD_JOINT_MOVE_BATCH‘
def __init__(self arm):
# 定义关节跟机械爪
self.arm = arm # 机械臂对象
self.move_batch = {} # 多个关节的弧度控制
def add_move(self joint_id theta rspeed=None):
‘‘‘添加一个关节的动作‘‘‘
# NOTE: MicroPython eval对local(局部)变量无效 因此不能使用self
# joint = eval(‘self.arm.{}‘.format(joint_id) globals(){‘self‘: self})
joint = None
if joint_id == ‘joint1‘:
joint = self.arm.joint1
elif joint_id == ‘joint2‘:
joint = self.arm.joint2
elif joint_id == ‘joint3‘:
joint = self.arm.joint3
elif joint_id == ‘joint4‘:
joint = self.arm.joint4
self.move_batch[joint_id] = JointMoveCommand(joint theta rspeed)
def active_cmd(self):
‘‘‘激活指令‘‘‘
self.is_active = True
for joint_move_cmd in self.move_batch.values():
joint_move_cmd.is_active = True
def update(self):
‘‘
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-04-06 15:57 备份\
文件 5730 2019-03-26 20:16 备份\command.py
文件 1410 2019-03-29 11:08 备份\configs.py
文件 3374 2019-03-26 20:26 备份\joints.py
文件 1485 2019-02-10 09:10 备份\pca9685.py
文件 12097 2019-03-26 20:08 备份\robot_arm.py
文件 2461 2019-03-15 17:06 备份\servos.py
文件 7723 2019-04-02 09:34 备份\[比赛2]mv_car5.3 [不检查颜色的版本] - 副本.py
- 上一篇:15单片机矩阵键盘,状态机法消抖
- 下一篇:普中PZ6808L-F4开发板入门教程
评论
共有 条评论