Skip to content

4.9 C99 Trajectory 轨迹接口

概述

C99 Trajectory 覆盖离线轨迹、CSV 转换、轨迹录制回放、路径录制执行和实时轨迹控制。实时轨迹接口沿用 Arm_RealTimeTrajectory_* 前缀。

对应头文件:

  • include/c_arm_trajectory.h

使用前提与执行顺序

类别说明
会话要求所有接口都需要传入有效的 ArmHandle* ,业务调用前应先完成 Arm_Connect()
离线轨迹调用顺序为 SetOfflineTrajectoryFilePrepareOfflineTrajectoryExecuteOfflineTrajectory 。准备阶段会移动机器人到轨迹起点。
CSV 转换TransformCsvToTrajectory 提交转换任务, CheckTransformStatus 查询转换状态。转换响应文本写入调用方提供的 char* 缓冲区。
轨迹录制RecordBegin 进入录制状态, RecordFinish 结束并写入记录;回放使用 ReplayStartReplayStop
路径录制PathRecordBegin 开始录制 .path/.trajPathRecordFinish 结束录制。
实时轨迹调用顺序为进入控制模式、设置 FIFO、发送轨迹分片、停止控制、退出控制模式。
动作型接口PrepareOfflineTrajectoryExecuteOfflineTrajectoryReplayStartMovePath 、实时轨迹发送都会驱动机器人运动。

接口签名

Arm_Trajectory_SetOfflineTrajectoryFile

c
int Arm_Trajectory_SetOfflineTrajectoryFile(ArmHandle* h, const char* path);
说明
描述设置离线轨迹文件路径。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
path : const char* ,控制器侧或接口要求的文件路径
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_PrepareOfflineTrajectory

c
int Arm_Trajectory_PrepareOfflineTrajectory(ArmHandle* h);
说明
描述准备离线轨迹并移动到起点。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_ExecuteOfflineTrajectory

c
int Arm_Trajectory_ExecuteOfflineTrajectory(ArmHandle* h);
说明
描述执行离线轨迹。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_TransformCsvToTrajectory

c
int Arm_Trajectory_TransformCsvToTrajectory(ArmHandle* h, const char* fileName, const char* separator, const char* ioFlag, char* outResponse, size_t bufSize);
说明
描述将 CSV 轨迹文件转换为控制器可执行轨迹文件。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
fileName : const char* ,控制器侧 CSV 文件名或路径
separator : const char* ,CSV 分隔符,常用值为 ","" "
ioFlag : const char* ,IO 转换标志,默认口径为 "2"
outResponse : char* ,响应文本输出缓冲区,由调用方分配
bufSize : size_t ,输出缓冲区大小,包含结尾 \0 的空间
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理
备注字符串输出使用调用方提供的缓冲区,缓冲区不足时按状态码返回。

Arm_Trajectory_CheckTransformStatus

c
int Arm_Trajectory_CheckTransformStatus(ArmHandle* h, const char* fileName, ArmTransformStatus* outStatus);
说明
描述查询 CSV 转轨迹状态。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
fileName : const char* ,控制器侧文件名或路径
outStatus : ArmTransformStatus* ,状态输出指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_RecordBegin

c
int Arm_Trajectory_RecordBegin(ArmHandle* h, const char* name);
说明
描述开始轨迹复现录制。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,轨迹记录名称,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_RecordFinish

c
int Arm_Trajectory_RecordFinish(ArmHandle* h, const char* name);
说明
描述结束轨迹复现录制。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,轨迹记录名称,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_ReplayStart

c
int Arm_Trajectory_ReplayStart(ArmHandle* h, const char* name);
说明
描述开始轨迹回放。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,轨迹记录名称,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_ReplayStop

c
int Arm_Trajectory_ReplayStop(ArmHandle* h, const char* name);
说明
描述停止轨迹回放。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,轨迹记录名称,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_RecordDelete

c
int Arm_Trajectory_RecordDelete(ArmHandle* h, const char* name);
说明
描述删除轨迹记录。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,轨迹记录名称,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_GetRecordList

