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 操作步骤
- 运行代码;
- 按下按键可以控制机械臂移动;
- 移动到需要的空间坐标点后,按下 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 操作步骤
- 更改move.txt文件中的内容:

再最下方按照相同格式再添加一行新Gcode
保存后重新运行代码;
机械臂按照文件内容移动;
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循环对内容进行解析
机械臂根据解析结果运行