伺服状态与系统参数设置接口

头文件:include/tl_interface.h

1. clear_error - 清除系统错误

方法:Result clear_error(SOCKETFD socketFd);

功能描述:复位控制器的当前报警状态(清除红色错误)。在机械臂发生碰撞、超限位等错误后,排除物理故障后调用此接口清除报警。清错后需要手动进行下电操作,释放控制器的占用状态才可以继续上电(清错后不能直接上电,先下电再上电)。

参数:

  • socketFd:已连接的句柄。

返回值:

  • 0:成功。
  • 非0:失败(如错误仍未清除需手动排除故障)。

使用示例:

C++
    print_separator("清错与伺服复位");
    ret = tl::clear_error(sock_6001);
    print_result("clear_error", ret);
    std::this_thread::sleep_for(std::chrono::milliseconds(300));

2. set_servo_state - 设置伺服就绪状态

方法: Result set_servo_state(SOCKETFD socketFd, ServoState state);

功能描述:控制电机抱闸与使能。state=READY=使能(解锁抱闸),state=STOP=去使能(抱闸锁死)。

参数:

  • socketFd:已连接的句柄。
  • state ServoState::STOP(停止)/ ServoState::READY(就绪)。

返回值:

  • 0:成功。
  • -4:操作不允许(如未清除报警)。
  • 其他非0:失败。

使用示例:

C++
    std::cout << "  [信息] 伺服处于停止状态,设置就绪..." << std::endl;
    ret = tl::set_servo_state(socket_fd, tl::ServoState::READY);
    if (ret != tl::Result::SUCCESS && ret != tl::Result::OPERATION_NOT_ALLOWED) {
      std::cerr << "[ERROR] 设置伺服就绪失败: " << ret << std::endl;
      return;
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(500));

3. set_servo_poweron - 设置伺服上电状态

方法:Result set_servo_poweron(SOCKETFD socketFd);

功能描述:闭合强电接触器,为电机供电。需先调用 set_servo_state(1)。

参数:

  • socketFd:已连接的句柄。

返回值:

  • 0:成功。
  • -4:操作不允许(如未清除报警)。
  • 其他非0:失败。

使用示例:

