odrive电机控制代码 `update` 函数解析

[复制链接]
 楼主| keer_zu 发表于 2025-2-26 00:25 | 显示全部楼层 |阅读模式

Odrive 电机控制代码 update 函数解析

update 函数概述

update 函数是 Odrive 电机控制代码中的核心函数之一,负责在每个控制循环中更新电机的状态和控制参数。该函数根据当前配置和输入信号计算并输出电机所需的转矩,同时处理错误和特殊情况。

函数逻辑解析

1. 获取估计值

std::optional<float> pos_estimate_linear = pos_estimate_linear_src_.present();
std::optional<float> pos_estimate_circular = pos_estimate_circular_src_.present();
std::optional<float> pos_wrap = pos_wrap_src_.present();
std::optional<float> vel_estimate = vel_estimate_src_.present();

std::optional<float> anticogging_pos_estimate = axis_->encoder_.pos_estimate_.present();
std::optional<float> anticogging_vel_estimate = axis_->encoder_.vel_estimate_.present();
  • 获取位置、速度和反齿槽位置估计值。
  • 处理线性、圆形位置估计和位置环绕值。

2. 处理步进方向激活情况

if (axis_->step_dir_active_) {
    // 处理步进方向激活情况
}
  • 如果步进方向被激活,根据配置更新输入位置。

3. 反齿槽校准

if (config_.anticogging.calib_anticogging) {
    // 进行反齿槽校准
}
  • 如果启用了反齿槽校准,则根据当前位置和速度进行校准。
 楼主| keer_zu 发表于 2025-2-26 00:26 | 显示全部楼层
  • 如果启用了反齿槽校准,则根据当前位置和速度进行校准。

4. 更新输入值

switch (config_.input_mode) {
    // 根据输入模式更新位置、速度和转矩设定点
}
  • 根据配置的输入模式(如直通、速度斜坡、转矩斜坡等),更新位置、速度和转矩设定点。

5. 限制设定点

if(config_.enable_vel_limit) {
    vel_setpoint_ = std::clamp(vel_setpoint_, -config_.vel_limit, config_.vel_limit);
}

torque_setpoint_ = std::clamp(torque_setpoint_, -Tlim, Tlim);
  • 限制速度设定点以防止超过配置的速度限制。
  • 限制转矩设定点以防止超过电机的最大可用转矩。
 楼主| keer_zu 发表于 2025-2-26 00:29 | 显示全部楼层

6. 位置控制

if (config_.control_mode >= CONTROL_MODE_POSITION_CONTROL) {
    // 计算位置误差并更新速度设定点
}
  • 如果控制模式至少为位置控制,则计算位置误差并更新速度设定点。

7. 速度控制

if (config_.control_mode >= CONTROL_MODE_VELOCITY_CONTROL) {
    // 计算速度误差并更新转矩
}
  • 如果控制模式至少为速度控制,则计算速度误差并更新转矩。

8. 反齿槽补偿

if (anticogging_valid_ && config_.anticogging.anticogging_enabled) {
    // 应用反齿槽补偿
}
  • 如果反齿槽校准有效且启用,则应用反齿槽补偿。

9. 转矩限制和积分器更新

// 转矩限制

if (config_.control_mode < CONTROL_MODE_VELOCITY_CONTROL) {
    vel_integrator_torque_ = 0.0f;
} else {
    // 更新速度积分器
}
  • 对转矩进行限制以防止超过限制。
  • 根据控制模式更新速度积分器。
 楼主| keer_zu 发表于 2025-2-26 00:30 | 显示全部楼层

10. 功率计算和自旋检测

// 计算机械功率和电气功率

if (mechanical_power_ < config_.spinout_mechanical_power_threshold && electrical_power_ > config_.spinout_electrical_power_threshold) {
    set_error(ERROR_SPINOUT_DETECTED);
    return false;
}
  • 计算机械功率和电气功率。
  • 检测自旋情况,如果检测到自旋则设置错误。

11. 输出转矩并清除无效估计错误

torque_output_ = torque;

error_ &= ~ERROR_INVALID_ESTIMATE;
return true;
  • 输出最终计算得到的转矩。
  • 清除无效估计错误标志。

总结

update 函数通过一系列步骤,包括获取估计值、处理步进方向激活情况、反齿槽校准、更新输入值、限制设定点、位置控制、速度控制、反齿槽补偿、转矩限制和积分器更新、功率计算和自旋检测,最终输出电机的转矩设定点。该函数是 Odrive 电机控制逻辑的核心,确保了电机能够根据输入信号和配置稳定运行。

 楼主| keer_zu 发表于 2025-2-26 00:32 | 显示全部楼层
代码:

ctrl.zip

4.45 KB, 下载次数: 1

旧时光放映机 发表于 2025-3-18 18:11 | 显示全部楼层
位置控制模式下,如何计算位置误差并更新速度设定点
暖心小太阳 发表于 2025-4-17 10:32 | 显示全部楼层
`update` 函数确实很重要,它确保电机在每个控制周期内都能得到正确的指令。获取位置和速度估计值是控制算法的基础。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1478

主题

12917

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部