Skip to content

3.4 MotionControl 运动类

概述

MotionControl 是捷勃特机器人运动控制的核心对象,负责封装以下核心功能:

  • 速度 / 加速度参数管理
  • 坐标系管理
  • 点位转换
  • 轨迹运动控制
  • 位置控制模式
  • 拖动示教
  • 负载管理

常见使用流程

Arm 完成连接后,通过 arm.motionControl 获取 Motion 实例,无需单独初始化。

3.4.1 获取机器人参数

3.4.1.1 获取 OVC 全局速度比率

cpp
GetOVC() -> std::pair<Float64, STATUS_CODE>
说明
描述获取当前机器人 OVC 全局速度比率,比率范围为 0~1
请求参数
返回值Float64:速度比率,结果范围为 0~1
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.1.2 获取 OAC 全局加速度比率

cpp
GetOAC() -> std::pair<Float64, STATUS_CODE>
说明
描述获取当前机器人 OAC 全局加速度比率,比率范围为 0~1.2
请求参数
返回值Float64:加速度比率,结果范围为 0~1.2
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.1.3 获取当前使用的 TF 工具坐标系编号

cpp
GetTF() -> std::pair<int32_t, STATUS_CODE>
说明
描述获取当前机器人使用的 TF 工具坐标系编号,序号范围为 0~50
请求参数
返回值int32_t: 工具坐标系编号
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.1.4 获取当前使用的 UF 用户坐标系编号

cpp
GetUF() -> std::pair<int32_t, STATUS_CODE>
说明
描述获取当前机器人使用的 UF 用户坐标系编号,序号范围为 0~50
请求参数
返回值int32_t: 用户坐标系编号
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.1.5 获取当前使用的 TCS 示教坐标系

cpp
GetTCS() -> std::pair<TCSType, STATUS_CODE>
说明
描述获取当前机器人使用的 TCS 示教坐标系
请求参数
返回值TCSType: 示教坐标系类型
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.2 设置机器人参数

3.4.2.1 设置 OVC 全局速度比率

cpp
SetOVC(Float64 value) -> STATUS_CODE
说明
描述设置机器人的 OVC 全局速度比率
请求参数value : Float64 速度比率 (范围 0~1,且大于 0)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.2.2 设置 OAC 全局加速度比率

cpp
SetOAC(Float64 value) -> STATUS_CODE
说明
描述设置机器人的 OAC 全局加速度比率
请求参数value : Float64 加速度比率 (范围 0.01~1.2)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.2.3 设置当前使用的 TF 工具坐标系

cpp
SetTF(int32_t index) -> STATUS_CODE
说明
描述设置机器人当前使用的 TF 工具坐标系
请求参数index : int32_t 工具坐标系编号 (范围 0~50)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.2.4 设置当前使用的 UF 用户坐标系

cpp
SetUF(int32_t index) -> STATUS_CODE
说明
描述设置机器人当前使用的 UF 用户坐标系
请求参数index : int32_t 用户坐标系编号 (范围 0~50)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.2.5 设置当前使用的 TCS 示教坐标系

cpp
SetTCS(TCSType tcsType) -> STATUS_CODE
说明
描述设置机器人当前使用的 TCS 示教坐标系
请求参数tcsType : TCSType TCS 示教坐标系类型
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.3 位姿与转换

3.4.3.1 获取当前位姿

cpp
GetCurrentPose(PoseType poseType) -> std::pair<MotionPose, STATUS_CODE>
说明
描述获取机器人当前位姿,支持笛卡尔空间或关节坐标系下的位姿信息
请求参数poseType : PoseType 位姿类型 (JOINT 或 CART)
返回值MotionPose: 机器人位姿
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.3.2 将笛卡尔点位转换成关节值点位

cpp
ConvertCartToJoint(const MotionPose& pose, int32_t ufIndex = 0, int32_t tfIndex = 0) -> std::pair<MotionPose, STATUS_CODE>
说明
描述将笛卡尔点位转换成关节值点位; hasPosture=true 时会带姿态信息参与求解,否则只按 6 维笛卡尔位置求解
请求参数pose : MotionPose 机器人的笛卡尔位姿 (PoseType::CART;未指定 posture 时 SDK 自动求解可行姿态)
ufIndex : int32_t 用户坐标系 id (默认 0)
tfIndex : int32_t 工具坐标系 id (默认 0)
返回值MotionPose: 机器人点位
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.3.3 将关节值点位转换成笛卡尔点位

