Skip to content

3.9 TrajectoryManager 轨迹类

概述

TrajectoryManager 负责离线轨迹、CSV 转换、录制回放、路径执行和实时轨迹。

3.9.1 离线轨迹

cpp
SetOfflineTrajectoryFile(const std::string& path) -> STATUS_CODE
PrepareOfflineTrajectory() -> STATUS_CODE
ExecuteOfflineTrajectory() -> STATUS_CODE
方法说明返回
SetOfflineTrajectoryFile设置离线轨迹文件路径STATUS_CODE
PrepareOfflineTrajectory移动到起始点STATUS_CODE
ExecuteOfflineTrajectory执行离线轨迹STATUS_CODE

3.9.2 CSV 转换

cpp
TransformCsvToTrajectory(const std::string& fileName, const std::string& separator = " ", const std::string& ioFlag = "2") -> std::pair<std::string, STATUS_CODE>
CheckTransformStatus(const std::string& fileName) -> std::pair<TransformStatusEnum, STATUS_CODE>
方法说明返回
TransformCsvToTrajectory转换 CSV 文件std::pair<std::string, STATUS_CODE>
CheckTransformStatus查询转换状态std::pair<TransformStatusEnum, STATUS_CODE>

3.9.3 轨迹录制与回放

cpp
TrajectoryRecordBegin(const std::string& name) -> STATUS_CODE
TrajectoryRecordFinish(const std::string& name) -> STATUS_CODE
TrajectoryReplayStart(const std::string& name) -> STATUS_CODE
TrajectoryReplayStop(const std::string& name) -> STATUS_CODE
TrajectoryRecordDelete(const std::string& name) -> STATUS_CODE
GetTrajectoryRecordList() -> std::pair<std::vector<std::string>, STATUS_CODE>
GetTrajectoryRecordStartPose(const std::string& name) -> std::pair<MotionPose, STATUS_CODE>
方法说明返回
TrajectoryRecordBegin开始录制STATUS_CODE
TrajectoryRecordFinish结束录制STATUS_CODE
TrajectoryReplayStart开始回放STATUS_CODE
TrajectoryReplayStop停止回放STATUS_CODE
TrajectoryRecordDelete删除录制文件STATUS_CODE
GetTrajectoryRecordList查询录制列表std::pair<std::vector<std::string>, STATUS_CODE>
GetTrajectoryRecordStartPose获取首点位姿std::pair<MotionPose, STATUS_CODE>

3.9.4 路径录制与执行

cpp
PathRecordBegin(const std::string& name, const std::string& comment, Float64 param, Float64 angle = 1.0) -> STATUS_CODE
PathRecordFinish() -> STATUS_CODE
GetPathStartPose(const std::string& name) -> std::pair<MotionPose, STATUS_CODE>
GetPathState(const std::vector<std::string>& pathList) -> std::pair<std::map<std::string, int32_t>, STATUS_CODE>
SetPathPlannerParameter(Float64 transitionTime, Float64 scalingFactor) -> STATUS_CODE
GetPathPlannerParameter() -> std::tuple<Float64, Float64, STATUS_CODE>
MovePath(const std::string& name, Float64 vel = 100.0, Float64 acc = 1.0) -> STATUS_CODE
方法说明返回
PathRecordBegin开始录制 .path/.trajSTATUS_CODE
PathRecordFinish结束录制STATUS_CODE
GetPathStartPose获取起始位姿std::pair<MotionPose, STATUS_CODE>
GetPathState批量查询状态std::pair<std::map<std::string, int32_t>, STATUS_CODE>
SetPathPlannerParameter设置路径规划参数STATUS_CODE
GetPathPlannerParameter获取路径规划参数std::tuple<Float64, Float64, STATUS_CODE>
MovePath按路径文件执行STATUS_CODE

3.9.5 实时轨迹

cpp
EnterTrajectoryControl() -> STATUS_CODE
SetFifoSize(int32_t size) -> STATUS_CODE
SendTrajectory(const TrajectorySegment& segment) -> STATUS_CODE
StopTrajectoryControl() -> STATUS_CODE
ExitTrajectoryControl() -> STATUS_CODE
SubscribeJointStream() -> STATUS_CODE
UnsubscribeJointStream() -> STATUS_CODE
方法说明返回
EnterTrajectoryControl进入实时轨迹控制模式STATUS_CODE
SetFifoSize设置实时轨迹 FIFO 大小STATUS_CODE
SendTrajectory发送轨迹段STATUS_CODE
StopTrajectoryControl停止实时轨迹控制STATUS_CODE
ExitTrajectoryControl退出实时轨迹控制模式STATUS_CODE
SubscribeJointStream订阅关节流STATUS_CODE
UnsubscribeJointStream取消订阅关节流STATUS_CODE