c
int Arm_Trajectory_GetRecordList(ArmHandle* h, char outNames[][128], size_t maxCount, size_t* outCount);
说明
描述查询轨迹记录列表。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
outNames : char ,轨迹记录名称输出数组,每个名称固定 128 字节
maxCount : size_t ,输出数组容量,表示调用方最多可接收多少个元素
outCount : size_t* ,输出数量指针,成功时写入实际数量
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理
备注数组输出由调用方分配, maxCount 表示容量, outCount 返回实际数量。

Arm_Trajectory_GetRecordStartPose

c
int Arm_Trajectory_GetRecordStartPose(ArmHandle* h, const char* name, ArmMotionPose* outPose);
说明
描述读取轨迹记录起点位姿。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,轨迹记录名称,不能为 NULL
outPose : ArmMotionPose* ,位姿输出结构体指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_PathRecordBegin

c
int Arm_Trajectory_PathRecordBegin(ArmHandle* h, const char* name, const char* comment, double param, double angle);
说明
描述开始录制 .path/.traj 文件。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,路径名称,不能为 NULL
comment : const char* ,路径记录备注
param : double ,路径录制参数
angle : double ,路径录制角度参数,默认口径为 1.0
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_PathRecordFinish

c
int Arm_Trajectory_PathRecordFinish(ArmHandle* h);
说明
描述结束路径记录。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_GetPathStartPose

c
int Arm_Trajectory_GetPathStartPose(ArmHandle* h, const char* name, ArmMotionPose* outPose);
说明
描述读取路径起点位姿。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,路径名称,不能为 NULL
outPose : ArmMotionPose* ,位姿输出结构体指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_GetPathState

c
int Arm_Trajectory_GetPathState(ArmHandle* h, const char* const* pathList, size_t pathCount, int* outStates, size_t maxCount);
说明
描述查询路径状态。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
pathList : const char* const* ,路径名称数组
pathCount : size_t ,路径名称数量
outStates : int* ,路径状态输出数组
maxCount : size_t ,输出数组容量,表示调用方最多可接收多少个元素
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理
备注maxCount 必须大于等于 pathCount ;容量不足时返回缓冲区不足状态码,输出数组保持未写入状态。

Arm_Trajectory_SetPathPlannerParameter

c
int Arm_Trajectory_SetPathPlannerParameter(ArmHandle* h, double transitionTime, double scalingFactor);
说明
描述设置路径规划参数。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
transitionTime : double ,路径规划过渡时间
scalingFactor : double ,路径规划缩放系数
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_GetPathPlannerParameter

c
int Arm_Trajectory_GetPathPlannerParameter(ArmHandle* h, double* outTransitionTime, double* outScalingFactor);
说明
描述读取路径规划参数。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
outTransitionTime : double* ,路径规划过渡时间输出指针
outScalingFactor : double* ,路径规划缩放系数输出指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_Trajectory_MovePath

c
int Arm_Trajectory_MovePath(ArmHandle* h, const char* name, double vel, double acc);
说明
描述执行路径运动。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
name : const char* ,路径名称,不能为 NULL
vel : double ,路径运动速度,默认口径为 100.0
acc : double ,路径运动加速度,默认口径为 1.0
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

实时轨迹接口

Arm_RealTimeTrajectory_EnterTrajectoryControl

c
int Arm_RealTimeTrajectory_EnterTrajectoryControl(ArmHandle* h);
说明
描述进入实时轨迹控制模式。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理
备注进入后应按实时轨迹控制顺序发送分片,并在结束时退出控制模式。

Arm_RealTimeTrajectory_SetFifoSize

c
int Arm_RealTimeTrajectory_SetFifoSize(ArmHandle* h, int size);
说明
描述设置实时轨迹 FIFO 大小。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
size : int ,FIFO 大小
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_RealTimeTrajectory_SendTrajectory