cpp
ConvertJointToCart(const MotionPose& pose, int32_t ufIndex = 0, int32_t tfIndex = 0) -> std::pair<MotionPose, STATUS_CODE>
说明
描述将关节值点位转换成笛卡尔点位
请求参数pose : MotionPose 机器人的关节位姿
ufIndex : int32_t 用户坐标系 id (默认 0)
tfIndex : int32_t 工具坐标系 id (默认 0)
返回值MotionPose: 机器人点位
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.3.4 笛卡尔转关节(不使用姿态信息)

cpp
ConvertCartToJointSimple(const MotionPose& pose, int32_t ufIndex = 0, int32_t tfIndex = 0) -> std::pair<MotionPose, STATUS_CODE>
说明
描述将笛卡尔点位转换成关节值点位;该接口始终忽略输入 posture / hasPosture ,只使用 6 维笛卡尔位置
请求参数pose : MotionPose 机器人的笛卡尔位姿
ufIndex : int32_t 用户坐标系 id (默认 0)
tfIndex : int32_t 工具坐标系 id (默认 0)
返回值MotionPose: 机器人点位
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.3.5 获取 DH 参数

cpp
GetDHParam() -> std::pair<std::vector<DHParam>, STATUS_CODE>
说明
描述获取机器人的 DH 参数
请求参数
返回值std::vector<DHParam> : DH 参数列表
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): 不支持

3.4.3.6 设置 DH 参数

cpp
SetDHParam(const std::vector<DHParam>& dhList) -> STATUS_CODE
说明
描述设置机器人的 DH 参数
请求参数dhListstd::vector<DHParam> DH 参数列表
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): 不支持

3.4.4 基础运动

3.4.4.1 关节空间运动

cpp
MoveJoint(const MotionPose& pose, Float64 vel, Float64 acc) -> STATUS_CODE
说明
描述控制机器人末端沿关节空间最快路径移动到指定位置
请求参数pose : MotionPose 笛卡尔空间或关节坐标系点位
vel : Float64 速度比率 (范围 0~1)
acc : Float64 加速度比率 (范围 0~1.2)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.4.2 直线运动

cpp
MoveLine(const MotionPose& pose, Float64 vel, Float64 acc) -> STATUS_CODE
说明
描述控制机器人末端沿直线移动到指定位置,运动轨迹为两点之间的直线
请求参数pose : MotionPose 笛卡尔空间或关节坐标系点位
vel : Float64 末端速度 (范围 1~4000 mm/s)
acc : Float64 加速度比率 (范围 0~1.2)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.4.3 圆弧运动

cpp
MoveCircle(const MotionPose& viaPose, const MotionPose& endPose, Float64 vel, Float64 acc) -> STATUS_CODE
说明
描述控制机器人末端沿圆弧轨迹移动到指定位置,通过途经点和终点确定圆弧
请求参数viaPose : MotionPose 途经点位姿
endPose : MotionPose 终点位姿
vel : Float64 末端速度 (范围 1~4000 mm/s)
acc : Float64 加速度比率 (范围 0~1.2)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.4.4 进入位置控制模式

cpp
EnterPositionControl() -> STATUS_CODE
说明
描述请求控制器进入位置控制模式
请求参数
返回值STATUS_CODE: 函数执行结果
备注固定使用控制器轴组 1
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.4.5 设置位置控制轨迹参数

