进阶应用
进阶使用示例,全部通过 7000 端口(伺服跟踪数据通道) 下发点位。三个示例解决的是同一类问题——上位机实时给点、控制器跟着动,区别在于点位以什么组织形式交给控制器、以及由谁负责插补平滑。
⚠️ 安全提示: 本节的运动示例会导致机器人实际运动。请在使用前仔细阅读各页面顶部的安全警告,确保工作空间安全、急停可用。
示例列表
| # | 示例 | 说明 |
|---|---|---|
| 1 | 使用 servo_move() 来进行跟踪运动 | 一次给一组带 timeStamp 的轨迹点,控制器按时间戳平滑下发 |
| 2 | 使用 servo_point_position_motion_control() 来进行伺服控制运动 | 逐周期把点位直接下发伺服,12 维(机器人 7 + 外部轴 5) |
| 3 | 使用 servoJ 进行关节控制 | 逐周期下发 7 维目标关节角,控制器按 v/a/j 约束平滑跟随 |
三个示例的区别
| 对比项 | 1. servo_move() | 2. servo_point_position_motion_control() | 3. servoJ |
|---|---|---|---|
| 给点方式 | 一次给一批点(可分批传) | 每帧给若干点,sum / count 累加到齐才动 | 每次给一个 7 维目标关节角 |
| 数据维度 | 7(关节角或笛卡尔坐标,由 coord 决定) | 12(机器人 7 + 外部轴 5) | 7(关节角,固定作用于机器人 1) |
| 是否带时间戳 | 必需,每点给到达时间(ms) | 无 | 无,靠下发周期 |
| 平滑由谁做 | 控制器按 timeStamp 做平滑 | 不做平滑,点位原样下发伺服 | 控制器按 vmax / amax / jmax 约束平滑 |
| 外部轴 | 不支持 | 支持(后 5 维) | 不支持 |
| 进入 / 退出 | 无模式开关,直接调 servo_move | 需先 enable_servo_position_motion_control(fd7000, 1) | 需先 open_servoJ,收尾必须 close_servoJ |
| 额外前置条件 | 示教器需运行含外部点指令的作业文件 | 伺服点位运动控制已开启 | 清错 → 伺服就绪 → 上电,get_servo_state 为 3 |
| 端口 | 7000 | 7000 | 7000(数据)+ 6001(上下电 / 读坐标) |
| 时机参考 | 节奏由 timeStamp 决定(示例每点 5 ms) | 节奏由上位机通讯周期决定(示例每帧最多 600 点) | 官方示例 10 ms / 点 |
一句话概括
- servo_move:你给我一段带时间的轨迹,控制器自己按时间插补平滑。
- servo_point_position_motion_control:你按周期把点原样透传给伺服,带外部轴,不平滑。
- servoJ:你在关节空间逐周期喂点,控制器按速度 / 加速度 / 加加速度约束跟住。
分别用在什么场景
servo_move():固定流程作业中夹杂实时生成的轨迹
适用:
- 现场有一条固定的工艺流程(回原点、取放料、IO 时序等),其中某一段轨迹需要实时生成(传感器、视觉或上位机算法给点):作业文件负责流程骨架,实时轨迹段由上位机经
servo_move()下发 - 已经算出整段轨迹点,每一点都能给出到达时刻(
timeStamp,单位 ms),希望控制器负责插补平滑,上位机不必硬实时逐周期喂点(可以一次传完,也可以分批传) - 关节空间(
coord = 0)或笛卡尔空间(coord = 1)都可以
不适用:需要机器人本体与外部轴联动;要求点位不经控制器插补、原样到伺服;或现场不允许有正在运行的作业文件(该接口必须靠作业里的外部点指令才会运动)。
关键参数(ServoMovePara,取值以头文件 nrc_interface_parameter.h 注释为准):
| 参数 | 取值 | 含义 |
|---|---|---|
targetMode | 0-独立点 / 1-连续轨迹 | 点与点之间是否连成一条轨迹 |
sendMode | 0-一次传输完全部轨迹 / 1-一次传输部分点位 | 整段一次给完,还是分批给 |
runMode | 0-接收完再运动 / 1-边接收边运动 | 收齐再动,还是收到即动 |
clearBuffer | true / false | 是否清除之前发送的、未开始插补计算的点位 |
sum / count | 总传输次数 / 当前是第几次 | 分批传输时的帧计数 |
coord | 0-关节 / 1-直角 | 点位是关节角还是笛卡尔坐标 |
size | 本次传输的点位数 | 与 pos、axisvel、axisacc、timeStamp 长度对应 |
注意:需与作业文件配合——示教器上运行写有外部点指令的作业,上位机下发的点位才会被执行。因此它一般不是"独立跑一段轨迹"的接口,而是嵌在固定流程作业里的实时轨迹段。
servo_point_position_motion_control():逐周期原样下发,需要外部轴
适用:
- 上位机每个通讯周期算出一帧点位,要求原样下发到伺服(不要在控制器侧再做一层插补平滑)
- 机器人本体与外部轴(变位机、导轨等)要一起走,点位必须 12 维一把下发
- 一帧点位较多时效率高(示例按每帧最多 600 点组织);也可以
sum = 1单点逐帧发
注意:
- 先调
enable_servo_position_motion_control(fd7000, 1)开启伺服点位运动控制,再下发点位 sum是总帧数、count从 1 开始累加,只有sum == count时这批点位才开始运动;因此sum = 1才是"发一个走一个"- 出现「发送点位不运动」或「缓存区已满」时,用
end = 1发一帧清掉未插补的点位
servoJ:关节空间逐周期跟随,要求平滑
适用:
- 视觉伺服、力控、传感器引导、遥操作、在线纠偏这类"外部实时给点"的关节空间跟随
- 给点有噪声或周期有抖动时:控制器按
vmax/amax/jmax约束平滑,实际运动比目标点更连续
注意:
- 下发的是目标绝对关节角,增量在本地累加后再下发
- 每周期增量要与约束匹配(
vmax = 10°/s、周期 10 ms 时每周期不超过 0.1°) - 必须在独立线程里按固定周期发点,并且一定要
close_servoJ收尾,否则机器人会停在跟踪模式 - 该系列接口固定作用于机器人 1,没有
_robot变体
选型速查
| 你的情况 | 用哪个 |
|---|---|
| 固定流程作业里要插入一段实时生成的轨迹(点位带时间戳) | servo_move() |
| 逐周期给点,且需要外部轴同步 / 要求点位原样透传 | servo_point_position_motion_control() |
| 逐周期给关节角,要求平滑跟随(视觉、力控、遥操作、纠偏) | servoJ |
| 普通点到点、直线运动,不需要逐周期喂点 | robot_movj / robot_movel 等,见"基础应用" |