c
int Arm_RealTimeTrajectory_SendTrajectory(ArmHandle* h, const ArmTrajectorySegmentC* seg);
说明
描述发送实时轨迹分片。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
seg : const ArmTrajectorySegmentC* ,实时轨迹分片结构体指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_RealTimeTrajectory_StopTrajectoryControl

c
int Arm_RealTimeTrajectory_StopTrajectoryControl(ArmHandle* h);
说明
描述停止实时轨迹控制。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_RealTimeTrajectory_ExitTrajectoryControl

c
int Arm_RealTimeTrajectory_ExitTrajectoryControl(ArmHandle* h);
说明
描述退出实时轨迹控制模式。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_RealTimeTrajectory_SubscribeJointStream

c
int Arm_RealTimeTrajectory_SubscribeJointStream(ArmHandle* h);
说明
描述订阅关节流。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_RealTimeTrajectory_UnsubscribeJointStream

c
int Arm_RealTimeTrajectory_UnsubscribeJointStream(ArmHandle* h);
说明
描述取消订阅关节流。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

规则

类别说明
离线轨迹SetOfflineTrajectoryFile 设置控制器侧轨迹文件, PrepareOfflineTrajectory 移动到起点, ExecuteOfflineTrajectory 执行轨迹。
CSV 转换TransformCsvToTrajectory 使用 char* + bufSize 输出响应文本; separator 常用 ","" "ioFlag 默认口径为 "2"
转换状态CheckTransformStatus 输出 ArmTransformStatus ,包括 IDLERUNNINGSUCCESSFAILEDNOT_FOUNDUNKNOWN
记录列表GetRecordList 使用固定宽度数组 char outNames[][128] ;每个名称固定 128 字节。
路径状态GetPathState 要求 maxCount >= pathCount ,容量不足时不写入部分结果。
路径规划SetPathPlannerParameter 会影响后续 MovePath 执行; GetPathPlannerParameter 读取当前路径过渡时间和缩放系数。
实时轨迹进入控制、设置 FIFO、发送分片、停止和退出需要按顺序调用;订阅关节流会打开实时反馈。
轨迹分片ArmTrajectorySegmentC 通过 point_listtotal_points 描述本次发送点位; seq 表示分片序号, last_fragment 表示是否最后一片。

固件兼容性

功能最低固件版本说明
Arm_Trajectory_PathRecordBegin / Arm_Trajectory_PathRecordFinish1.5.x支持路径录制。
Arm_Trajectory_MovePath高于 1.5.61.5.6 及以下版本存在路径回放读取点位异常,可能导致路径回放失败。
Arm_Trajectory_RecordBegin / Arm_Trajectory_RecordFinish / Arm_Trajectory_ReplayStart1.5.x支持轨迹录制与回放。
Arm_Trajectory_SetPathPlannerParameter / Arm_Trajectory_GetPathPlannerParameter1.5.x支持路径规划参数读写。

最小调用示例

c
#include <stdio.h>  // 引入 printf,用于打印路径规划参数
#include "c_arm_api.h"  // 引入 C99 SDK 总头文件
int main(void)  // 示例程序入口
{  // 进入示例主函数
    ArmHandle* h = Arm_Create();  // 创建 C99 会话句柄
    double transitionTime = 0.0;  // 准备过渡时间输出变量
    double scalingFactor = 0.0;  // 准备缩放系数输出变量
    if (h == NULL) {  // 判断句柄是否创建失败
        return 1;  // 创建失败时退出
    }  // 结束句柄判断
    if (Arm_Connect(h, "10.27.1.2", "10.27.1.102") != 0) {  // 连接控制器
        Arm_Destroy(h);  // 连接失败时释放句柄
        return 1;  // 返回错误
    }  // 结束连接判断
    int ret = Arm_Trajectory_GetPathPlannerParameter(h, &transitionTime, &scalingFactor);  // 查询路径规划参数
    printf("transition=%f scaling=%f\n", transitionTime, scalingFactor);  // 打印规划参数
    Arm_Disconnect(h);  // 断开连接
    Arm_Destroy(h);  // 销毁句柄
    return ret == 0 ? 0 : 1;  // 根据查询结果返回
}  // 结束示例主函数