cpp
SetPositionTrajectoryParams(int32_t maxTimeoutCount, int32_t timeout, int32_t filterLayer, Float64 wristElbowThreshold, Float64 shoulderThreshold) -> STATUS_CODE
说明
描述设置位置控制模式下的轨迹参数
请求参数maxTimeoutCount : int32_t 最大超时次数,范围 [1, 100]
timeout : int32_t 超时时间或发送间隔,范围 [1, 100] ,单位 ms
filterLayer : int32_t 滤波层级,范围 [1, 100]
wristElbowThreshold : Float64 腕 / 肘部接近奇异点阈值,范围 [10, 100]
shoulderThreshold : Float64 肩部接近奇异点阈值,范围 [100, 300]
返回值STATUS_CODE: 函数执行结果
备注参数超出范围时,SDK 在发送请求前返回 INVALID_PARAMETER
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.4.6 退出位置控制模式

cpp
ExitPositionControl() -> STATUS_CODE
说明
描述请求控制器退出位置控制模式
请求参数
返回值STATUS_CODE: 函数执行结果
备注固定使用控制器轴组 1
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.5 拖动示教

3.4.5.1 设定当前机器人是否启动拖动

cpp
EnableDrag(bool dragState) -> STATUS_CODE
说明
描述设定当前机器人是否启动拖动
请求参数dragState :bool 机器人拖动开关 (true 进入拖动状态,false 退出拖动状态)
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): 不支持

3.4.5.2 获取轴锁定状态

cpp
GetDragStatus() -> std::pair<DragStatus, STATUS_CODE>
说明
描述获取当前机器人轴锁定状态,轴锁定仅针对示教运动
请求参数
返回值DragStatus: 轴锁定状态,true 表示该轴为可移动状态,false 表示被锁定
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): 不支持

3.4.5.3 设定机器人轴锁定状态

cpp
SetDragStatus(const DragStatus& dragStatus) -> STATUS_CODE
说明
描述设定当前机器人轴锁定状态,轴锁定只针对示教运动
请求参数dragStatus :DragStatus 各轴锁定状态 (默认全部 true:解锁)
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): 不支持

3.4.6 其他接口

3.4.6.1 获取机器人软限位

cpp
GetUserSoftLimit() -> std::pair<std::vector<SoftLimit>, STATUS_CODE>
说明
描述获取当前机器人软限位信息
请求参数
返回值std::vector<SoftLimit> : 机器人软限位信息,列表第一层代表各轴,第二层代表每个轴的下限位和上限位值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.6.2 设置 UDP 反馈参数

cpp
SetUdpFeedbackParams(bool flag, const std::string& ip, int32_t interval, int32_t feedbackType, const std::vector<int32_t>& doList = {}) -> STATUS_CODE
说明
描述配置机器人向指定 IP 地址推送数据的 UDP 反馈参数
请求参数flag :bool 是否开启 UDP 数据推送;
ip :std::string 接收端 IP 地址;
interval :int32_t 发送间隔 (毫秒);
feedbackType :int32_t 反馈数据格式 (0: XML,1: JSON,2: PROTO);
doListstd::vector<int32_t> DO 信号列表 (最多 10 个,可选)
返回值STATUS_CODE: 函数执行结果
备注参数设置仅在 UDP 数据推送功能启用时有效
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持

3.4.7 Payload 子对象

负载相关能力统一挂在 arm.motionControl.payload 下。

3.4.7.1 获取当前激活的负载编号

cpp
payload.GetCurrentId() -> std::pair<int32_t, STATUS_CODE>
说明
描述获取当前激活的负载编号,返回对应的 ID 编号
请求参数
返回值int32_t: 负载编号
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.7.2 根据 ID 获取负载信息

cpp
payload.GetById(int32_t payloadId) -> std::pair<PayloadInfo, STATUS_CODE>
说明
描述获取指定 ID 的负载信息
请求参数payloadId : int32_t 负载 ID 编号
返回值PayloadInfo: 负载信息
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.7.3 激活指定负载

cpp
payload.SetCurrentId(int32_t payloadId) -> STATUS_CODE
说明
描述根据 ID 激活指定负载
请求参数payloadId : int32_t 负载 ID 编号
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.7.4 添加自定义负载

cpp
payload.Add(const PayloadInfo& payloadInfo) -> STATUS_CODE
说明
描述向机器人控制柜添加用户自定义负载信息
请求参数payloadInfo : PayloadInfo 用户自定义负载信息
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.7.5 删除负载

