Skip to main content

远程控制与综合演示

注意: 使用以下 API 前,请先导入 pymycobot 库并初始化机械臂对象:

from pymycobot.mycobot280 import MyCobot280

mc = MyCobot280('/dev/ttyAMA0', 1000000)

零、这一节你会学到什么

前面的章节里,你已经学会了用 USB 线直连机械臂,用 Python 代码让它动起来。但有没有想过——如果不用 USB 线,甚至不用坐在机械臂旁边,也能控制它呢?

在这一节里,你将解锁三个更酷的技能:

  1. TCP/IP 远程控制:让机械臂连上 WiFi,你在教室这头敲代码,机械臂在实验室那头动起来。网线?不需要。在同一个网络里,它就能"听到"你的指令。
  2. 手柄控制:写好的程序固然方便,但有时候你就是想"亲手"操控机械臂,像打游戏一样按按钮。一个游戏手柄就能搞定。
  3. 综合演示案例:把前面学过的所有知识串起来,8 个完整的小项目——从让机械臂跳灯光秀,到让它跳机械舞,再到用夹爪和吸泵完成搬运任务。

这些已经不只是"基础操作"了,而是真正的机器人应用。准备好了吗?

本节自由探索项目

🎮 终极挑战:学完 TCP/IP 和手柄控制后,你能不能写一个程序——用手柄控制机械臂移动到某个位置,然后自动执行一段预设的舞蹈动作?

换句话说,把"手动操控"和"自动程序"结合起来。这听起来很难,但其实就是把这一节两部分的内容拼在一起。试试看,你能做到哪一步?

真正的机器人工程师,不只是会写代码的人,而是能 “充分” 调动自己的知识和技能,赋予机器以 “灵魂”, 让机器听从你指挥的人。


从这一节开始,你正在从"操作员"变成"指挥官"。

——也是我说的


一、TCP/IP 远程控制

高中生导读

TCP/IP 是什么?你可以把它理解为机械臂的"电话系统"

平时你用 USB 线控制机械臂,就像两个人面对面说话——距离不能太远。但有了 TCP/IP,机械臂就像有了电话号码,只要你们连在同一个 WiFi 下(同一个"电话网络"),你在任何地方都能"打给它",让它执行指令。

这里有两个角色:

  • 服务器(Server):运行在机械臂的树莓派上,负责"接听电话"
  • 客户端(Client):运行在你的电脑上,负责"拨打电话"发出指令

1.1 概述

TCP/IP 远程控制让你摆脱 USB 线的束缚。只要机械臂和你的电脑在同一个局域网内,你就可以通过网络发送指令,控制机械臂运动、获取状态、甚至运行复杂的自动化程序。

TCP/IP 服务器启动示意图

1.2 服务器端设置(树莓派)

服务器端程序需要运行在连接了机械臂的树莓派上。

步骤如下:

  1. 克隆 pymycobot 仓库:
克隆 pymycobot 仓库
git clone https://github.com/elephantrobotics/pymycobot.git
  1. 找到服务器程序:
进入服务器程序目录
cd pymycobot/demo
# 找到 Server_280.py 文件
  1. 编辑 Server_280.py 的最后一行,根据你的机械臂型号修改参数(默认是 280PI,串口 /dev/ttyAMA0,波特率 1000000):
Server_280.py 末尾配置
# 默认配置示例
mc = MyCobot280("/dev/ttyAMA0", 1000000)
  1. 在树莓派上运行服务器:
启动服务器
python Server_280.py
  1. 看到 "Binding succeeded" 和 "waiting connect" 的提示后,服务器就准备好了,等待客户端连接。
怎么知道树莓派的 IP 地址?

在树莓派的终端里输入 ifconfigip addr,找到类似 192.168.x.x172.20.x.x 的地址,那就是你的树莓派 IP。客户端连接时需要用到它。

1.3 客户端使用(你的电脑)

客户端程序运行在你的电脑上,通过网络连接到树莓派上的服务器。

TCP/IP 客户端控制示例
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 手柄按钮功能映射

