远程控制与综合演示
注意: 使用以下 API 前,请先导入 pymycobot 库并初始化机械臂对象:
from pymycobot.mycobot280 import MyCobot280mc = MyCobot280('/dev/ttyAMA0', 1000000)
零、这一节你会学到什么
前面的章节里,你已经学会了用 USB 线直连机械臂,用 Python 代码让它动起来。但有没有想过——如果不用 USB 线,甚至不用坐在机械臂旁边,也能控制它呢?
在这一节里,你将解锁三个更酷的技能:
- TCP/IP 远程控制:让机械臂连上 WiFi,你在教室这头敲代码,机械臂在实验室那头动起来。网线?不需要。在同一个网络里,它就能"听到"你的指令。
- 手柄控制:写好的程序固然方便,但有时候你就是想"亲手"操控机械臂,像打游戏一样按按钮。一个游戏手柄就能搞定。
- 综合演示案例:把前面学过的所有知识串起来,8 个完整的小项目——从让机械臂跳灯光秀,到让它跳机械舞,再到用夹爪和吸泵完成搬运任务。
这些已经不只是"基础操作"了,而是真正的机器人应用。准备好了吗?
🎮 终极挑战:学完 TCP/IP 和手柄控制后,你能不能写一个程序——用手柄控制机械臂移动到某个位置,然后自动执行一段预设的舞蹈动作?
换句话说,把"手动操控"和"自动程序"结合起来。这听起来很难,但其实就是把这一节两部分的内容拼在一起。试试看,你能做到哪一步?
❝
真正的机器人工程师,不只是会写代码的人,而是能 “充分” 调动自己的知识和技能,赋予机器以 “灵魂”, 让机器听从你指挥的人。
从这一节开始,你正在从"操作员"变成"指挥官"。
——也是我说的
一、TCP/IP 远程控制
TCP/IP 是什么?你可以把它理解为机械臂的"电话系统"。
平时你用 USB 线控制机械臂,就像两个人面对面说话——距离不能太远。但有了 TCP/IP,机械臂就像有了电话号码,只要你们连在同一个 WiFi 下(同一个"电话网络"),你在任何地方都能"打给它",让它执行指令。
这里有两个角色:
- 服务器(Server):运行在机械臂的树莓派上,负责"接听电话"
- 客户端(Client):运行在你的电脑上,负责"拨打电话"发出指令
1.1 概述
TCP/IP 远程控制让你摆脱 USB 线的束缚。只要机械臂和你的电脑在同一个局域网内,你就可以通过网络发送指令,控制机械臂运动、获取状态、甚至运行复杂的自动化程序。