cpp
payload.Delete(int32_t payloadId) -> STATUS_CODE
说明
描述从控制器删除指定 ID 的用户自定义负载
请求参数payloadId : int32_t 负载 ID 编号
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+
备注无法删除当前激活的负载,如需删除激活负载,请先激活其他负载再删除当前负载

3.4.7.6 更新负载

cpp
payload.Update(const PayloadInfo& payloadInfo) -> STATUS_CODE
说明
描述更新机器人中已存在的用户自定义负载信息
请求参数payloadInfo : PayloadInfo 包含更新信息的负载对象
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.7.7 获取所有负载

cpp
payload.GetAll() -> std::pair<std::vector<PayloadSummary>, STATUS_CODE>
说明
描述获取所有负载信息列表
请求参数
返回值std::vector<PayloadSummary> : 所有负载摘要列表(只包含 id 与 comment)
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.4.7.8 检测 3 轴水平度

cpp
payload.CheckAxisThreeHorizontal() -> std::pair<Float64, STATUS_CODE>
说明
描述检测机器人 3 轴是否水平
请求参数
返回值Float64: 返回 3 轴的水平角度,单位为度
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持
备注水平角度必须在 - 1~1 度之间才能进行负载测定

3.4.7.9 获取负载测定状态

cpp
payload.GetIdentifyState() -> std::pair<PayloadIdentifyState, STATUS_CODE>
说明
描述获取负载测定的状态
请求参数
返回值PayloadIdentifyState: 负载测定状态
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持

3.4.7.10 开始负载测定

cpp
payload.StartIdentify(Float64 weight, Float64 angle) -> STATUS_CODE
说明
描述开始负载测定过程
请求参数weight :Float64 负载重量 (未知填 -1);
angle :Float64 6 轴允许转动角度 (30~90 度)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持
备注开始负载测定前必须先进入负载测定状态

3.4.7.11 获取负载测定结果

cpp
payload.GetIdentifyResult() -> std::pair<PayloadInfo, STATUS_CODE>
说明
描述获取负载测定结果
请求参数
返回值PayloadInfo: 负载测定结果
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持

3.4.7.12 开始干涉检查

cpp
payload.InterferenceCheckForPayloadIdentify(Float64 weight, Float64 angle) -> STATUS_CODE
说明
描述开始负载测定的干涉检查
请求参数weight : Float64 负载重量;
angle : Float64 6 轴转动角度 (30~90 度)
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持

3.4.7.13 进入负载测定状态

cpp
payload.IdentifyStart() -> STATUS_CODE
说明
描述进入负载测定准备状态
请求参数
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持

3.4.7.14 结束负载测定状态

cpp
payload.IdentifyDone() -> STATUS_CODE
说明
描述结束负载测定准备状态
请求参数
返回值STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持

3.4.7.15 负载测定全流程

cpp
payload.Identify(Float64 weight, Float64 angle) -> std::pair<PayloadInfo, STATUS_CODE>
说明
描述完整的负载测定流程,包含负载测定全部步骤,无特殊需求时仅使用此接口即可
请求参数weight : Float64 负载重量 (未知填 -1);
angle : Float64 6 轴转动角度 (30~90 度)
返回值PayloadInfo: 负载测定结果
STATUS_CODE: 函数执行结果
兼容版本协作 (Copper): v7.5.2.0+
工业 (Bronze): 不支持
备注返回的负载可新增到机器人中或写入机器人中已有的某个负载
全流程步骤:
1. 移动到指定水平位并检测是否水平
2. 进入负载测定状态
3. 开始负载测定
4. 获取负载测定结果
5. 结束负载测定状态

最小调用示例

