全局路点管理接口

头文件: 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作为物理占位符

返回值:

  • int
    • 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维数据

返回值:

  • int
    • 0:成功
    • 负值:失败

使用示例:

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;
}