场景化示例

c
char names[8][128] = {{0}};  // 准备轨迹记录名称数组
size_t nameCount = 0U;  // 准备记录数量输出
ArmMotionPose startPose = {0};  // 准备起点位姿输出
ArmTransformStatus status = ARM_TRANSFORM_UNKNOWN;  // 准备转换状态输出
double transitionTime = 0.0;  // 准备路径规划过渡时间
double scalingFactor = 0.0;  // 准备路径规划缩放系数
int listRet = Arm_Trajectory_GetRecordList(h, names, 8, &nameCount);  // 查询轨迹记录列表
int poseRet = Arm_Trajectory_GetRecordStartPose(h, "demo", &startPose);  // 查询轨迹记录起点
int statusRet = Arm_Trajectory_CheckTransformStatus(h, "demo.csv", &status);  // 查询 CSV 转换状态
int plannerRet = Arm_Trajectory_GetPathPlannerParameter(h, &transitionTime, &scalingFactor);  // 查询路径规划参数
/* int setFileRet = Arm_Trajectory_SetOfflineTrajectoryFile(h, "/root/robot_data/traj/demo.traj"); */  // 设置离线轨迹文件,确认后再执行
/* int prepareRet = Arm_Trajectory_PrepareOfflineTrajectory(h); */  // 移动到起点会移动机器人,确认后再执行
/* int execRet = Arm_Trajectory_ExecuteOfflineTrajectory(h); */  // 执行轨迹会移动机器人,确认后再执行
/* int transformRet = Arm_Trajectory_TransformCsvToTrajectory(h, "demo.csv", ",", "false", NULL, 0); */  // 转换轨迹文件,确认后再执行
/* int beginRet = Arm_Trajectory_RecordBegin(h, "demo"); */  // 开始轨迹录制,确认后再执行
/* int finishRet = Arm_Trajectory_RecordFinish(h, "demo"); */  // 结束轨迹录制,确认后再执行
/* int replayRet = Arm_Trajectory_ReplayStart(h, "demo"); */  // 开始回放会移动机器人,确认后再执行
/* int replayStopRet = Arm_Trajectory_ReplayStop(h, "demo"); */  // 停止回放,确认后再执行
/* int deleteRet = Arm_Trajectory_RecordDelete(h, "demo"); */  // 删除轨迹记录,确认后再执行
(void)listRet;  // 示例中保留状态码
(void)poseRet;  // 示例中保留状态码
(void)statusRet;  // 示例中保留状态码
(void)plannerRet;  // 示例中保留状态码

实时轨迹

c
ArmTrajectorySegmentC seg = {0};  // 准备实时轨迹分片
/* int enterRet = Arm_RealTimeTrajectory_EnterTrajectoryControl(h); */  // 进入实时轨迹控制,确认后再执行
/* int fifoRet = Arm_RealTimeTrajectory_SetFifoSize(h, 64); */  // 设置 FIFO 大小,确认后再执行
/* int sendRet = Arm_RealTimeTrajectory_SendTrajectory(h, &seg); */  // 发送分片会驱动运动,确认后再执行
/* int stopRet = Arm_RealTimeTrajectory_StopTrajectoryControl(h); */  // 停止实时轨迹控制,确认后再执行
/* int exitRet = Arm_RealTimeTrajectory_ExitTrajectoryControl(h); */  // 退出实时轨迹控制,确认后再执行
/* int subRet = Arm_RealTimeTrajectory_SubscribeJointStream(h); */  // 订阅关节流,确认后再执行
/* int unsubRet = Arm_RealTimeTrajectory_UnsubscribeJointStream(h); */  // 取消订阅关节流,确认后再执行
(void)seg;  // 示例中保留分片变量

示例代码

c99/trajectory_basic/src/main.cpp
cpp
#include <stdio.h>
#include <string.h>

extern "C" {
#include "c_arm_api.h"
}