cpp
#include <iostream>  // 引入标准输出流,用于打印运动查询结果
#include "arm_api.h"  // 引入 Arm 主入口,连接后通过 arm.motionControl 访问运动接口
#include "status_code.h"  // 引入 STATUS_CODE,用于检查 SDK 调用结果
int main()  // 示例程序入口
{  // 进入示例主函数
    Arm arm;  // 创建机器人会话对象
    STATUS_CODE connectRet = arm.Connect("192.168.110.2", "");  // 连接控制器,示教器地址留空表示使用默认规则
    if (connectRet != STATUS_CODE::OK) {  // 判断连接是否失败
        return 1;  // 连接失败时直接退出
    }  // 结束连接结果判断
    auto [ovc, ovcRet] = arm.motionControl.GetOVC();  // 读取当前全局速度比率 OVC
    auto [jointPose, poseRet] = arm.motionControl.GetCurrentPose(PoseType::JOINT);  // 读取当前关节位姿
    if (ovcRet != STATUS_CODE::OK || poseRet != STATUS_CODE::OK) {  // 判断 OVC 或位姿读取是否失败
        return 1;  // 任一读取失败时返回错误码
    }  // 结束读取结果判断
    auto [cartPose, convertRet] = arm.motionControl.ConvertJointToCart(jointPose);  // 将关节位姿转换为笛卡尔位姿
    if (convertRet != STATUS_CODE::OK) {  // 判断位姿转换是否失败
        return 1;  // 转换失败时返回错误码
    }  // 结束位姿转换判断
    std::cout << "ovc=" << ovc << "\n";  // 打印当前全局速度比率
    std::cout << "joint_count=" << jointPose.joint.size() << "\n";  // 打印关节数组长度
    std::cout << "cartesian_count=" << cartPose.cartesian.size() << "\n";  // 打印笛卡尔数组长度
    return 0;  // 示例正常结束
}  // 结束示例主函数

场景化示例

下面几组片段按 “参数读写、位姿转换、基础运动、拖动 / UDP、负载管理、负载测定” 交叉覆盖本页 API。片段默认承接最小调用示例里已经连接成功的 arm 对象;会驱动机器人或改变配置的调用保持注释,确认现场后再执行。

读取和设置运动参数

cpp
auto [ovc, ovcRet] = arm.motionControl.GetOVC();  // 读取当前全局速度比率
auto [oac, oacRet] = arm.motionControl.GetOAC();  // 读取当前全局加速度比率
auto [tf, tfRet] = arm.motionControl.GetTF();  // 读取当前工具坐标系编号
auto [uf, ufRet] = arm.motionControl.GetUF();  // 读取当前用户坐标系编号
auto [tcs, tcsRet] = arm.motionControl.GetTCS();  // 读取当前示教坐标系
if (ovcRet == STATUS_CODE::OK && oacRet == STATUS_CODE::OK && tfRet == STATUS_CODE::OK && ufRet == STATUS_CODE::OK && tcsRet == STATUS_CODE::OK) {  // 判断基础参数读取是否全部成功
    std::cout << "ovc=" << ovc << " oac=" << oac << " tf=" << tf << " uf=" << uf << " tcs=" << static_cast<int>(tcs) << "\n";  // 打印基础参数查询结果
}  // 结束基础参数读取判断
// STATUS_CODE setOvcRet = arm.motionControl.SetOVC(0.5);  // 设置全局速度比率会改变控制器参数,确认后再执行
// STATUS_CODE setOacRet = arm.motionControl.SetOAC(0.5);  // 设置全局加速度比率会改变控制器参数,确认后再执行
// STATUS_CODE setTfRet = arm.motionControl.SetTF(tf);  // 切换当前工具坐标系会影响后续运动,确认后再执行
// STATUS_CODE setUfRet = arm.motionControl.SetUF(uf);  // 切换当前用户坐标系会影响后续运动,确认后再执行
// STATUS_CODE setTcsRet = arm.motionControl.SetTCS(tcs);  // 切换示教坐标系会影响示教行为,确认后再执行

读取位姿和做坐标转换