按钮编号功能说明
1RX 增加(绕 X 轴旋转,正向)
2RX 减少(绕 X 轴旋转,负向)
3RY 增加(绕 Y 轴旋转,正向)
4RY 减少(绕 Y 轴旋转,负向)
5X 增加(X 轴正向移动)
6X 减少(X 轴负向移动)
7Y 减少(Y 轴负向移动)
8Y 增加(Y 轴正向移动)
9Z 减少(Z 轴负向移动,下降)
10Z 增加(Z 轴正向移动,上升)
11RZ 减少(绕 Z 轴旋转,负向)
12RZ 增加(绕 Z 轴旋转,正向)
13唤醒手柄(从休眠状态恢复)
X 键打开夹爪
Y 键关闭夹爪
A 键打开吸泵
B 键关闭吸泵
Left 1(长按 2 秒)初始化到零位
Left 2(长按 2 秒)释放所有关节(关闭力矩)
Right 1(长按 2 秒)初始化到起始位置
Right 2(长按 2 秒)锁定所有关节(使能力矩)
按钮编号怎么看?

手柄上的按钮编号可能因手柄型号不同而有差异。一般来说,编号对应的是手柄上的数字键或功能键。如果不确定,可以运行程序后逐个按按看,观察机械臂的反应来确认。

2.3 手柄控制设置步骤

  1. 将机械臂和手柄同时连接到电脑(手柄通过 USB 或蓝牙)

  2. 克隆 pymycobot 仓库:

克隆 pymycobot 仓库
git clone https://github.com/elephantrobotics/pymycobot
  1. 进入手柄控制目录并安装依赖:
安装手柄控制依赖
cd pymycobot/demo/handle_control
pip3 install -r requirements.txt
  1. 编辑 myCobot280_handle_control.py,修改串口配置:
修改串口配置
# 找到这一行,改成你的实际串口
mc = MyCobot280("/dev/ttyAMA0", 1000000)
  1. 运行手柄控制程序:
启动手柄控制
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 灯循环变换颜色——蓝、红、绿,像一个小型灯光秀。

RGB 灯光控制示例
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 控制吸泵时,务必确保接线正确。错误的接线可能损坏树莓派或机械臂。首次测试时,建议先单独测试 GPIO 输出(用 LED 灯代替吸泵),确认逻辑正确后再连接实际设备。

代码解析

这个示例展示了一个完整的自动化搬运流程:

  1. 初始化 GPIO 和机械臂
  2. 定义三个关键位置(取物、过渡、放置)
  3. 开启吸泵,移动到物体上方吸取
  4. 经过过渡点,移动到放置位置
  5. 关闭吸泵并泄气,释放物体

pump_on()pump_off() 被封装成了函数,这让主程序逻辑更清晰。你可以试着修改 angles 列表里的数值,让机械臂搬运到不同的位置。


四、把远程控制和手柄结合起来

到这一步,你已经掌握了三种控制机械臂的方式:

  1. Python 代码自动运行(前面几节学的)
  2. TCP/IP 网络远程控制(本节第一部分)
  3. 手柄实时操控(本节第二部分)

现在,是时候发挥你的创造力了。

本节自由探索项目

🎯 终极挑战:混合控制模式

能不能设计一个这样的系统:

  • 用手柄把机械臂移动到一个位置
  • 按某个按钮,让机械臂自动执行一段预设程序(比如跳一段机械舞)
  • 程序结束后,又可以切回手柄控制

或者更复杂一点:

  • 用 TCP/IP 从电脑上发送指令
  • 机械臂执行指令的同时,用手柄可以随时"接管"控制权
  • 松开手柄按钮,机械臂继续执行电脑发来的指令

这听起来像科幻电影?其实只是把这一节的内容拼在一起而已。真正的工程师,不是学最多知识的人,而是最会把已有知识组合出新东西的人。

当你能让机械臂跨越空间听从你的指令,


当你能用游戏手柄像操控角色一样操控真实的机器,


当你能把灯光、运动、抓取组合成一场表演——


你已经不再是一个"学生"了。


你是一个。。。(我编不下去了,请大家帮我编一下)

——还是我说的


参考文档