六维力传感器查询接口

头文件:include/tl_interface.h
相关示例代码:examples\cpp\ex_six_axis_force.cpp、ex_six_axis_force_drag.cpp、ex_error_zero.cpp

1. set_six_dimensional_force_communication_params - 设置六维力传感器通讯参数

方法:Result set_six_dimensional_force_communication_params(SOCKETFD socketFd, SixDimensionalForceCommunicationParams& params);

功能描述:配置机械臂末端六维力传感器的通讯参数(通讯类型、拖拽使能、自动连接、方向及 EtherCAT/Modbus 等参数)。

参数:

  • socketFd:已连接的句柄。
  • params:输入参数,SixDimensionalForceCommunicationParams 结构体,主要成员:
    • sensorDragEnable:传感器拖拽使能(默认 true)
    • originDataInitialPara:原始数据初始参数
    • sensorCommunicationType:通讯类型,0=EtherCAT,1=Modbus RTU,2=Modbus TCP
    • startupAutoConnectSensor:启动时自动连接传感器(默认 false)
    • YDirection:Y 方向(1=正,-1=反)
    • ZDirection:Z 方向(1=正,-1=反)
    • etherCat_mapNum:EtherCAT 映射数量
    • modbus_rtu_slaveID / modbus_rtu_port / modbus_rtu_baudRate 等:Modbus RTU 通讯参数
    • modbus_tcp_IP / modbus_tcp_port 等:Modbus TCP 通讯参数

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 1. 设置六维力传感器通讯参数(EtherCAT 通讯类型)
    tl::SixDimensionalForceCommunicationParams comm_params;
    comm_params.sensorCommunicationType = 0;     // 0: EtherCAT
    comm_params.startupAutoConnectSensor = true; // 启动自动连接传感器
    comm_params.sensorDragEnable = true;         // 传感器拖拽使能
    comm_params.etherCat_mapNum = 1;             // EtherCAT 映射数量
    comm_params.YDirection = -1;                 // Y 方向(-1 反)
    comm_params.ZDirection = -1;                 // Z 方向(-1 反)

    auto ret = tl::set_six_dimensional_force_communication_params(socket_fd, comm_params);
    if (ret == tl::Result::SUCCESS) {
        std::cout << "[成功] 设置六维力传感器通讯参数" << std::endl;
    } else {
        std::cerr << "[失败] 设置六维力传感器通讯参数失败! ret = " << ret << std::endl;
    }

2. get_six_dimensional_force_communication_params - 获取六维力传感器通讯参数

方法:Result get_six_dimensional_force_communication_params(SOCKETFD socketFd, SixDimensionalForceCommunicationParams& params);

功能描述:获取六维力传感器当前的通讯参数配置。

参数:

  • socketFd:已连接的句柄。
  • params:输出参数,SixDimensionalForceCommunicationParams 结构体,成员同 1.。

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 查询当前通讯参数(可在此基础上修改字段后写回,避免覆盖无关配置)
    tl::SixDimensionalForceCommunicationParams comm_params;
    auto ret = tl::get_six_dimensional_force_communication_params(socket_fd, comm_params);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 查询六维力传感器通讯参数失败! ret = " << ret << std::endl;
        return -1;
    }
    std::cout << "  通讯类型: " << comm_params.sensorCommunicationType
              << " (0=EtherCAT 1=ModbusRTU 2=ModbusTCP)" << std::endl;
    std::cout << "  传感器拖拽使能: " << (comm_params.sensorDragEnable ? "开启" : "关闭") << std::endl;

3. get_sensor_base_param - 获取六维力传感器的基础参数

方法:Result get_sensor_base_param(SOCKETFD socketFd, SensorBaseParam& baseParam);

功能描述:获取六维力传感器的基础参数(质量、质心、标零状态)。

参数:

  • socketFd:已连接的句柄。
  • baseParam:输出参数,SensorBaseParam 结构体,主要成员:
    • sensorMass:传感器质量,单位 [kg]
    • sensorMassCenterX:质心 X,单位 [mm]
    • sensorMassCenterY:质心 Y,单位 [mm]
    • sensorMassCenterZ:质心 Z,单位 [mm]
    • saveZero:是否已标零(true=已标零)

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 查询标定后的基础参数
    tl::SensorBaseParam base_param;
    auto ret = tl::get_sensor_base_param(socket_fd, base_param);
    if (ret == tl::Result::SUCCESS) {
        std::cout << "  传感器质量: " << base_param.sensorMass << std::endl;
        std::cout << "  质心 - X: " << base_param.sensorMassCenterX
                  << ", Y: " << base_param.sensorMassCenterY
                  << ", Z: " << base_param.sensorMassCenterZ << std::endl;
        std::cout << "  标零状态: " << (base_param.saveZero ? "已标零" : "未标零") << std::endl;
    }