cpp
auto [jointPose, jointRet] = arm.motionControl.GetCurrentPose(PoseType::JOINT);  // 读取当前关节位姿
if (jointRet != STATUS_CODE::OK) {  // 判断关节位姿读取是否失败
    return;  // 读取失败时退出当前流程
}  // 结束关节位姿读取判断
auto [cartPose, cartRet] = arm.motionControl.ConvertJointToCart(jointPose);  // 将关节位姿转换为笛卡尔位姿
auto [jointFromCart, cartToJointRet] = arm.motionControl.ConvertCartToJoint(cartPose);  // 将笛卡尔位姿转换为关节位姿
auto [jointSimple, simpleRet] = arm.motionControl.ConvertCartToJointSimple(cartPose);  // 不使用姿态信息求关节解
if (cartRet == STATUS_CODE::OK && cartToJointRet == STATUS_CODE::OK && simpleRet == STATUS_CODE::OK) {  // 判断位姿转换是否全部成功
    std::cout << "joint_count=" << jointPose.joint.size() << " cart_count=" << cartPose.cartesian.size() << "\n";  // 打印位姿数组长度
}  // 结束位姿转换结果判断

执行基础运动

cpp
auto [jointPose, jointRet] = arm.motionControl.GetCurrentPose(PoseType::JOINT);  // 读取当前关节位姿作为运动目标示例
auto [cartPose, cartRet] = arm.motionControl.ConvertJointToCart(jointPose);  // 将当前关节位姿转换为笛卡尔目标示例
if (jointRet != STATUS_CODE::OK || cartRet != STATUS_CODE::OK) {  // 判断运动目标准备是否失败
    return;  // 目标准备失败时退出当前流程
}  // 结束运动目标准备判断
// STATUS_CODE moveJointRet = arm.motionControl.MoveJoint(jointPose, 0.1, 0.1);  // 关节运动会驱动机器人,确认安全后再执行
// STATUS_CODE moveLineRet = arm.motionControl.MoveLine(cartPose, 50.0, 0.1);  // 直线运动会驱动机器人,确认安全后再执行
// STATUS_CODE moveCircleRet = arm.motionControl.MoveCircle(cartPose, cartPose, 50.0, 0.1);  // 圆弧运动会驱动机器人,确认安全后再执行

DH、拖动和 UDP 推送

cpp
auto [dhList, dhRet] = arm.motionControl.GetDHParam();  // 读取 DH 参数列表
auto [dragStatus, dragRet] = arm.motionControl.GetDragStatus();  // 读取拖动示教轴锁定状态
auto [softLimits, limitRet] = arm.motionControl.GetUserSoftLimit();  // 读取用户软限位
if (dhRet == STATUS_CODE::OK || dragRet == STATUS_CODE::OK || limitRet == STATUS_CODE::OK) {  // 判断至少一个扩展查询是否成功
    std::cout << "dh_count=" << dhList.size() << " soft_limit_count=" << softLimits.size() << "\n";  // 打印 DH 和软限位数量
}  // 结束扩展查询结果判断
// STATUS_CODE setDhRet = arm.motionControl.SetDHParam(dhList);  // 写入 DH 参数会改变机器人模型参数,确认后再执行
// STATUS_CODE enableDragRet = arm.motionControl.EnableDrag(true);  // 进入拖动状态会改变机器人控制状态,确认后再执行
// STATUS_CODE setDragRet = arm.motionControl.SetDragStatus(dragStatus);  // 修改轴锁定状态会影响拖动示教,确认后再执行
// STATUS_CODE udpRet = arm.motionControl.SetUdpFeedbackParams(true, "192.168.110.10", 100, 1, std::vector<int32_t>{0, 1});  // 配置 UDP 推送会改变反馈设置,确认后再执行

查询和维护负载

cpp
auto [payloadId, payloadIdRet] = arm.motionControl.payload.GetCurrentId();  // 读取当前负载编号
auto [payloads, payloadsRet] = arm.motionControl.payload.GetAll();  // 读取全部负载摘要
if (payloadIdRet != STATUS_CODE::OK) {  // 判断当前负载编号读取是否失败
    return;  // 读取失败时退出当前流程
}  // 结束负载编号读取判断
auto [payloadInfo, payloadRet] = arm.motionControl.payload.GetById(payloadId);  // 按负载编号读取负载详情
if (payloadRet == STATUS_CODE::OK || payloadsRet == STATUS_CODE::OK) {  // 判断至少一个负载查询是否成功
    std::cout << "payload_id=" << payloadId << " payload_count=" << payloads.size() << "\n";  // 打印负载查询摘要
}  // 结束负载查询结果判断
// STATUS_CODE setPayloadRet = arm.motionControl.payload.SetCurrentId(payloadId);  // 切换当前负载会影响动力学参数,确认后再执行
// STATUS_CODE addPayloadRet = arm.motionControl.payload.Add(payloadInfo);  // 新增负载会修改控制器配置,确认后再执行
// STATUS_CODE updatePayloadRet = arm.motionControl.payload.Update(payloadInfo);  // 更新负载会修改控制器配置,确认后再执行
// STATUS_CODE deletePayloadRet = arm.motionControl.payload.Delete(payloadId);  // 删除负载会修改控制器配置,确认后再执行

