4.9 C99 Trajectory 轨迹接口
概述
C99 Trajectory 覆盖离线轨迹、CSV 转换、轨迹录制回放、路径录制执行和实时轨迹控制。实时轨迹接口沿用 Arm_RealTimeTrajectory_* 前缀。
对应头文件:
include/c_arm_trajectory.h
使用前提与执行顺序
| 类别 | 说明 |
|---|---|
| 会话要求 | 所有接口都需要传入有效的 ArmHandle* ,业务调用前应先完成 Arm_Connect() 。 |
| 离线轨迹 | 调用顺序为 SetOfflineTrajectoryFile 、 PrepareOfflineTrajectory 、 ExecuteOfflineTrajectory 。准备阶段会移动机器人到轨迹起点。 |
| CSV 转换 | TransformCsvToTrajectory 提交转换任务, CheckTransformStatus 查询转换状态。转换响应文本写入调用方提供的 char* 缓冲区。 |
| 轨迹录制 | RecordBegin 进入录制状态, RecordFinish 结束并写入记录;回放使用 ReplayStart 和 ReplayStop 。 |
| 路径录制 | PathRecordBegin 开始录制 .path/.traj , PathRecordFinish 结束录制。 |
| 实时轨迹 | 调用顺序为进入控制模式、设置 FIFO、发送轨迹分片、停止控制、退出控制模式。 |
| 动作型接口 | PrepareOfflineTrajectory 、 ExecuteOfflineTrajectory 、 ReplayStart 、 MovePath 、实时轨迹发送都会驱动机器人运动。 |
接口签名
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 ,包括 IDLE 、 RUNNING 、 SUCCESS 、 FAILED 、 NOT_FOUND 、 UNKNOWN 。 |
| 记录列表 | GetRecordList 使用固定宽度数组 char outNames[][128] ;每个名称固定 128 字节。 |
| 路径状态 | GetPathState 要求 maxCount >= pathCount ,容量不足时不写入部分结果。 |
| 路径规划 | SetPathPlannerParameter 会影响后续 MovePath 执行; GetPathPlannerParameter 读取当前路径过渡时间和缩放系数。 |
| 实时轨迹 | 进入控制、设置 FIFO、发送分片、停止和退出需要按顺序调用;订阅关节流会打开实时反馈。 |
| 轨迹分片 | ArmTrajectorySegmentC 通过 point_list 和 total_points 描述本次发送点位; seq 表示分片序号, last_fragment 表示是否最后一片。 |
固件兼容性
| 功能 | 最低固件版本 | 说明 |
|---|---|---|
Arm_Trajectory_PathRecordBegin / Arm_Trajectory_PathRecordFinish | 1.5.x | 支持路径录制。 |
Arm_Trajectory_MovePath | 高于 1.5.6 | 1.5.6 及以下版本存在路径回放读取点位异常,可能导致路径回放失败。 |
Arm_Trajectory_RecordBegin / Arm_Trajectory_RecordFinish / Arm_Trajectory_ReplayStart | 1.5.x | 支持轨迹录制与回放。 |
Arm_Trajectory_SetPathPlannerParameter / Arm_Trajectory_GetPathPlannerParameter | 1.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; // 示例中保留分片变量示例代码
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;
}