C++
void enable_servo(const int socket_fd)
{
  std::cout << "--- 检查伺服状态 ---" << std::endl;

  // 1. 先清除控制器错误和报警,再下电复位确保状态同步
  tl::clear_error(socket_fd);
  std::this_thread::sleep_for(std::chrono::milliseconds(300));
  tl::set_servo_poweroff(socket_fd);
  std::this_thread::sleep_for(std::chrono::milliseconds(300));

  // 2. 检查伺服状态
  tl::ServoState state;
  auto ret = tl::get_servo_state(socket_fd, state);
  if (ret != tl::Result::SUCCESS) {
    std::cerr << "[ERROR] 获取伺服状态失败: " << ret << std::endl;
    return;
  }
  std::cout << "  [信息] 当前伺服状态: " << static_cast<int>(state)
            << " (STOP=停止 READY=就绪 ALARM=报警 RUNNING=运行)" << std::endl;

  if (state == tl::ServoState::ALARM) {
    std::cerr << "[ERROR] 伺服处于报警状态,无法上电,请排查报警原因后重试" << std::endl;
    return;
  }

  if (state == tl::ServoState::RUNNING) {
    std::cout << "[INFO] 机械臂已在使能上电状态" << std::endl;
    return;
  }

  // 3. 上电流程
  if (state == tl::ServoState::STOP) {
    std::cout << "  [信息] 伺服处于停止状态,设置就绪..." << std::endl;
    ret = tl::set_servo_state(socket_fd, tl::ServoState::READY);
    if (ret != tl::Result::SUCCESS && ret != tl::Result::OPERATION_NOT_ALLOWED) {
      std::cerr << "[ERROR] 设置伺服就绪失败: " << ret << std::endl;
      return;
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
  }

  std::cout << "  [信息] 上电使能..." << std::endl;
  ret = tl::set_servo_poweron(socket_fd);
  if (ret != tl::Result::SUCCESS) {
    std::cerr << "[ERROR] 上电失败: " << ret << std::endl;
    return;
  }
  std::this_thread::sleep_for(std::chrono::seconds(2));

  // 4. 确认结果
  tl::get_servo_state(socket_fd, state);
  if (state == tl::ServoState::RUNNING) {
    std::cout << "[INFO] 机械臂使能上电成功(servo_state = " << static_cast<int>(state) << ")" << std::endl;
  } else {
    std::cerr << "[ERROR] 机械臂使能上电失败(servo_state = " << static_cast<int>(state) << ")" << std::endl;
  }
}

4. set_servo_poweroff - 设置伺服下电状态

方法:Result set_servo_poweroff(SOCKETFD socketFd);

功能描述:切断强电,电机抱闸锁死。

参数:

  • socketFd:已连接的句柄。

返回值:

  • 0:成功。
  • -4:操作不允许(如未清除报警)。
  • 其他非0:失败。

使用示例:

C++
void disable_servo(const int socket_fd)
{
  tl::ServoState state;
  tl::get_servo_state(socket_fd, state);
  switch (state)
  {
    case tl::ServoState::READY:
        std::cout << "[INFO] 机械臂已使能下电" << std::endl;
        break;
    case tl::ServoState::RUNNING:
        tl::set_servo_poweroff(socket_fd);
        tl::get_servo_state(socket_fd, state);
        std::cout << "[INFO] 机械臂使能下电成功(servo_state = " << static_cast<int>(state) << ")" << std::endl;
        return;
    default:
        break;
  }
  std::cout << "[INFO] 机械臂使能下电失败(servo_state = " << static_cast<int>(state) << ")" << std::endl;
}

5. set_speed - 设置速度

方法: Result set_speed(SOCKETFD socketFd, int speed);

功能描述:设置全局自动运行速度百分比(1~100)。

参数:

  • socketFd:已连接的句柄。
  • speed:速度百分比。

返回值:

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

使用示例:

C++
    // 设置全局速度
    ret = tl::set_speed(socket_fd, 30);
    std::this_thread::sleep_for(std::chrono::milliseconds(200));

6. restore_default_param_DH - 恢复机械臂默认DH参数

方法:Result restore_default_param_DH(SOCKETFD socketFd, int robotNum);

功能描述:恢复机械臂默认DH参数。

参数:

  • socketFd:已连接的句柄。
  • robotNum:机器人编号(1-4)

返回值:

  • Result:
    • 0:成功。
    • 非0:失败
  • DHparam DH:参数。

使用示例:

C++
    // // ⚠️ 以下功能不建议测试,请在厂家指导下使用
    // // ============================================================
    // // 6. 恢复机械臂默认 DH 参数
    // // ============================================================
    // print_separator("恢复机械臂默认 DH 参数");

    // ret = restore_default_param_DH(sock, 1);
    // print_result("restore_default_param_DH (robot=1)", ret);
    // std::cout << std::endl;

7. set_cartesian_params - 设置机器人笛卡尔参数

方法:Result set_cartesian_params(SOCKETFD socketFd, const CartesianParam& param);

功能描述:配置笛卡尔空间运动动力学约束参数,限定末端执行器最大直线速度、直线加速度、旋转角速度与角加速度,实现轨迹平滑度与运行安全管控。

参数:

  • socketFd:已连接的句柄。
  • param 包含笛卡尔空间运动参数的结构体

返回值:

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

使用示例:

C++
    // // ⚠️ 以下功能不建议测试,请在厂家指导下使用
    // // ============================================================
    // // 8. 设置笛卡尔参数
    // // ============================================================
    // print_separator("设置笛卡尔参数");

    // {
    //     CartesianParam cart_param;
    //     cart_param.maxSpeed = 500.0;         // 最大线速度 (mm/s)
    //     cart_param.maxAcc = 5.0;             // 最大线加速度 (mm/s^2)
    //     cart_param.maxDec = -5.0;            // 最大线减速度 (mm/s^2)
    //     cart_param.maxAttitudeVel = 180.0;   // 最大姿态角速度 (deg/s)
    //     cart_param.speedLimitMode = 1;       // 速度限制方式: 0=位姿, 1=位置

    //     std::cout << std::fixed << std::setprecision(2);
    //     ret = set_cartesian_params(sock, cart_param);
    //     if (ret == Result::SUCCESS) {
    //         std::cout << "[成功] 设置笛卡尔参数" << std::endl;
    //         std::cout << "  最大线速度: " << cart_param.maxSpeed << " mm/s" << std::endl;
    //         std::cout << "  最大线加速度: " << cart_param.maxAcc << " mm/s^2" << std::endl;
    //         std::cout << "  最大线减速度: " << cart_param.maxDec << " mm/s^2" << std::endl;
    //         std::cout << "  最大姿态角速度: " << cart_param.maxAttitudeVel << " deg/s" << std::endl;
    //         std::cout << "  速度限制方式: " << (cart_param.speedLimitMode == 0 ? "位姿" : "位置") << std::endl;
    //     } else {
    //         std::cerr << "[ERROR] 设置笛卡尔参数失败,错误码: " << ret << std::endl;
    //     }
    // }
    // std::cout << std::endl;

8. restore_network_factory_settings - 恢复网络出厂设置

方法:Result restore_network_factory_settings(SOCKETFD socketFd);

功能描述:执行控制器网络参数恢复出厂操作,重置通讯 IP
地址为默认固定地址,属于高危配置操作。

参数:

  • socketFd:已连接的句柄。

返回值:

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

使用示例:

C++
    // ============================================================
    // 10. 恢复网络出厂设置(危险操作,默认注释)
    // ============================================================
    // ⚠️  危险: 恢复网络出厂设置会重置控制器 IP 为 192.168.1.13
    //    取消下面代码的注释前,请确认当前网络环境允许 IP 变更
    //
    // print_separator("恢复网络出厂设置");
    // ret = restore_network_factory_settings(sock);
    // print_result("restore_network_factory_settings", ret);
    // std::cout << std::endl;

9. set_robot_joint_param - 设置当前机器人关节参数

方法:Result set_robot_joint_param(SOCKETFD socketFd, int id, RobotJointParam& param);

功能描述:对指定单关节进行运动与硬限位参数配置,设定各关节最大运行速度、加速度及正负向机械位置软限位,约束关节运动边界保障本体运行安全。

参数:

  • socketFd:已连接的句柄。
  • id:关节编号,取值范围 [1,6](6轴,对应 J1~J6);7轴为 [1,7](对应 J1~J7)。
  • param:结构体参数。

返回值:

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

使用示例:

C++
    // // ============================================================
    // // 7. 设置关节参数(遍历关节 1~6)
    // // ============================================================
    // print_separator("设置关节参数");

    // {
    //     RobotJointParam joint_param;
    //     joint_param.reducRatio = 1;          // 减速比
    //     joint_param.encoderResolution = 2;    // 编码器位数
    //     joint_param.posSWLimit = 3;           // 轴正限位
    //     joint_param.negSWLimit = -4;          // 轴反限位
    //     joint_param.ratedRotSpeed = 5;        // 电机额定正转速
    //     joint_param.ratedDeRotSpeed = -6;     // 电机额定反转速
    //     joint_param.maxRotSpeed = 2;          // 电机最大正转速
    //     joint_param.maxDeRotSpeed = -2;       // 电机最大反转速
    //     joint_param.ratedVel = 300;           // 额定正速度 (度/秒)
    //     joint_param.deRatedVel = -300;        // 额定反速度 (度/秒)
    //     joint_param.maxAcc = 2;               // 最大加速度 (度/秒^2)
    //     joint_param.maxDecel = -2;            // 最大减速度 (度/秒^2)
    //     joint_param.direction = -1;           // 模型方向: 1=正向, -1=反向

    //     // 遍历关节 1~6
    //     for (int joint_id = 1; joint_id <= 6; ++joint_id) {
    //         std::cout << "--- 关节 " << joint_id << " ---" << std::endl;
    //         ret = set_robot_joint_param(sock, joint_id, joint_param);
    //         if (ret == Result::SUCCESS) {
    //             std::cout << "  [成功] 设置关节 " << joint_id << " 参数" << std::endl;
    //         } else {
    //             std::cout << "  [失败] 设置关节 " << joint_id << " 参数,错误码: " << ret << std::endl;
    //         }
    //     }

    //     // 打印参数(仅供示意,TODO: 各关节应根据实际需求独立设置参数值)
    //     std::cout << "\n========== 机器人关节参数设置 (仅供参考) ==========" << std::endl;
    //     std::cout << "  减速比: " << joint_param.reducRatio << std::endl;
    //     std::cout << "  编码器位数: " << joint_param.encoderResolution << std::endl;
    //     std::cout << "  正限位: " << joint_param.posSWLimit << " 度" << std::endl;
    //     std::cout << "  反限位: " << joint_param.negSWLimit << " 度" << std::endl;
    //     std::cout << "  额定正转速: " << joint_param.ratedRotSpeed << " RPM" << std::endl;
    //     std::cout << "  额定反转速: " << joint_param.ratedDeRotSpeed << " RPM" << std::endl;
    //     std::cout << "  最大正转速: " << joint_param.maxRotSpeed << " RPM" << std::endl;
    //     std::cout << "  最大反转速: " << joint_param.maxDeRotSpeed << " RPM" << std::endl;
    //     std::cout << "  额定正速度: " << joint_param.ratedVel << " 度/秒" << std::endl;
    //     std::cout << "  额定反速度: " << joint_param.deRatedVel << " 度/秒" << std::endl;
    //     std::cout << "  最大加速度: " << joint_param.maxAcc << " 度/秒^2" << std::endl;
    //     std::cout << "  最大减速度: " << joint_param.maxDecel << " 度/秒^2" << std::endl;
    //     std::cout << "  模型方向: " << (joint_param.direction == 1 ? "正向" : "反向") << std::endl;
    //     std::cout << "================================================" << std::endl;
    // }
    // std::cout << std::endl;

10. set_controller_ip - 配置控制器有线网口IP

方法:Result set_controller_ip(SOCKETFD socketFd, const std::string& name, const std::string& address, const std::string& gateway, const std::string& dns);

功能描述:配置控制器有线网口 IP

参数:

  • socketFd:已连接的句柄。
  • name:网卡设备名称。
  • address:ip地址。
  • gateway:网关地址。
  • dns:DNS服务器地址。

返回值:

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

使用示例:

C++
    // ============================================================
    // 9. 配置有线网口 IP 地址(危险操作,默认注释)
    // ============================================================
    // ⚠️  危险: 错误配置会导致控制器网络断连,仅能在已知网络参数时使用
    //    取消下面代码的注释前,请确认 IP/网关/DNS 参数正确
    //
    // print_separator("配置有线网口 IP 地址");
    // ret = set_controller_ip(sock, "eth0", "192.168.1.14", "192.168.1.1", "8.8.8.8");
    // print_result("set_controller_ip", ret);
    // print_separator("配置有线网口 IP 地址完成, 新IP: 192.168.1.14");
    // std::cout << std::endl;

11. set_robot_dh_param - 设置机器人 DH 参数

方法:Result set_robot_dh_param(SOCKETFD socketFd, const RobotDHParam& param);

功能描述:设置当前机器人DH参数。

参数:

  • socketFd:已连接的句柄。
  • param:alpha[6]{0} 1-6轴DH参数alpha,单位:deg;a[6]{0} 1-6轴DH参数a,单位:mm;theta[6]{0}1-6轴DH参数theta,单位:deg;d[6]{0} 1-6轴DH参数d,单位:mm;eulerAngle{0} 欧拉角模式等参数。

返回值:

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

12. set_zero_pos_deviation - 设置零位偏差

方法:Result set_zero_pos_deviation(SOCKETFD socketFd, int axis, double shift);

功能描述:设置指定关节的零位偏差(零点偏移)。

参数:

  • socketFd:已连接的句柄。
  • axis:轴号(1-7)。
  • shift:偏移量(-360° < shift < 360°)。

返回值:

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

13. set_axis_zero_position - 指定关节当前位置为零位/标定当前状态下的零位

方法:Result set_axis_zero_position(SOCKETFD socketFd, int axis);

功能描述:将当前关节位置记录为零位。axis=0 表示所有轴,axis=1~6 表示单轴。

警告:仅在机械臂物理对齐零刻度线后调用,否则将导致坐标系错乱,引发撞机风险!

参数:

  • socket_fd:已连接的句柄。
  • axis:轴号(0=全轴,1~6=单轴)

返回值:

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

使用示例:

C++
    // ----设置指定关节零位(危险操作,默认注释)----
    // ⚠️  危险: set_axis_zero_position 会修改机器人关节零位标定,
    //    错误的值会导致所有后续运动出现定位偏差,严重时可能造成机械碰撞。
    //    仅在专业指导下、确认当前零位确需校正时使用。
    //    取消下面代码的注释前,请确认 axis 值正确且已理解全部后果。
    //
    // std::cout << "[INFO] **********设置指定关节零位**********" << std::endl;
    // int axis = 1;
    // ret = set_axis_zero_position(socket_fd, axis);
    // if (ret != Result::SUCCESS) {
    //     std::cerr << "[ERROR] 设置指定关节零位失败,程序退出!" << std::endl;
    //     return -1;
    // }
    // std::cout << "[INFO] 设置指定关节零位成功" << std::endl;
    // std::cout << std::endl;

14. set_receive_error_or_warnning_message_callback - 设置错误警告回调

方法:Result set_receive_error_or_warnning_message_callback(SOCKETFD socketFd,
void (*function)(int messageType, const char *message,
int messageCode));

功能描述:注册异步错误/警告回调函数。当控制器产生错误或警告时,会异步调用该回调。

参数:

  • socketFd:已连接的句柄。
  • function:指向回调函数的指针。该回调函数在接收到错误或警告信息时被调用。

返回值:

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

使用示例:

C++
    // ---- 注册错误/警告回调 ----
    print_separator("注册错误回调");
    ret = tl::set_receive_error_or_warnning_message_callback(sock, on_error_or_warning);
    print_result("set_receive_error_or_warnning_message_callback", ret);
    if (ret != tl::Result::SUCCESS) {
        std::cerr << "[ERROR] 注册回调失败" << std::endl;
        tl::disconnect_robot(sock);
        return -1;
    }