从运动空间分类
1. 关节空间运动
定义:控制每个关节独立运动,直接指定关节角度或位移。
-
常见类型:
-
点到点运动 :只关注起点和终点的关节角度,不控制中间路径。
-
关节插补运动:多个关节按比例同步运动,使所有关节同时到达目标。
-
-
特点:
-
路径不可预测:末端执行器在空间中的轨迹通常为复杂曲线。
-
效率高:计算量小,运动速度快。
-
无碰撞控制:中间路径可能发生意外碰撞。
-
2. 笛卡尔空间运动
定义 :在直角坐标系中规划末端执行器的运动路径。
-
常见类型:
-
直线运动:末端沿空间直线移动。
-
圆弧运动:末端沿圆弧路径移动。
-
样条曲线运动:沿平滑复杂曲线运动。
-
-
特点:
-
路径精确可控:末端轨迹可预测,适合精细操作。
-
计算复杂:需实时进行逆运动学解算。
-
应用广泛:焊接、涂胶、装配等需要精确轨迹的场景。
-
核心区别对比表
| 特性 | 关节空间运动 | 笛卡尔空间运动 |
|---|---|---|
| 控制对象 | 关节角度/位移 | 末端位姿(位置+姿态) |
| 路径预测性 | 不可预测(末端轨迹任意) | 完全可控(直线/圆弧等) |
| 计算复杂度 | 低(无需实时逆解) | 高(需连续逆运动学解算) |
| 适用场景 | 快速点到点搬运、避障优化 | 轨迹加工、精密装配 |
| 奇异点问题 | 无 | 需处理(逆解不存在或多解) |
从运动的方式分类
1. move_joint
-
空间 :纯粹的关节空间运动
-
行为:
-
直接指定每个关节的目标角度
[θ₁, θ₂, θ₃, θ₄, θ₅, θ₆] -
所有关节以比例同步的方式运动(关节插补),同时开始、同时到达
-
末端轨迹不可控:末端在空间中走出的路径是复杂的曲线,不可预测
-
-
特点:
-
速度快
-
路径可能穿过障碍物
-
编程简单
-
2. move_line
-
空间 :笛卡尔空间运动
-
行为:
-
指定末端的目标位姿
[X, Y, Z, Rx, Ry, Rz] -
末端从当前位置沿一条严格的直线移动到目标位置
-
姿态通常也线性插补(或保持特定姿态)
-
-
特点:
-
路径精确可控
-
速度相对较慢(需实时逆运动学计算)
-
可能遇到奇异点
-
3. move_pose
-
空间 :笛卡尔空间(但注意区别!)
-
行为:
-
指定末端的目标位姿
[X, Y, Z, Rx, Ry, Rz] -
不关心中间路径,只保证最终到达目标位姿
-
通常控制器会规划一条关节空间的路径到达目标
-
-
关键区别:
-
它和
move_joint一样是"点到点"运动 -
但指定的是末端位姿而不是关节角度
-
控制器内部需要先做逆运动学 ,将位姿转换为关节角度,然后执行类似
move_joint的运动
-
-
特点:
-
比
move_line快 -
路径不可预测
-
编程直观(用末端位姿思考)
-
move_pose最终转为move_line:
def move_to_pose(self, pos, rpy_xyz):
if self.rshd >= 0 and self.connected:
# 欧拉角转四元数
ori = robot.rpy_to_quaternion(self.rshd, rpy_xyz)
# 逆运算得关节角
joint_radian = robot.get_current_waypoint(self.rshd)
ik_result = robot.inverse_kin(self.rshd, joint_radian['joint'], pos, ori)
logging.info("ik_result====>{0}".format(ik_result))
# 轴动到目标位置
result = robot.move_joint(self.rshd, ik_result["joint"])
if not result:
...
else:
return True
else:
warn("资源未分配或者未连接机器人!")
return False
move_joint和move_pose都是点到点的运动,只是一个指定关节角,一个指定最终位姿;
move_line指定是关节角还是位姿,还是都可以?
如何选择?
| 情况 | 推荐指令 | 理由 |
|---|---|---|
| 快速定位,不关心路径 | move_joint 或 move_pose |
速度最快 |
| 路径中有障碍物,需避障 | move_joint(配合路径规划) |
关节空间规划避障更简单 |
| 焊接、涂胶、切割 | move_line |
必须沿精确轨迹 |
| 装配、插入操作 | move_line |
需要直线接近 |
| 示教编程 | 通常用 move_pose 或 move_line |
直观(移动末端到位置) |
| 从外部传感器获取目标位姿 | move_pose |
自然的数据格式 |
黄金法则:
-
要控制末端走的路径 → 用
move_line -
只要到达目标,不关心怎么走 → 用
move_joint(最快)或move_pose(更直观) -
避障规划 → 通常在关节空间(
move_joint类)进行,因为搜索空间维度高但约束少