int main(void)
{
    // [ZH] 本示例直接在源码中写死连接地址,不解析命令行参数。
    // [EN] This example hard-codes the connection addresses in the source code and does not parse command-line arguments.
    // [ZH] 创建并连接 SDK 句柄。
    // [EN] Create the SDK handle and connect to the robot.
    ArmHandle* handle = Arm_Create();
    if (handle == NULL) {
        printf("[c99_trajectory] 创建句柄失败 / Failed to create the handle\n");
        return 1;
    }
    int ret = Arm_Connect(handle, "10.27.1.2", "10.27.1.102");
    if (ret != 0) {
        printf("[c99_trajectory] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
        Arm_Destroy(handle);
        return 1;
    }
    printf("[c99_trajectory] 机器人连接成功 / Robot connected successfully\n");

    // [ZH] 顺序执行离线轨迹接口。
    // [EN] Execute the offline trajectory APIs in sequence.
    char transformResponse[512] = {0};
    ArmTransformStatus transformStatus = ARM_TRANSFORM_UNKNOWN;
    ret = Arm_Trajectory_SetOfflineTrajectoryFile(handle, "demo.traj");
    printf("[c99_trajectory] SetOfflineTrajectoryFile 状态码 / SetOfflineTrajectoryFile status code: %d\n", ret);
    ret = Arm_Trajectory_PrepareOfflineTrajectory(handle);
    printf("[c99_trajectory] PrepareOfflineTrajectory 状态码 / PrepareOfflineTrajectory status code: %d\n", ret);
    ret = Arm_Trajectory_ExecuteOfflineTrajectory(handle);
    printf("[c99_trajectory] ExecuteOfflineTrajectory 状态码 / ExecuteOfflineTrajectory status code: %d\n", ret);
    ret = Arm_Trajectory_TransformCsvToTrajectory(handle, "demo.csv", " ", "2", transformResponse, sizeof(transformResponse));
    printf("[c99_trajectory] TransformCsvToTrajectory 状态码 / TransformCsvToTrajectory status code: %d, 返回值 / Response: %s\n", ret, transformResponse);
    ret = Arm_Trajectory_CheckTransformStatus(handle, "demo.csv", &transformStatus);
    printf("[c99_trajectory] CheckTransformStatus 状态码 / CheckTransformStatus status code: %d, 状态 / Status: %d\n", ret, transformStatus);

    // [ZH] 顺序执行录制、回放和路径接口。
    // [EN] Execute the record, replay, and path APIs in sequence.
    char recordNames[8][128] = {{0}};
    size_t recordCount = 0U;
    ArmMotionPose recordPose = {0};
    ArmMotionPose pathPose = {0};
    const char* pathList[1] = {"demo_path"};
    int pathStates[1] = {0};
    double transitionTime = 0.0;
    double scalingFactor = 0.0;
    ret = Arm_Trajectory_RecordBegin(handle, "demo_record");
    printf("[c99_trajectory] RecordBegin 状态码 / RecordBegin status code: %d\n", ret);
    ret = Arm_Trajectory_RecordFinish(handle, "demo_record");
    printf("[c99_trajectory] RecordFinish 状态码 / RecordFinish status code: %d\n", ret);
    ret = Arm_Trajectory_ReplayStart(handle, "demo_record");
    printf("[c99_trajectory] ReplayStart 状态码 / ReplayStart status code: %d\n", ret);
    ret = Arm_Trajectory_ReplayStop(handle, "demo_record");
    printf("[c99_trajectory] ReplayStop 状态码 / ReplayStop status code: %d\n", ret);
    ret = Arm_Trajectory_RecordDelete(handle, "demo_record");
    printf("[c99_trajectory] RecordDelete 状态码 / RecordDelete status code: %d\n", ret);
    ret = Arm_Trajectory_GetRecordList(handle, recordNames, 8U, &recordCount);
    printf("[c99_trajectory] GetRecordList 状态码 / GetRecordList status code: %d, 数量 / Count: %zu\n", ret, recordCount);
    ret = Arm_Trajectory_GetRecordStartPose(handle, "demo_record", &recordPose);
    printf("[c99_trajectory] GetRecordStartPose 状态码 / GetRecordStartPose status code: %d\n", ret);
    ret = Arm_Trajectory_PathRecordBegin(handle, "demo_path", "sdk example", 1.0, 1.0);
    printf("[c99_trajectory] PathRecordBegin 状态码 / PathRecordBegin status code: %d\n", ret);
    ret = Arm_Trajectory_PathRecordFinish(handle);
    printf("[c99_trajectory] PathRecordFinish 状态码 / PathRecordFinish status code: %d\n", ret);
    ret = Arm_Trajectory_GetPathStartPose(handle, "demo_path", &pathPose);
    printf("[c99_trajectory] GetPathStartPose 状态码 / GetPathStartPose status code: %d\n", ret);
    ret = Arm_Trajectory_GetPathState(handle, pathList, 1U, pathStates, 1U);
    printf("[c99_trajectory] GetPathState 状态码 / GetPathState status code: %d, 状态 / State: %d\n", ret, pathStates[0]);
    ret = Arm_Trajectory_SetPathPlannerParameter(handle, 0.2, 1.0);
    printf("[c99_trajectory] SetPathPlannerParameter 状态码 / SetPathPlannerParameter status code: %d\n", ret);
    ret = Arm_Trajectory_GetPathPlannerParameter(handle, &transitionTime, &scalingFactor);
    printf("[c99_trajectory] GetPathPlannerParameter 状态码 / GetPathPlannerParameter status code: %d, transition_time=%.6f, scaling_factor=%.6f\n", ret, transitionTime, scalingFactor);
    ret = Arm_Trajectory_MovePath(handle, "demo_path", 50.0, 1.0);
    printf("[c99_trajectory] MovePath 状态码 / MovePath status code: %d\n", ret);

    // [ZH] 顺序执行实时轨迹接口。
    // [EN] Execute the real-time trajectory APIs in sequence.
    double positions[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
    ArmTrajectoryPointC point = {0};
    ArmTrajectorySegmentC segment = {0};
    point.position_list = positions;
    point.position_count = 6;
    segment.point_list = &point;
    segment.total_points = 1U;
    segment.seq = 1U;
    segment.last_fragment = 1U;
    ret = Arm_RealTimeTrajectory_EnterTrajectoryControl(handle);
    printf("[c99_trajectory] EnterTrajectoryControl 状态码 / EnterTrajectoryControl status code: %d\n", ret);
    ret = Arm_RealTimeTrajectory_SetFifoSize(handle, 8);
    printf("[c99_trajectory] SetFifoSize 状态码 / SetFifoSize status code: %d\n", ret);
    ret = Arm_RealTimeTrajectory_SubscribeJointStream(handle);
    printf("[c99_trajectory] SubscribeJointStream 状态码 / SubscribeJointStream status code: %d\n", ret);
    ret = Arm_RealTimeTrajectory_SendTrajectory(handle, &segment);
    printf("[c99_trajectory] SendTrajectory 状态码 / SendTrajectory status code: %d\n", ret);
    ret = Arm_RealTimeTrajectory_StopTrajectoryControl(handle);
    printf("[c99_trajectory] StopTrajectoryControl 状态码 / StopTrajectoryControl status code: %d\n", ret);
    ret = Arm_RealTimeTrajectory_UnsubscribeJointStream(handle);
    printf("[c99_trajectory] UnsubscribeJointStream 状态码 / UnsubscribeJointStream status code: %d\n", ret);
    ret = Arm_RealTimeTrajectory_ExitTrajectoryControl(handle);
    printf("[c99_trajectory] ExitTrajectoryControl 状态码 / ExitTrajectoryControl status code: %d\n", ret);

    // [ZH] 断开连接并销毁句柄。
    // [EN] Disconnect and destroy the handle.
    Arm_Disconnect(handle);
    Arm_Destroy(handle);
    printf("[c99_trajectory] 示例结束 / Example finished\n");
    return 0;
}