《从零开始配置树莓派控制机械臂》专栏

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(一)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(二)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(三)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(四)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(五)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(六)

1. 机械臂记忆动作

API简介

1.进入/退出学习模式对应的API为:

Arm_Button_Mode(enable)
函数功能:设置机械臂是否进入学习模式。
参数解释:
enable:enable=0:表示退出学习模式,enable=1:表示进入学习模式。
进入学习模式后,机械臂扩展板上的RGB灯会呈现呼吸灯状态,并且机械臂会自动关闭扭矩,可以随便掰动机械臂的角度,每次按一下扩展板的K1按键,呼吸灯会切换另一种颜色,表示已经记录下当前机械臂的角度,最多可以记录20组动作,当记录的动作组数量超过20组时,按下K1键不再记录动作,并且呼吸灯呈现红色状态。
退出学习模式后,机械臂会自动打开扭矩,关闭RGB灯。
返回值:无。

2.读取当前动作组数量对应的API为:

Arm_Read_Action_Num()
函数功能:读取当前已记录的动作组数量。
参数解释:
返回值:返回当前已经记录的动作组的数量。

3.运行动作组对应的API为:

Arm_Action_Mode(mode)
函数功能:运行已记录的动作组。
参数解释:
mode:mode=0:停止运行动作组,mode=1:单次运行动作组,mode=2:循环运行动作组。
返回值:无。

4.清空动作组对应的API为:

Arm_Clear_Action()
函数功能:清空已记录的动作组,清空后无法恢复。
参数解释:
返回值:无。

5.在学习模式下,学习动作对应的API为:

Arm_Action_Study()
函数功能:在学习模式下,发送命令告诉扩展板记录当前机械臂的姿态作为一个动作组,学习成功时,RGB灯呼吸灯效果会变颜色。
参数解释:
返回值:无。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   创建机械臂对象
Arm   = Arm_Device()
time.sleep(.1)
#   打开学习模式,扩展板上的RGB灯呈现呼吸灯状态,同时机械臂所有舵机都进入关闭扭矩状态,
#   即可以自由掰动,可以把机械臂掰动到要记住的位置上。
Arm.Arm_Button_Mode(1)
#   在学习模式下,每次运行此cell,记录当前的动作保存到扩展板,同时扩展板上的RGB灯会切换颜色,
#   如果出现了红色呼吸灯,则表示学习的动作组已经满(20组)。
#   此命令也可以替换成按扩展板上的K1键,两者的功能是一致的。
Arm.Arm_Action_Study()
#   关闭学习模式。关闭呼吸灯
Arm.Arm_Button_Mode(0)
#   读取当前动作组数量
num   = Arm.Arm_Read_Action_Num()
print(num)
#   单次运行动作组
Arm.Arm_Action_Mode(1)
#   循环运行动作组
Arm.Arm_Action_Mode(2)
#   停止动作组
Arm.Arm_Action_Mode(0)
#   清空动作组,清空完成扩展板上的RGB灯会亮绿色。
#   注意:一旦清空已记录的动作组则无法恢复。
Arm.Arm_Clear_Action()
del   Arm  # 释放掉Arm对象

2. 机械臂夹方块

此实验的目的是把积木从中间灰色的区域移动到四周不同颜色的方块区域。首先把黄色的方块放到灰色的区域中,再依次运行代码单元到第六个单元(从灰色积木块位置抓取一块积木放到黄色积木块的位置上),此时机械臂会自动抓取放在灰色区域的方块,然后放到黄色区域内,然后返回准备位置。运行第七个代码单元前,需要把红色方块放到灰色的区域内,再运行第七个单元(从灰色积木块位置抓取一块积木放到红色积木块的位置上),这样红色的方块也会被抓取到红色的区域,其他的方块操作方式也是一样。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   创建机械臂对象
Arm   = Arm_Device()
time.sleep(.1)
#   定义夹积木块函数,enable=1:夹住,=0:松开
def   arm_clamp_block(enable):
    if enable == 0:
        Arm.Arm_serial_servo_write(6, 60,   400)
    else:
        Arm.Arm_serial_servo_write(6, 130,   400)
    time.sleep(.5) 

#   定义移动机械臂函数,同时控制1-5号舵机运动,p=[S1,S2,S3,S4,S5]
def   arm_move(p, s_time = 500):
    for i in range(5):
        id = i + 1
        if id == 5:
            time.sleep(.1)
            Arm.Arm_serial_servo_write(id,   p[i], int(s_time*1.2))
        else :
            Arm.Arm_serial_servo_write(id,   p[i], s_time)
        time.sleep(.01)
    time.sleep(s_time/1000)

#   机械臂向上移动
def   arm_move_up():
    Arm.Arm_serial_servo_write(2, 90, 1500)
    Arm.Arm_serial_servo_write(3, 90, 1500)
    Arm.Arm_serial_servo_write(4, 90, 1500)
    time.sleep(.1)
#   定义不同位置的变量参数
p_mould   = [90, 130, 0, 0, 90]
p_top   = [90, 80, 50, 50, 270]
p_Brown   = [90, 53, 33, 36, 270]
p_Yellow   = [65, 22, 64, 56, 270]
p_Red   = [117, 19, 66, 56, 270]
p_Green   = [136, 66, 20, 29, 270]
p_Blue   = [44, 66, 20, 28, 270]
#   让机械臂移动到一个准备抓取的位置
arm_clamp_block(0)
arm_move(p_mould,   1000)
time.sleep(1)
#   从灰色积木块位置抓取一块积木放到黄色积木块的位置上。
arm_move(p_top,   1000)
arm_move(p_Brown,   1000)
arm_clamp_block(1)

arm_move(p_top,   1000)
arm_move(p_Yellow,   1000)
arm_clamp_block(0)

arm_move(p_mould,   1000)

time.sleep(1)
#   从灰色积木块位置抓取一块积木放到红色积木块的位置上。
arm_move(p_top,   1000)
arm_move(p_Brown,   1000)
arm_clamp_block(1)

arm_move(p_top,   1000)
arm_move(p_Red,   1000)
arm_clamp_block(0)

arm_move_up()
arm_move(p_mould,   1100)

time.sleep(1)
#   从灰色积木块位置抓取一块积木放到绿色积木块的位置上。
arm_move(p_top,   1000)
arm_move(p_Brown,   1000)
arm_clamp_block(1)

arm_move(p_top,   1000)
arm_move(p_Green,   1000)
arm_clamp_block(0) 

arm_move_up()
arm_move(p_mould,   1100)

time.sleep(1)
#   从灰色积木块位置抓取一块积木放到蓝色积木块的位置上。
arm_move(p_top,   1000)
arm_move(p_Brown,   1000)
arm_clamp_block(1) 

arm_move(p_top,   1000)
arm_move(p_Blue,   1000)
arm_clamp_block(0)

arm_move_up()
arm_move(p_mould,   1100) 

time.sleep(1)
del   Arm  # 释放掉Arm对象