1.2 服务器端设置(树莓派)
服务器端程序需要运行在连接了机械臂的树莓派上。
步骤如下:
- 克隆 pymycobot 仓库:
git clone https://github.com/elephantrobotics/pymycobot.git
- 找到服务器程序:
cd pymycobot/demo
# 找到 Server_280.py 文件
- 编辑
Server_280.py的最后一行,根据你的机械臂型号修改参数(默认是 280PI,串口/dev/ttyAMA0,波特率 1000000):
# 默认配置示例
mc = MyCobot280("/dev/ttyAMA0", 1000000)
- 在树莓派上运行服务器:
python Server_280.py
- 看到 "Binding succeeded" 和 "waiting connect" 的提示后,服务器就准备好了,等待客户端连接。
在树莓派的终端里输入 ifconfig 或 ip addr,找到类似 192.168.x.x 或 172.20.x.x 的地址,那就是你的树莓派 IP。客户端连接时需要用到它。
1.3 客户端使用(你的电脑)
客户端程序运行在你的电脑上,通过网络连接到树莓派上的服务器。
from pymycobot import MyCobot280Socket
# 默认端口是 9000,把 IP 换成你树莓派的实际 IP 地址
mc = MyCobot280Socket("172.20.10.14", 9000)
# 连接成功后,所有 API 方法和本地控制一模一样!
mc.send_angles([0, 0, 0, 0, 0, 0], 20)
res = mc.get_angles()
print(res)
- 树莓派和电脑必须在同一个网络(同一个 WiFi 或同一个路由器下)
- 必须先启动服务器,再运行客户端程序
- 如果连接失败,检查防火墙设置,确保端口 9000 没有被阻挡
1.4 TCP/IP 控制 API
1.4.1 MyCobot280Socket(ip, port)
- 功能: 创建一个基于 TCP/IP 连接的机械臂控制对象
- 参数说明:
ip(str):树莓派的 IP 地址port(int):端口号,默认 9000
- 返回值: MyCobot280Socket 对象
1.4.2 send_angles(angles, speed)
- 功能: 通过网络发送角度指令给机械臂
- 参数说明:
angles:六个关节的角度值列表speed:运动速度,范围 1~100
- 返回值: 执行结果
注意: TCP/IP 连接成功后,所有本地 API 方法都可以通过网络调用,包括
send_angles()、get_angles()、send_coords()、set_color()等。
二、手柄控制
手柄控制就像把机械臂变成游戏角色。你按下手柄上的按钮,机械臂就做出对应的动作——前进、后退、转弯、抓取。
这背后的原理很简单:手柄通过蓝牙或 USB 连接到电脑,程序不断读取你按了哪个按钮,然后把这个按钮"翻译"成机械臂能懂的指令。比如"按上键"翻译成"Z 轴增加","按 A 键"翻译成"打开吸泵"。
手柄需要另外购买,不是机械臂的标准配件。但如果你有一个游戏手柄(比如 Xbox 或 PS 手柄),就可以试试这个玩法。
2.1 概述
使用游戏手柄控制机械臂,是一种更直观、更具互动性的操控方式。特别适合需要实时调整位置的场景,比如手动示教、现场调试,或者——单纯觉得用代码控制不够帅 😎

