头文件: cpp/interface/nrc_interface.h
1. set_global_position - 新增/设置全局路点
方法: int set_global_position(SOCKETFD socket_fd, const std::string& pos_name, const std::vector<double>& pos_info);
功能描述: 创建或修改一个持久化的全局位置变量(路点),可通过名称直接调用。
参数:
socket_fd:已连接的句柄
pos_name:全局路点名称(如"GP0001")
pos_info:位置坐标数据列表,Python列表格式(list)。根据底层运动规划,要求传入7维双精度浮点数:
- 直角坐标系模式:承载[X, Y, Z, RX, RY, RZ],分别对应空间三维毫米位姿、欧拉角弧度
- 关节坐标系模式:承载1~7轴的各关节目标运行度数。对于标准6轴机械臂,第7位请传入0.0作为物理占位符
返回值:
使用示例:
C++
bool test_set_global_position(const std::string& pos_name, const std::vector<double>& actual_coords, int coord_type = 0) {
if (socket_fd_6001_ <= 0) return false;
// 校验输入的坐标数据,确保至少包含6个核心轴的数据
if (actual_coords.size() < 6) {
std::cout << "[提示] 传入的坐标数据少于6个,无法设置" << std::endl;
return false;
}
// 严格按照底层通信协议要求的长度(14)创建向量,并全部初始化为0.0
std::vector<double> pos_info(14, 0.0);
// 严格按照协议字段定义进行协议头的位赋值
pos_info[0] = coord_type; // [0] 坐标系类型 (0:关节, 1:直角, 2:工具, 3:用户)
pos_info[1] = 0; // [1] 单位制 (0:角度制, 1:弧度制)
pos_info[2] = 0; // [2] 机器人形态配置 (默认为0)
pos_info[3] = 0; // [3] 工具手坐标系序号 (默认为0)
pos_info[4] = 0; // [4] 用户坐标系序号 (默认为0)
pos_info[5] = 0; // [5] 预留备用
pos_info[6] = 0; // [6] 预留备用
// 从第7位开始,依次将6轴的实际坐标数据填充到协议数组中
for (size_t i = 0; i < 6; ++i) {
pos_info[7 + i] = actual_coords[i];
}
// 传入控制端口句柄、全局变量名及封装好的协议向量,调用底层接口改写控制器全局点位
int ret = set_global_position(socket_fd_6001_, pos_name, pos_info);
CHECK_RET(ret, "设置全局变量位置 [" + pos_name + "]");
return ret == SUCCESS;
}
2. get_global_position - 查询全局GP点位
方法: int get_global_position(SOCKETFD socket_fd, const std::string& pos_name, std::vector<double>& pos_data);
功能描述: 读取指定名称的全局路点数据,返回14维向量。
参数:
socket_fd:已连接的句柄
pos_name:全局路点名称
pos_data:输出参数,存储14维数据
返回值:
使用示例:
C++
bool test_get_global_position_vector(const std::string& pos_name) {
if (socket_fd_6001_ <= 0) return false;
// 传入控制端口句柄和全局变量名,调用底层接口获取对应的14维位置协议数据
std::vector<double> pos_data;
int ret = get_global_position(socket_fd_6001_, pos_name, pos_data);
if (ret != SUCCESS) {
// 获取失败,打印对应的错误码
std::cout << "[失败] 查询全局变量位置 [" << pos_name << "] 失败,错误码: " << ret << std::endl;
return false;
}
std::cout << "[成功] 查询全局变量位置 [" << pos_name << "] 成功, 数据长度: " << pos_data.size() << std::endl;
// 校验返回的数据长度是否符合协议规范(标准为14维)
if (pos_data.size() >= 14) {
// 解析前7位控制属性(如:[0]坐标系类型、[1]单位制、[2]形态配置、[3]工具号等)
std::cout << "-> 点位属性 (前7位): ";
for (int i = 0; i < 7; ++i) {
std::cout << pos_data[i] << " ";
}
std::cout << "\n";
// 解析后7位核心数据(前6项通常为各轴实际角度或直角坐标 X/Y/Z/RX/RY/RZ)
std::cout << "-> 机器人位置 (后7位): ";
for (int i = 7; i < 14; ++i) {
std::cout << pos_data[i] << " ";
}
std::cout << std::endl;
} else {
// 异常处理:若长度不足14位,打印警告并倾倒全部原始数据供排查
std::cout << "-> 警告: 返回的数据长度不足14位,原始内容: ";
for (double val : pos_data) {
std::cout << val << " ";
}
std::cout << std::endl;
}
return true;
}