运动控制¶
开始前确认已按 准备与自检 做完四步,尤其是第 4 步运动自检。
会驱动真实电机
运行前清空爪子的运动范围,手指远离夹爪,确认可以随时断开 24V。机器人上的从夹爪先在机器人静止时测试。
用键盘控制¶
第一次运动建议用键盘控制台:
| 按键 | 作用 |
|---|---|
j / k |
张开 / 闭合一步 |
o / c |
全开 / 全合 |
h |
停在当前位置 |
d / e |
松开电机 / 恢复控制 |
f |
清除故障 |
q 或 Esc |
退出 |
默认是阻抗控制;要以指定的力夹东西,加 --mode force-position --grasp-torque 0.6(夹持力,单位 N·m,不超过 1.1)。
两种控制方式¶
| 阻抗控制(默认) | 力位控制 | |
|---|---|---|
| 适合 | 跟随一个开度:遥操作、跟随主夹爪、执行策略 | 以设定的力夹住物体 |
| 被物体挡住时 | 以 1.1N·m 顶住 | 以设定的夹持力顶住,并报告已夹住 |
开度用 0 到 1 表示:0 = 闭合,1 = 张开。
在程序里控制¶
阻抗控制:
import time
import xense.taccap as t
g = t.FollowerGripper(t.find_follower().mcu_device)
cfg = t.ImpedanceConfig.for_spec(g.motor.get_spec())
g.motor.clear_fault()
with t.ImpedanceController(g, cfg) as c: # 退出 with 时自动停止并松开电机
g.motor.enable()
c.set_target(0.0) # 闭合
time.sleep(2)
print("开度", c.snapshot().observation.position)
c.set_target(1.0) # 张开
time.sleep(2)
遥操作或执行策略时,在控制循环里每个周期调用一次 c.set_target(开度) 即可,不需要等待。
力位控制,换一个配置和控制器,其余相同:
cfg = t.ForcePositionConfig.for_spec(g.motor.get_spec())
cfg.grasp_torque_nm = 0.6 # 夹持力,不超过 1.1 N·m
g.motor.clear_fault()
with t.ForcePositionController(g, cfg) as c:
g.motor.enable()
c.set_target(0.0) # 闭合夹取
time.sleep(2)
print("夹住了" if c.snapshot().holding else "没有夹到东西")
c.release() # 松开
time.sleep(2)
使用要点:
- 配置一律用
for_spec(g.motor.get_spec())生成,只按需要改夹持力。 - 先启动控制器,再
g.motor.enable(),上面的写法已经是这个顺序。 - 一只夹爪同时只运行一个控制器。
- 力位控制跟随连续目标时,比目标晚约一个发送周期(50Hz 下约 20ms),换来平顺的运动。
- 控制过程中读开度、速度、力矩、温度,用
c.snapshot().observation,不要另外去读电机状态。 - 接口细节与示例脚本见 API 与示例。
停止控制或断链时夹爪会松开
控制器停止(退出 with、程序结束)、控制台按 d / q,或 USB 断开,夹爪会松开,夹持物会掉落。
机器人夹持物体时,先将物体放到安全位置再停止控制。
长时间夹持会降低夹持力
电机发热后固件自动降低输出。实测 1.1N·m 持续夹 10 分钟,电机升到约 70°C;0.6N·m 稳定在约 49°C。 需持续夹持数十分钟时,将夹持力降至约 0.6N·m。
故障与恢复¶
控制器检测到异常会停下并卸力,c.snapshot().state 变为 FAULT,原因在 c.snapshot().fault_reason。
排除原因后依次调用 g.motor.clear_fault() 和 c.reset() 即可继续;不能恢复时断电重启夹爪。
常见原因见 故障排查。