4. mark_base_sensor - 执行六维力传感器标定

方法:Result mark_base_sensor(SOCKETFD socketFd, bool& success);

功能描述:完成六维力传感器零点偏移与正交耦合误差校准,消除自重及安装偏差带来的力信号零漂,保证后续力控采集数据精度。

参数:

  • socketFd:已连接的句柄。
  • success:输出参数,标定是否成功(true=成功)。

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 标定六维力传感器零位/重心
    // 操作前请确保:
    //   1. 机械臂末端无负载或已安装标准负载
    //   2. 机械臂处于竖直姿态(关节各轴在合理位置)
    //   3. 周围安全,标定过程中机械臂会缓慢运动
    std::cout << "[INFO] 即将执行六维力传感器标定,请确认 (y/n): ";
    char confirm = 'n';
    std::cin >> confirm;

    if (confirm == 'y' || confirm == 'Y') {
        bool calib_success = false;
        auto ret = tl::mark_base_sensor(socket_fd, calib_success);
        if (ret != tl::Result::SUCCESS) {
            std::cerr << "[ERROR] 标定六维力传感器失败,错误码: " << ret << std::endl;
        } else if (calib_success) {
            std::cout << "[INFO] 标定六维力传感器成功" << std::endl;
        } else {
            std::cerr << "[ERROR] 标定六维力传感器失败,标定结果为 false" << std::endl;
        }
    }

5. get_sensor_6d_data - 获取六维力传感器数据

方法:Result get_sensor_6d_data(SOCKETFD socketFd, Sensor6DData& sensorData);

功能描述:获取机械臂末端六维力传感器数据(原始数据与去皮后数据)。

参数:

  • socketFd:已连接的句柄。
  • sensorData:输出参数,Sensor6DData 结构体,主要成员:
    • sensorConnected:传感器连接状态(true=已连接)
    • fxData / fyData / fzData:原始力数据 Fx / Fy / Fz,单位 [N]
    • mxData / myData / mzData:原始力矩数据 Mx / My / Mz,单位 [N·m]
    • fxDataSubBase / fyDataSubBase / fzDataSubBase:去皮后力数据,单位 [N]
    • mxDataSubBase / myDataSubBase / mzDataSubBase:去皮后力矩数据,单位 [N·m]

返回值:

  • 0:成功。
  • 非0:失败。

使用示例:

C++
    // 获取六维力传感器数据
    tl::Sensor6DData sensor_data;
    auto ret = tl::get_sensor_6d_data(socket_fd, sensor_data);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 获取六维力传感器数据失败! ret = " << ret << std::endl;
        return -1;
    }

    std::cout << "  传感器连接状态: "
              << (sensor_data.sensorConnected ? "已连接" : "未连接") << std::endl;
    std::cout << std::fixed << std::setprecision(3);

    std::cout << "  --- 传感器原始数据 ---" << std::endl;
    std::cout << "  Fx = " << sensor_data.fxData << " N" << std::endl;
    std::cout << "  Fy = " << sensor_data.fyData << " N" << std::endl;
    std::cout << "  Fz = " << sensor_data.fzData << " N" << std::endl;
    std::cout << "  Mx = " << sensor_data.mxData << " N·m" << std::endl;
    std::cout << "  My = " << sensor_data.myData << " N·m" << std::endl;
    std::cout << "  Mz = " << sensor_data.mzData << " N·m" << std::endl;

    std::cout << "  --- 去皮后数据 ---" << std::endl;
    std::cout << "  Fx = " << sensor_data.fxDataSubBase << " N" << std::endl;
    std::cout << "  Fy = " << sensor_data.fyDataSubBase << " N" << std::endl;
    std::cout << "  Fz = " << sensor_data.fzDataSubBase << " N" << std::endl;
    std::cout << "  Mx = " << sensor_data.mxDataSubBase << " N·m" << std::endl;
    std::cout << "  My = " << sensor_data.myDataSubBase << " N·m" << std::endl;
    std::cout << "  Mz = " << sensor_data.mzDataSubBase << " N·m" << std::endl;

6. get_payload_param_by_sensor - 获取六维力传感器负载参数

方法:Result get_payload_param_by_sensor(SOCKETFD socketFd, PayloadParamBySensor& param);

功能描述:获取基于六维力传感器标定的负载参数(负载质量与质心)。

参数:

  • socketFd:已连接的句柄。
  • param:输出参数,PayloadParamBySensor 结构体,主要成员:
    • payloadMass:负载质量,单位 [kg]
    • payloadMassCenterX:负载质心 X,单位 [mm]
    • payloadMassCenterY:负载质心 Y,单位 [mm]
    • payloadMassCenterZ:负载质心 Z,单位 [mm]

返回值:

  • 0:成功。
  • 非0:失败。