• 大小: 12KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: 其他
  • 标签: openmv  物料抓取  

资源简介

通过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

评论

共有 条评论