RobotArm OpenMV 机械臂 — 按键示教和txt文件控制机械臂教程

星瞳科技OpenMV视频教程 - 按键示教和txt文件控制机械臂教程

1. 简介

本教程演示如何使用 OpenMV 摄像头配合机械臂,实现按键示教和 txt 文件控制机械臂的功能。

项目代码库:OpenMV-Robot-Arm-Project-Key Teaching

项目代码库:OpenMV-Robot-Arm-Project-Load File and Move

2. 按键示教

2.1 所需文件

  • main.py:主程序,包含按键示教代码;
  • Robot_arm.py:机械臂控制模块。

2.2 操作步骤

  1. 运行代码;
  2. 按下按键可以控制机械臂移动;
  3. 移动到需要的空间坐标点后,按下 5 号按键记录当前坐标;
  4. 当记录完所有的需要的坐标之后,连续按下两次 5 号按键;
  5. 机械臂开始回放;

具体流程遵循以下流程图:

3. 按键示教代码解析

def playback_positions():
    """回放保存的示教点:先回到初始点,再按保存顺序回放。

    回放逻辑:
    - 如果没有保存点则直接返回。
    - (可选)先复位机械臂到默认位置,再依次移动到每个保存点并设置舵机角度。
    - 每个点移动后休眠以保证机械臂有足够时间完成动作。
    """
    global angle, X, Y, Z, positions
    if len(positions) == 0:
        print("没有保存的示教点,无法回放。")
        return
    print("示教前回到初始点...")
    # robot.home_setting()#可选择:在回放前执行复位
    robot.set_xyz_point(0, 174, 290, 0, 0)
    print("开始示教,回放 %d 个点" % len(positions))
    for idx, p in enumerate(positions):
        x, y, z, a_servo = p
        print("回放点 %d: %s" % (idx+1, str(p)))
        robot.set_xyz_point(x, y, z, 0, 0)
        try:
            robot.Servo(int(a_servo))
        except Exception:
            pass
        # 等待一段时间再到下一个点,确保机械臂有时间运动
        time.sleep_ms(800)

此代码是回放代码,双击5号按键后,机械臂会先回到初始坐标,然后按照记录的点进行移动。

# 通过 AD 按键控制机械臂(key 值由底层驱动 `robot.ad_key_control()` 返回)
def key_control():
    """读取按键并根据按键编号调整舵机或 XYZ 坐标。

    按键映射(根据驱动返回值):
    - 1: 舵机角度增加(+Servo_LEN)
    - 7: 舵机角度减少(-Servo_LEN)
    - 2: X 轴减少(向左或后退,-XYZ_LEN)
    - 8: X 轴增加(向右或前进,+XYZ_LEN)
    - 4: Y 轴增加(+XYZ_LEN)
    - 6: Y 轴减少(-XYZ_LEN)
    - 9: Z 轴增加(+XYZ_LEN)
    - 3: Z 轴减少(-XYZ_LEN)
    - 5: 保存当前位置到示教点列表(触发保存与可能的回放)
    """
    global angle, X, Y, Z
    key = robot.ad_key_control()
    if key != 0:
        print(key)
        if key == 1:
            # 增加舵机角度并应用
            angle = angle + Servo_LEN
            robot.Servo(angle)
        elif key == 7:
            # 减小舵机角度并应用
            angle = angle - Servo_LEN
            robot.Servo(angle)
        elif key == 2:
            # X 轴向负方向移动
            X = X - XYZ_LEN
            robot.set_xyz_point(X, Y, Z, 0, 0)
        elif key == 8:
            # X 轴向正方向移动
            X = X + XYZ_LEN
            robot.set_xyz_point(X, Y, Z, 0, 0)
        elif key == 4:
            # Y 轴向正方向移动
            Y = Y + XYZ_LEN
            robot.set_xyz_point(X, Y, Z, 0, 0)
        elif key == 6:
            # Y 轴向负方向移动
            Y = Y - XYZ_LEN
            robot.set_xyz_point(X, Y, Z, 0, 0)
        elif key == 9:
            # Z 轴向上(增加)移动
            Z = Z + XYZ_LEN
            robot.set_xyz_point(X, Y, Z, 0, 0)
        elif key == 3:
            # Z 轴向下(减少)移动
            Z = Z - XYZ_LEN
            robot.set_xyz_point(X, Y, Z, 0, 0)
        elif key == 5:
            # 保存当前位置到示教点列表
            cur = robot.get_xyz_point()
            # 使用当前程序维护的 angle 作为夹爪角度
            saved = (float(cur[0]), float(cur[1]), float(cur[2]), float(angle))
            positions.append(saved)
            print("位置已保存:", saved, " 共计:", len(positions))
            # 如果连续两个保存点相同则删除前一个重复点,再触发回放
            if len(positions) >= 2 and is_same_point(positions[-1], positions[-2]):
                positions.pop(-2)  # 删除前一个重复的点,保留最新保存的点
                print("开始回放")
                playback_positions()