负载测定流程

cpp
auto [axisAngle, axisRet] = arm.motionControl.payload.CheckAxisThreeHorizontal();  // 检测 3 轴水平角度
auto [identifyState, stateRet] = arm.motionControl.payload.GetIdentifyState();  // 读取负载测定状态
auto [identifyResult, resultRet] = arm.motionControl.payload.GetIdentifyResult();  // 读取负载测定结果
if (axisRet == STATUS_CODE::OK || stateRet == STATUS_CODE::OK || resultRet == STATUS_CODE::OK) {  // 判断至少一个负载测定查询是否成功
    std::cout << "axis_angle=" << axisAngle << " identify_state=" << static_cast<int>(identifyState) << "\n";  // 打印负载测定查询摘要
}  // 结束负载测定查询判断
// STATUS_CODE interferenceRet = arm.motionControl.payload.InterferenceCheckForPayloadIdentify(-1.0, 45.0);  // 干涉检查会访问负载测定流程,确认后再执行
// STATUS_CODE identifyStartRet = arm.motionControl.payload.IdentifyStart();  // 进入负载测定状态会改变机器人状态,确认后再执行
// STATUS_CODE startIdentifyRet = arm.motionControl.payload.StartIdentify(-1.0, 45.0);  // 开始负载测定会驱动测定流程,确认后再执行
// STATUS_CODE identifyDoneRet = arm.motionControl.payload.IdentifyDone();  // 结束负载测定状态会改变机器人状态,确认后再执行
// auto [identifiedPayload, identifyRet] = arm.motionControl.payload.Identify(-1.0, 45.0);  // 完整负载测定会执行整套流程,确认后再执行

示例代码

cpp17/motion_basic/src/main.cpp
cpp
#include "query_motion_state/run.h"
#include "query_current_pose/run.h"
#include "convert_pose/run.h"
#include "query_limits/run.h"
#include "write_motion_config/run.h"
#include "run_motion_apis/run.h"

int main(void)
{
    // [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
    // [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
    return RunMotionBasicQueryMotionState();
    // return RunMotionBasicQueryCurrentPose();
    // return RunMotionBasicConvertPose();
    // return RunMotionBasicQueryLimits();
    // return RunMotionBasicWriteMotionConfig();
    // return RunMotionBasicRunMotionApis();
}
cpp17/motion_pose/src/main.cpp
cpp
#include "query_current_pose/run.h"
#include "convert_joint_to_cart/run.h"
#include "convert_cart_to_joint/run.h"

int main(void)
{
    // [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
    // [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
    return RunMotionPoseQueryCurrentPose();
    // return RunMotionPoseConvertJointToCart();
    // return RunMotionPoseConvertCartToJoint();
}
cpp17/motion_drag/src/main.cpp
cpp
#include "query_drag_status/run.h"
#include "enable_drag/run.h"
#include "set_drag_status/run.h"

int main(void)
{
    // [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
    // [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
    return RunMotionDragQueryDragStatus();
    // return RunMotionDragEnableDrag();
    // return RunMotionDragSetDragStatus();
}
cpp17/motion_payload/src/main.cpp
cpp
#include "query_payload_info/run.h"
#include "manage_payloads/run.h"
#include "identify_payload/run.h"

int main(void)
{
    // [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
    // [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
    return RunMotionPayloadQueryPayloadInfo();
    // return RunMotionPayloadManagePayloads();
    // return RunMotionPayloadIdentifyPayload();
}