2.2 手柄按钮功能映射
| 按钮编号 | 功能说明 |
|---|---|
| 1 | RX 增加(绕 X 轴旋转,正向) |
| 2 | RX 减少(绕 X 轴旋转,负向) |
| 3 | RY 增加(绕 Y 轴旋转,正向) |
| 4 | RY 减少(绕 Y 轴旋转,负向) |
| 5 | X 增加(X 轴正向移动) |
| 6 | X 减少(X 轴负向移动) |
| 7 | Y 减少(Y 轴负向移动) |
| 8 | Y 增加(Y 轴正向移动) |
| 9 | Z 减少(Z 轴负向移动,下降) |
| 10 | Z 增加(Z 轴正向移动,上升) |
| 11 | RZ 减少(绕 Z 轴旋转,负向) |
| 12 | RZ 增加(绕 Z 轴旋转,正向) |
| 13 | 唤醒手柄(从休眠状态恢复) |
| X 键 | 打开夹爪 |
| Y 键 | 关闭夹爪 |
| A 键 | 打开吸泵 |
| B 键 | 关闭吸泵 |
| Left 1(长按 2 秒) | 初始化到零位 |
| Left 2(长按 2 秒) | 释放所有关节(关闭力矩) |
| Right 1(长按 2 秒) | 初始化到起始位置 |
| Right 2(长按 2 秒) | 锁定所有关节(使能力矩) |
手柄上的按钮编号可能因手柄型号不同而有差异。一般来说,编号对应的是手柄上的数字键或功能键。如果不确定,可以运行程序后逐个按按看,观察机械臂的反应来确认。
2.3 手柄控制设置步骤
-
将机械臂和手柄同时连接到电脑(手柄通过 USB 或蓝牙)
-
克隆 pymycobot 仓库:
git clone https://github.com/elephantrobotics/pymycobot
- 进入手柄控制目录并安装依赖:
cd pymycobot/demo/handle_control
pip3 install -r requirements.txt
- 编辑
myCobot280_handle_control.py,修改串口配置:
# 找到这一行,改成你的实际串口
mc = MyCobot280("/dev/ttyAMA0", 1000000)
- 运行手柄控制程序:
python3 myCobot280_handle_control.py
运行程序后,必须先按 Right 1 键(长按 2 秒)初始化机械臂到起始位置,然后再进行其他操作。这是安全保护措施,防止机械臂在未知状态下突然运动。
2.4 手柄控制完整代码
from pymycobot import MyCobot280
import time
# 初始化机械臂(根据实际串口修改)
mc = MyCobot280("/dev/ttyAMA0", 1000000)
# 手柄控制逻辑在这里运行
# 程序会持续监听手柄输入,并将按钮映射为机械臂动作
- 确认手柄已正确连接并被系统识别
- 检查
requirements.txt中的依赖是否全部安装成功 - 有些手柄需要按"模式键"切换到 PC 模式才能被识别
- 查看程序输出的调试信息,确认手柄是否被检测到
三、综合演示案例
这一节有 8 个完整的代码示例,每一个都是一个"小项目"。你可以把它们理解为机械臂的"才艺表演"——有的会变色,有的会跳舞,有的会抓取东西。
建议你不要只是复制粘贴运行,而是逐行看看代码在做什么。每个示例都只用到了前面学过的 API,但组合方式不同,效果就完全不同。这就是编程的魅力:同样的积木,不同的搭法,造出完全不同的东西。
以下所有示例均以 MyCobot 280 为参考模型。如果你使用的是其他型号,请根据实际情况调整波特率等参数。
3.1 示例一:RGB 灯光控制
让机械臂末端的 LED 灯循环变换颜色——蓝、红、绿,像一个小型灯光秀。
from pymycobot.mycobot280 import MyCobot280
import time
mc = MyCobot280("/dev/ttyAMA0", 1000000)
i = 7
while i > 0:
mc.set_color(0, 0, 255) # 蓝色
time.sleep(2)
mc.set_color(255, 0, 0) # 红色
time.sleep(2)
mc.set_color(0, 255, 0) # 绿色
time.sleep(2)
i -= 1
📹 演示视频:
set_color(r, g, b) 的三个参数分别是红、绿、蓝的亮度,范围 0~255。通过组合这三个数字,你可以调出任何颜色。试试把上面的数字改一改,看看能调出什么新颜色?
3.2 示例二:回归原点
让机械臂回到初始的零位姿态,并检查控制器连接状态。
from pymycobot.mycobot280 import MyCobot280
mc = MyCobot280("/dev/ttyAMA0", 1000000)
if mc.is_controller_connected() != 1:
print("请正确连接机械臂进行程序写入")
exit(0)
mc.send_angles([0, 0, 0, 0, 0, 0], 30)
📹 演示视频:
is_controller_connected() 是一个很有用的检查函数。在正式运行程序前,先确认机械臂连接正常,可以避免很多莫名其妙的错误。这就像出门前检查钥匙带没带——好习惯。
3.3 示例三:单关节运动
逐个控制每个关节,让机械臂像在做"伸展运动"一样依次活动每个关节。
from pymycobot import MyCobot280
import time
mc = MyCobot280('/dev/ttyAMA0', 1000000)
mc.send_angles([0, 0, 0, 0, 0, 0], 40)
time.sleep(3)
mc.send_angle(3, 70, 40) # 关节 3 转动到 70°
time.sleep(3)
mc.send_angle(4, -70, 40) # 关节 4 转动到 -70°
time.sleep(3)
mc.send_angle(1, 90, 40) # 关节 1 转动到 90°
time.sleep(3)
mc.send_angle(5, -90, 40) # 关节 5 转动到 -90°
time.sleep(3)
mc.send_angle(5, 90, 40) # 关节 5 转动到 90°
time.sleep(3)
📹 演示视频:
send_angle(joint_id, angle, speed) 只控制一个关节,而 send_angles() 控制所有关节。单关节控制适合调试和示教——你可以逐个检查每个关节的运动范围是否正常。
3.4 示例四:多关节联动
让机械臂在几个预设姿态之间流畅切换,展示多关节协调运动。
import time
from pymycobot import MyCobot280
mc = MyCobot280('/dev/ttyAMA0', 1000000)
mc.send_angles([0, 0, 0, 0, 0, 0], 50)
time.sleep(2.5)
mc.send_angles([90, 45, -90, 90, -90, 90], 50)
time.sleep(2.5)
mc.send_angles([0, 0, 0, 0, 0, 0], 50)
time.sleep(2.5)
mc.send_angles([-90, -45, 90, -90, 90, -90], 50)
time.sleep(2.5)
📹 演示视频:
这个示例展示了机械臂的"对称姿态"。注意观察第二组和第四组角度——它们几乎是镜像相反的。你可以试着修改这些角度值,创造出你自己的"机械臂体操"动作序列。
3.5 示例五:左右摇摆
让机械臂像钟摆一样左右摇摆,然后回到一个特定姿态并释放关节力矩。
from pymycobot.mycobot280 import MyCobot280
import time
mc = MyCobot280("/dev/ttyAMA0", 1000000)
angle_datas = mc.get_angles()
print(angle_datas)
mc.send_angles([0, 0, 0, 0, 0, 0], 50)
time.sleep(2.5)
mc.send_angle(1, 90, 50)
time.sleep(2)
num = 5
while num > 0:
mc.send_angle(2, 50, 50)
time.sleep(1.5)
mc.send_angle(2, -50, 50)
time.sleep(1.5)
num -= 1
mc.send_angles([88.68, -138.51, 155.65, -128.05, -9.93, -15.29], 50)
time.sleep(2.5)
mc.release_all_servos()
📹 演示视频:
release_all_servos() 是一个很有趣的函数——它会让所有关节"松手",机械臂会因为重力自然下垂。你可以用手轻轻推动它,像推动一个没有通电的玩具一样。这在调试和手动调整位置时非常有用。
3.6 示例六:机械舞
让机械臂跟着节奏"跳舞",同时配合 LED 灯颜色变化。这是所有示例里最酷的一个!
from pymycobot.mycobot280 import MyCobot280
import time
if __name__ == '__main__':
mc = MyCobot280("/dev/ttyAMA0", 1000000)
# 移动到起始姿态
start = time.time()
mc.send_angles([-1.49, 115, -153.45, 30, -33.42, 137.9], 80)
while not mc.is_in_position([-1.49, 115, -153.45, 30, -33.42, 137.9], 0):
mc.resume()
time.sleep(0.5)
mc.pause()
if time.time() - start > 3:
break
# 开始跳舞,持续 30 秒
start = time.time()
while time.time() - start < 30:
mc.send_angles([-1.49, 115, -153.45, 30, -33.42, 137.9], 80)
mc.set_color(0, 0, 50) # 偏蓝
time.sleep(0.7)
mc.send_angles([-1.49, 55, -153.45, 80, 33.42, 137.9], 80)
mc.set_color(0, 50, 0) # 偏绿
time.sleep(0.7)
📹 演示视频:
这个示例用到了 is_in_position() 来检查机械臂是否到达目标位置,以及 pause() 和 resume() 来控制运动暂停和恢复。配合 set_color() 让灯光随动作变色,效果就像机械臂真的在跟着音乐跳舞一样。你可以把 time.sleep(0.7) 改成其他数值,让舞步变快或变慢。
3.7 示例七:夹爪控制
全面演示夹爪的各种控制方式:开合、位置控制、状态切换,以及编码器设置。
from pymycobot.mycobot280 import MyCobot280
import time
def gripper_test(mc):
print("Start check IO part of api\n")
flag = mc.is_gripper_moving()
print("Is gripper moving: {}".format(flag))
time.sleep(1)
mc.set_encoder(1, 2048, 20)
time.sleep(2)
mc.set_encoders([1024, 1024, 1024, 1024, 1024, 1024], 20)
time.sleep(3)
print(mc.get_encoder(1))
mc.set_encoder(7, 2048, 20)
time.sleep(3)
mc.set_encoder(7, 1300, 20)
time.sleep(3)
mc.set_gripper_value(255, 70)
time.sleep(3)
mc.set_gripper_value(255, 70)
time.sleep(3)
num = 5
while num > 0:
mc.set_gripper_state(0, 70)
time.sleep(3)
mc.set_gripper_state(1, 70)
time.sleep(3)
num -= 1
print("")
print(mc.get_gripper_value())
if __name__ == "__main__":
mc = MyCobot280('/dev/ttyAMA0', 1000000)
mc.set_encoders([2048, 2048, 2048, 2048, 2048, 2048], 20)
time.sleep(3)
gripper_test(mc)
📹 演示视频:
这个示例把夹爪的各种 API 串在了一起:先检查夹爪是否在动,然后设置编码器位置,再控制夹爪开合。set_gripper_value(255, 70) 让夹爪转动到最大位置,set_gripper_state(0, 70) 和 set_gripper_state(1, 70) 则是直接命令夹爪打开和关闭。
3.8 示例八:吸泵控制(树莓派版本)
用 GPIO 控制吸泵完成一个完整的"吸取—搬运—释放"任务。这是最具实用价值的一个示例。
from pymycobot.mycobot280 import MyCobot280
import time
import RPi.GPIO as GPIO
mc = MyCobot280('/dev/ttyAMA0', 1000000)
# 定义三个关键位置
angles = [
[92.9, -10.1, -60, 5.8, -2.02, -37.7], # 位置 0:取物点
[92.9, -53.7, -83.05, 50.09, -0.43, -38.75], # 位置 1:中间过渡点
[92.9, -10.1, -87.27, 5.8, -2.02, -37.7] # 位置 2:放置点
]
# 初始化 GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.OUT) # 吸泵控制
GPIO.setup(21, GPIO.OUT) # 泄气阀门控制
def pump_on():
"""开启吸泵"""
GPIO.output(20, 0)
def pump_off():
"""关闭吸泵并泄气"""
GPIO.output(20, 1)
time.sleep(0.05)
GPIO.output(21, 0)
time.sleep(1)
GPIO.output(21, 1)
time.sleep(0.05)
# 回到初始位置
mc.send_angles([0, 0, 0, 0, 0, 0], 30)
time.sleep(3)
# 执行任务:吸取物体
pump_on()
mc.send_angles(angles[2], 30)
time.sleep(2)
mc.send_angles(angles[1], 30)
time.sleep(2)
mc.send_angles(angles[0], 30)
time.sleep(2)
mc.send_angles(angles[1], 30)
time.sleep(2)
# 释放物体
pump_off()
mc.send_angles(angles[0], 40)
time.sleep(1.5)
📹 演示视频:
使用 GPIO 控制吸泵时,务必确保接线正确。错误的接线可能损坏树莓派或机械臂。首次测试时,建议先单独测试 GPIO 输出(用 LED 灯代替吸泵),确认逻辑正确后再连接实际设备。
这个示例展示了一个完整的自动化搬运流程:
- 初始化 GPIO 和机械臂
- 定义三个关键位置(取物、过渡、放置)
- 开启吸泵,移动到物体上方吸取
- 经过过渡点,移动到放置位置
- 关闭吸泵并泄气,释放物体
pump_on() 和 pump_off() 被封装成了函数,这让主程序逻辑更清晰。你可以试着修改 angles 列表里的数值,让机械臂搬运到不同的位置。
四、把远程控制和手柄结合起来
到这一步,你已经掌握了三种控制机械臂的方式:
- Python 代码自动运行(前面几节学的)
- TCP/IP 网络远程控制(本节第一部分)
- 手柄实时操控(本节第二部分)
现在,是时候发挥你的创造力了。
🎯 终极挑战:混合控制模式
能不能设计一个这样的系统:
- 用手柄把机械臂移动到一个位置
- 按某个按钮,让机械臂自动执行一段预设程序(比如跳一段机械舞)
- 程序结束后,又可以切回手柄控制
或者更复杂一点:
- 用 TCP/IP 从电脑上发送指令
- 机械臂执行指令的同时,用手柄可以随时"接管"控制权
- 松开手柄按钮,机械臂继续执行电脑发来的指令
这听起来像科幻电影?其实只是把这一节的内容拼在一起而已。真正的工程师,不是学最多知识的人,而是最会把已有知识组合出新东西的人。
❝
当你能让机械臂跨越空间听从你的指令,
当你能用游戏手柄像操控角色一样操控真实的机器,
当你能把灯光、运动、抓取组合成一场表演——
你已经不再是一个"学生"了。
你是一个。。。(我编不下去了,请大家帮我编一下)
——还是我说的
参考文档