轴(Axis)的定义

概述

  • Axis 是对单个物理自由度(电机+驱动+编码器等)的软件抽象。它聚合硬件接口、状态机、运动命令队列、轨迹内核(MotionKernel / planner)与安全/限制逻辑。
  • 职责:接收功能块(FB)并排队、调用 planner 生成时间参数化轨迹、在实时周期内采样轨迹并把命令下发到 Servo(或把关键点上传到驱动),管理轴的状态与错误、执行单位转换与保护逻辑。

为什么要抽象出轴?

  • 轴(Axis)是把运动控制系统中与单一物理驱动/自由度相关的所有职责封装成一个概念单元:状态、命令、限制、与伺服/编码器的接口、功能块队列、以及与轨迹/内核的交互。

  • 抽象轴可以把“通用的运动逻辑”与“具体硬件/协议”分离,便于设计、测试、复用与多轴协同。

  • 映射到物理:每个轴对应一个实际电机/驱动/编码器,轴对象把这些硬件资源和 IO 映射到软件接口上(读位置、写命令、处理限位等)。

  • 聚合状态与命令:集中保存位置/速度/加速度测量、当前命令、控制模式(CSP/CSV/PP/CST)、错误状态、使能/力矩等,便于一致性检查与状态机管理。

  • 职责分离:planner(轨迹生成器)只负责计算时间参数化轨迹;Axis 负责把轨迹采样、限幅、前馈叠加、转换成伺服可接受的命令并下发。

  • 多模式支持:通过 Axis 的控制模式接口,可以在 CSP(每周期下发位置/前馈)、PP(上传关键点由驱动执行)等模式间切换,而不改变 planner 实现。

  • 实时/资源管理:Axis 可以维护固定大小的 node_buffer、避免实时线程分配、做 double-buffer 同步,保证实时性与内存安全。

  • 安全与保护:统一实现限速、软限位、急停、错误恢复、回零逻辑等,避免每个调用者重复实现。

  • 多轴同步与协调:上层可以以 Axis 为单位进行同步插补、同步停止或协调速度缩放,实现多轴联动。

  • 易于测试与仿真:Axis 可指向仿真 Servo 对象,便于在无硬件时进行回归测试。

Axis在系统中的典型职责

  • 持有 AxisConfig(单位转换、编码器分辨率、限值)并提供 toUser/toEncoder 单位转换。
  • 接收功能块(FB)或运动命令并排队(node_buffer_),由 MotionKernel/Planner 生成时间参数化轨迹或按需重规划(replanUnderlyingMotion)。
  • 周期运行(runCycle)中:从轨迹采样(position/vel/acc/jerk),做限制/叠加(override、superimposed),并通过 Servo 接口下发到驱动(updateMotionCmdsToServo)。这决定系统是以 CSP(每周期下发)还是以 PP(上传轨迹点)运行。
  • 管理使能、伺服状态、错误、原点/限位输入与恢复。

与PLCopen关系

  • 概念上受 PLCopen MC 影响(有 MC_Power/Move/Home 等对应功能块思想),Axis 提供类似的状态与命令语义,但实现为 C++ 类和本地接口,不是 IEC FB 的逐字实现。通常会在上层做一层适配,把 PLCopen 的 FB 映射到 Axis 的方法与队列。

和 planner(如 offline_scurve_planner)的交互

  • planner 生成时间参数化轨迹(pos/vel/acc/jerk 随时间),Axis 负责按控制周期从该轨迹采样并下发(CSP)或把轨迹转换为驱动可接受的关键点上传(PP)。选择哪种方式由 Axis/Servo 层和目标硬件能力决定。

主要成员

  • 标识与元数据
    mcUSINT axis_id_:轴的唯一标识号。
    mcLREAL stamp_, delta_time_:时间戳与当前周期时间步长(s)。状态机与控制状态

  • MC_AXIS_STATES axis_state_:轴高层状态(idle, running, homing, error 等)。
    MC_ERROR_CODE axis_error_:当前错误码。
    mcBOOL power_on_, power_status_:电源/使能状态。
    MC_SERVO_CONTROL_MODE axis_mode_ / axis_mode_cmd_:当前与期望的控制模式(CSP, CSV, PP, CST 等)。

  • 测量量(来自硬件/仿真)
    mcLREAL axis_pos_, axis_vel_, axis_acc_, axis_jerk_:当前测量位置/速度/加速度/跃度(用户单位或编码器单位,取决实现)。
    mcLREAL axis_torque_:当前扭矩/力矩测量。
    mcLREAL overflow_count_:编码器回绕统计。

  • 命令量(目标)
    mcLREAL axis_pos_cmd_, axis_vel_cmd_, axis_acc_cmd_, axis_torque_cmd_:当前下发命令(最终输出给 Servo)。
    mcLREAL axis_underlying_pos_cmd_, axis_underlying_vel_cmd_ 等:由 planner/内核生成的“底层”命令。
    mcLREAL axis_sup_pos_cmd_ 等:叠加(superimposed)运动命令(教导/手动叠加)。

  • 配置与参数
    AxisConfig* config_:参数结构体(encoder_count_per_unit、vel_limit、acc_limit、frequency、param_table 等)。
    AxisParamInfo* param_table_、param_table_num_:轴参数表(可用于对象字典或PDO映射)。
    AxisCheckDoneFactor factor_:判定完成的阈值(pos/vel)。

  • 运动内核与执行节点
    MotionKernel motion_kernel_(或指针):封装 planner、轨迹缓存、采样接口。
    ExecutionNode node_buffer_[NODE_BUFFER_MAX_SIZE]:固定大小节点池,用于存放待执行的功能块(避免 realtime 分配)。
    ExecutionNode* it_ / node_num_:当前迭代指针、节点计数。
    ExecutionNode* superimposed_node_ptr_:叠加运动对应节点。

  • 伺服/硬件接口
    Servo* servo_:底层伺服/驱动接口(读 IO / 写命令 / 上传轨迹等)。
    mcBOOL axis_in_simulation_:是否仿真模式开关。

  • 覆盖/保护控制因子
    OverrideFactors axis_override_factors_:速度/加速度缩放因子(用于平滑停止或限幅)。
    mcBOOL axis_superimposed_enable_:是否启用叠加运动。

CSP(Cyclic Synchronous Position)

CSP(Cyclic Synchronous Position)适用于对闭环位置指令需要“周期性、低延迟、主控端插补/前馈”的场景;即主控制器每个控制周期向伺服下发目标位置(常同时带速度/加速度前馈)

典型适用场景

  • 高动态伺服控制:要求很短响应时间、高带宽跟踪(机器人关节、并联机器人、直接驱动轴)。
  • 多轴时间同步/插补:需要主控对多轴做严格时间同步(插补器在主控端),例如直线/圆弧插补、多轴联动。
  • 需要前馈控制与在线修改轨迹:利用速度/加速度前馈降低误差,或者实时重新规划并逐周期下发。
  • 分布式实时总线(如 EtherCAT CSP/DS402 模式、PROFINET IRT 等)可支持短周期传输并保证确定性。
Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