key_control代码与按键控制机械臂例程中的并没有多大区别(故book中保留此教程)

不同之处主要集中在按键5对应的任务:由按键控制机械臂例程中的机械臂复位改为了记录坐标和回放。

3. txt文件控制机械臂

3.1 所需文件

  • main.py:主程序,包含按键示教代码;
  • Robot_arm.py:机械臂控制模块;
  • move.txt:写由Gcode,机械臂会按照Gcode运行。

3.2 操作步骤

  1. 更改move.txt文件中的内容:

再最下方按照相同格式再添加一行新Gcode

  1. 保存后重新运行代码;

  2. 机械臂按照文件内容移动;

4. txt文件控制机械臂代码解析

def execute_moves_from_file(robot, filename="move.txt", delay_between=1.0):
    """从文本文件按行读取移动指令并发送给机械臂。

    - `robot`: Robot_arm 的实例,用于发送运动命令
    - `filename`: 指令文件路径,默认在当前目录下为 `move.txt`
    - `delay_between`: 在执行两个 XYZ 移动之间的延迟(秒),用于给机械结构留出时间

    文件格式要求:每行一条指令,可包含注释行(以 `#` 开头)和空行。
    每行可以只包含部分参数(例如只设置舵机 S),函数会根据存在的字段执行相应动作。
    """
    try:
        with open(filename, 'r') as f:
            lines = f.readlines()
    except Exception as e:
        print('无法打开指令文件:', filename, e)
        return

    for i, line in enumerate(lines):
        line = line.strip()
        # 跳过空行或注释行
        if not line or line.startswith('#'):
            continue
        cmd = parse_move_line(line)
        print('执行指令行', i+1, cmd)
        try:
            # 如果同时提供了 X、Y、Z,则进行空间移动
            if cmd['X'] is not None and cmd['Y'] is not None and cmd['Z'] is not None:
                E = cmd['E'] if cmd['E'] is not None else 0
                F = cmd['F'] if cmd['F'] is not None else 0
                robot.set_xyz_point(cmd['X'], cmd['Y'], cmd['Z'], E, F)
                # 等待一段时间,给电机完成动作(可替换为状态查询/回执检查)
                time.sleep(delay_between)

            # 如果提供了 S 字段,则设定舵机角度(通常为夹爪)
            if cmd['S'] is not None:
                robot.Servo(int(cmd['S']))
                # Servo 命令通常会有串口返回,稍作停顿以稳定
                time.sleep(0.2)
        except Exception as e:
            print('执行指令时出错:', e)
            # 继续执行下一行,不让单行错误中断整个序列
            continue


# 启动时从文件执行一次指令(如果需要可改成按键触发或循环调用)
execute_moves_from_file(robot, "move.txt", delay_between=1.0)

加载move.txt内容

使用for循环对内容进行解析

机械臂根据解析结果运行

results matching ""

    No results matching ""