最小调用示例

cpp
#include <iostream>  // 引入标准输出流,用于打印轨迹查询结果
#include "arm_api.h"  // 引入 Arm 主入口,连接后通过 arm.trajectoryManager 访问轨迹接口
#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 [recordNames, listRet] = arm.trajectoryManager.GetTrajectoryRecordList();  // 查询当前轨迹录制文件列表
    auto [transitionTime, scalingFactor, plannerRet] =  // 准备接收路径规划参数查询结果
        arm.trajectoryManager.GetPathPlannerParameter();  // 查询路径过渡时间和缩放系数
    if (listRet != STATUS_CODE::OK || plannerRet != STATUS_CODE::OK) {  // 判断列表或参数查询是否失败
        return 1;  // 任一查询失败时返回错误码
    }  // 结束查询结果判断
    std::cout << "record_count=" << recordNames.size() << "\n";  // 打印轨迹录制文件数量
    std::cout << "transition_time=" << transitionTime << "\n";  // 打印路径过渡时间
    std::cout << "scaling_factor=" << scalingFactor << "\n";  // 打印路径缩放系数
    return 0;  // 示例正常结束
}  // 结束示例主函数

场景化示例

下面几组片段按 “CSV 转换、离线轨迹、录制回放、路径运动、实时轨迹” 交叉覆盖本页 API。片段默认承接最小调用示例里已经连接成功的 arm 对象;会驱动机器人或修改轨迹文件状态的调用保持注释,确认现场后再执行。

CSV 转换和转换状态

cpp
const std::string csvName = "demo.csv";  // 准备 CSV 文件名示例
auto [transformName, transformRet] = arm.trajectoryManager.TransformCsvToTrajectory(csvName, ",", "2");  // 把 CSV 转成轨迹文件
if (transformRet == STATUS_CODE::OK) {  // 判断转换任务是否提交成功
    auto [transformStatus, statusRet] = arm.trajectoryManager.CheckTransformStatus(transformName);  // 查询转换任务状态
    std::cout << "transform_status=" << static_cast<int>(transformStatus) << " status_ret=" << static_cast<int>(statusRet) << "\n";  // 打印转换状态和查询结果
}  // 结束转换任务状态查询判断

离线轨迹文件执行

cpp
// STATUS_CODE offlineFileRet = arm.trajectoryManager.SetOfflineTrajectoryFile("/root/robot_data/progs/robot_tmp/demo.traj");  // 设置离线轨迹文件路径会影响后续轨迹执行,确认后再执行
// STATUS_CODE prepareRet = arm.trajectoryManager.PrepareOfflineTrajectory();  // 准备离线轨迹会移动到轨迹起点,确认安全后再执行
// STATUS_CODE executeRet = arm.trajectoryManager.ExecuteOfflineTrajectory();  // 执行离线轨迹会驱动机器人,确认安全后再执行

轨迹录制、回放和删除

cpp
const std::string recordName = "demo_record";  // 准备轨迹录制名示例
auto [recordNames, listRet] = arm.trajectoryManager.GetTrajectoryRecordList();  // 查询轨迹录制列表
auto [recordStartPose, recordPoseRet] = arm.trajectoryManager.GetTrajectoryRecordStartPose(recordName);  // 查询录制轨迹首点
if (listRet == STATUS_CODE::OK || recordPoseRet == STATUS_CODE::OK) {  // 判断录制查询是否成功
    std::cout << "record_count=" << recordNames.size() << "\n";  // 打印录制轨迹数量
}  // 结束录制查询判断
// STATUS_CODE recordBeginRet = arm.trajectoryManager.TrajectoryRecordBegin(recordName);  // 开始轨迹录制会修改录制状态,确认后再执行
// STATUS_CODE recordFinishRet = arm.trajectoryManager.TrajectoryRecordFinish(recordName);  // 结束轨迹录制会写入录制文件,确认后再执行
// STATUS_CODE replayStartRet = arm.trajectoryManager.TrajectoryReplayStart(recordName);  // 开始轨迹回放会驱动机器人,确认安全后再执行
// STATUS_CODE replayStopRet = arm.trajectoryManager.TrajectoryReplayStop(recordName);  // 停止轨迹回放会改变回放状态,确认后再执行
// STATUS_CODE recordDeleteRet = arm.trajectoryManager.TrajectoryRecordDelete(recordName);  // 删除录制轨迹会删除控制器侧文件,确认后再执行

