从运动空间分类
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 Falsemove_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类)进行,因为搜索空间维度高但约束少
4. move_circle
教程
moveL和moveJ