路径录制和路径运动

cpp
const std::string pathName = "demo_path";  // 准备路径名示例
auto [pathStartPose, pathPoseRet] = arm.trajectoryManager.GetPathStartPose(pathName);  // 查询路径起始位姿
auto [pathState, pathStateRet] = arm.trajectoryManager.GetPathState(std::vector<std::string>{pathName});  // 批量查询路径状态
auto [transitionTime, scalingFactor, plannerRet] = arm.trajectoryManager.GetPathPlannerParameter();  // 读取路径规划参数
if (pathPoseRet == STATUS_CODE::OK || pathStateRet == STATUS_CODE::OK || plannerRet == STATUS_CODE::OK) {  // 判断路径查询是否成功
    std::cout << "transition=" << transitionTime << " scaling=" << scalingFactor << "\n";  // 打印路径规划参数
}  // 结束路径查询判断
// STATUS_CODE pathBeginRet = arm.trajectoryManager.PathRecordBegin(pathName, "sdk demo", 100.0, 1.0);  // 开始路径录制会修改路径文件状态,确认后再执行
// STATUS_CODE pathFinishRet = arm.trajectoryManager.PathRecordFinish();  // 结束路径录制会写入路径文件,确认后再执行
// STATUS_CODE setPlannerRet = arm.trajectoryManager.SetPathPlannerParameter(0.2, 1.0);  // 修改路径规划参数会影响后续路径运动,确认后再执行
// STATUS_CODE movePathRet = arm.trajectoryManager.MovePath(pathName, 100.0, 1.0);  // 执行路径运动会驱动机器人,确认安全后再执行

实时轨迹控制

cpp
TrajectorySegment segment;  // 准备实时轨迹发送所需的轨迹段对象
// STATUS_CODE enterRtRet = arm.realTimeTrajectoryControl.EnterTrajectoryControl();  // 进入实时轨迹控制模式会改变机器人控制状态,确认后再执行
// STATUS_CODE fifoRet = arm.realTimeTrajectoryControl.SetFifoSize(64);  // 设置实时轨迹 FIFO 大小会影响后续实时轨迹发送,确认后再执行
// STATUS_CODE sendRet = arm.realTimeTrajectoryControl.SendTrajectory(segment);  // 发送实时轨迹段会进入实时控制链路,确认后再执行
// STATUS_CODE subJointRet = arm.realTimeTrajectoryControl.SubscribeJointStream();  // 订阅实时关节流会打开实时反馈,确认后再执行
// STATUS_CODE unsubJointRet = arm.realTimeTrajectoryControl.UnsubscribeJointStream();  // 取消实时关节流订阅会关闭对应反馈,确认后再执行
// STATUS_CODE stopRtRet = arm.realTimeTrajectoryControl.StopTrajectoryControl();  // 停止实时轨迹控制会改变控制状态,确认后再执行
// STATUS_CODE exitRtRet = arm.realTimeTrajectoryControl.ExitTrajectoryControl();  // 退出实时轨迹控制模式会恢复普通控制状态,确认后再执行

示例代码

cpp17/trajectory_basic/src/main.cpp
cpp
#include "offline_trajectory/run.h"
#include "record_and_replay/run.h"
#include "path_api/run.h"
#include "realtime_trajectory/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 RunTrajectoryBasicOfflineTrajectory();
    // return RunTrajectoryBasicRecordAndReplay();
    // return RunTrajectoryBasicPathApi();
    // return RunTrajectoryBasicRealtimeTrajectory();
}

固件兼容性说明

功能最低固件版本说明
PathRecordBegin / PathRecordFinish1.5.x录制正常,但 1.5.6 及以下版本 readViaPoints 存在 bug,MovePath 回放时读取 0 个点导致 MOTION_TABLE_READ_FAILED
MovePath (.path / .traj)> 1.5.6需要固件修复 readViaPoints 后才能正常回放
TrajectoryRecordBegin / Finish / Replay1.5.xCSV 轨迹录制与回放正常
SetPathPlannerParameter / GetPathPlannerParameter1.5.x正常