无人机电机的代码解析-ardupilot飞控

AP_Motors_Class.cpp 代码详解:

  1. 构造函数关键部分
AP_Motors::AP_Motors(uint16_t speed_hz) :
    _speed_hz(speed_hz),
    _throttle_filter(),
    _throttle_slew(),
    _throttle_slew_filter(),
    _spool_desired(DesiredSpoolState::SHUT_DOWN),
    _spool_state(SpoolState::SHUT_DOWN)
{
    _singleton = this;  // 设置单例实例
    _throttle_filter.set_cutoff_frequency(0.0f); // 初始化油门滤波器
    _throttle_slew_filter.set_cutoff_frequency(AP_MOTORS_SLEW_FILTER_CUTOFF); // 50Hz滤波
}
  • 初始化电机控制频率和滤波器
  • 采用单例模式确保全局唯一实例
  • 默认状态为关闭(SHUT_DOWN)
  1. PWM输出核心方法
void AP_Motors::rc_write(uint8_t chan, uint16_t pwm) {
    SRV_Channel::Function function = SRV_Channels::get_motor_function(chan);
    if ((1U<<chan) & _motor_pwm_scaled.mask) {
        SRV_Channels::set_output_scaled(function, float(pwm) - _motor_pwm_scaled.offset);
    } else {
        SRV_Channels::set_output_pwm(function, pwm); // 原始PWM输出
    }
}
  • 支持两种输出模式:原始PWM和缩放输出
  • 通过motor_pwm_scaled.mask判断使用哪种模式
  • 与SRV_Channel系统集成
  1. 电机状态管理
void AP_Motors::armed(bool arm) {
    if (_armed != arm) {
        _armed = arm;
        AP_Notify::flags.armed = arm; // 更新通知系统
        if (!arm) {
            save_params_on_disarm(); // 解锁时保存参数
        }
    }
}
  • 控制电机解锁状态
  • 状态变化时触发通知系统
  • 解锁时自动保存参数
  1. PWM类型设置(代码片段)
case PWMType::DSHOT600:
    hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_DSHOT600);
    break;
case PWMType::PWM_RANGE:
    _motor_pwm_scaled.offset = 1000.0;
    SRV_Channels::set_range(SRV_Channels::get_motor_function(i), 1000);
    break;
  • 支持多种数字协议(DSHOT150-1200)
  • PWM_RANGE模式将1000-2000映射为0-1000
  • 通过HAL层抽象实现跨平台支持
  1. 安全限制检查
void AP_Motors::set_limit_flag_pitch_roll_yaw(bool flag) {
    limit.roll = flag;  // 横滚限位
    limit.pitch = flag; // 俯仰限位 
    limit.yaw = flag;   // 偏航限位
}
  • 各轴独立限位保护
  • 在输出计算前进行检查
  • 防止控制量超出安全范围
  1. 电机测试功能
bool AP_Motors::output_test_seq(uint8_t motor_seq, int16_t pwm) {
    if (armed() && _interlock) {
        _output_test_seq(motor_seq, pwm);
        return true;
    }
    output_min(); // 安全保护
    return false;
}
  • 需在解锁状态才能测试
  • 有硬件互锁保护
  • 测试失败时输出最小值保障安全

该实现展示了ArduPilot电机控制系统的关键设计:
7. 硬件抽象层(HAL)隔离平台差异
8. 状态机管理电机工作流程
9. 多种PWM协议统一接口
10. 多层次安全保护机制
11. 良好的扩展性支持新型电机

无人机起飞和平衡控制原理详解:

  1. 控制系统架构
  • 三级闭环控制结构:
    ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
    │ 姿态控制器 │───▶│ 角速率控制器 │───▶│ 电机控制 │
    └─────────────┘ └─────────────┘ └─────────────┘
    (外环/角度环) (中环/角速率环) (内环/执行器)
  1. 起飞过程
  • 解锁流程:
    AP_Motors::armed(true) → 电机进入怠速状态(SpoolState::GROUND_IDLE)
  • 油门提升:
    遥控器油门信号 → AP_Motors::set_radio_passthrough() → 电机转速提升
  • 缓启动:
    _throttle_slew_filter限制油门变化率,防止瞬时大油门
  1. 姿态稳定机制
  • 传感器反馈:
    AHRS(姿态参考系统)提供当前欧拉角(roll,pitch,yaw)和角速率
  • 姿态误差计算:
    AC_AttitudeControl::thrust_heading_rotation_angles()计算目标与实际姿态差
  • PID控制:
    ├─ 角度环(P控制):产生角速率目标值
    │ 例:roll_rate_target = _p_angle_roll.kP() * roll_error

    └─ 角速率环(PID控制):产生电机控制量
    │ 使用PID.h中的算法:
    │ output = error * kP + ∫error*dt * kI + d(error)/dt * kD
    └─ 通过get_rate_roll_pid()等函数实现
  1. 电机混控
  • 控制量分配:
    AP_Motors::rc_write()将控制量转换为PWM信号
  • 混控算法:
    根据机型(四轴/六轴等)将滚转、俯仰、偏航控制量分配到各电机
  • 限幅保护:
    AP_Motors::set_limit_flag_pitch_roll_yaw()防止超出物理限制
  1. 抗扰动机制
  • 积分抗饱和:PID中的积分项(ki)有限幅
  • 低通滤波:_throttle_filter滤除高频噪声
  • 前馈补偿:_rate_bf_ff_enabled时加入角速率前馈
  1. 典型控制流程示例
  1. 传感器检测到无人机向右倾斜(roll+)
  2. 姿态控制器计算滚转误差:roll_error = target_roll - current_roll
  3. 角速率控制器输出:roll_rate = PID(roll_error)
  4. 电机混控:左侧电机增速,右侧电机减速
  5. 产生恢复力矩使无人机回平
  1. 关键参数
  • 角度环P值(ANG_RLL_P, ANG_PIT_P, ANG_YAW_P)
  • 角速率环PID值(RAT_RLL_P, RAT_RLL_I, RAT_RLL_D)
  • 最大角加速度(ACCEL_R_MAX, ACCEL_P_MAX)
  • 电机怠速值(MOT_SPIN_ARMED)

这套控制系统在ArduPilot中实现约400Hz的闭环控制频率,确保飞行稳定性。

无人机电机混控系统详解:

  1. 控制量转换流程
  • 输入:来自姿态控制器的三轴控制量(roll, pitch, yaw) + 油门量
  • 归一化:将控制量转换为-1~+1范围
  • 混控矩阵:根据机型配置将控制量分配到各电机
  • 输出:PWM信号(1000~2000μs)
  1. 四轴X型混控示例
    电机编号布局:
  前
1   2
  X  
3   4
  后

混控公式:

motor1 = throttle + roll*0.707 - pitch*0.707 + yaw
motor2 = throttle - roll*0.707 - pitch*0.707 - yaw  
motor3 = throttle - roll*0.707 + pitch*0.707 + yaw
motor4 = throttle + roll*0.707 + pitch*0.707 - yaw

(其中0.707是sin(45°),实现滚转和俯仰的耦合分配)

  1. 六轴混控示例
    电机编号布局:
   前
1     2
   X  
3     4
  X  
5     6
   后

混控公式增加两个电机,分配系数调整:

motor1 = throttle + roll*0.5 - pitch*0.866 + yaw
motor2 = throttle - roll*0.5 - pitch*0.866 - yaw
motor3 = throttle - roll*1.0 + pitch*0.0 + yaw  
motor4 = throttle + roll*1.0 + pitch*0.0 - yaw
motor5 = throttle + roll*0.5 + pitch*0.866 + yaw
motor6 = throttle - roll*0.5 + pitch*0.866 - yaw

(0.866=sin(60°),实现六轴的力矩平衡)

  1. PWM信号生成关键代码
  • rc_write()函数处理:
void AP_Motors::rc_write(uint8_t chan, uint16_t pwm) {
    SRV_Channel::Function function = SRV_Channels::get_motor_function(chan);
    SRV_Channels::set_output_pwm(function, pwm); // 实际输出PWM
}
  • 信号限幅保护:
pwm = constrain_int16(pwm, _pwm_min, _pwm_max); // 通常1000-2000μs
  1. 混控特性
  • 动态调整:根据电机数量自动计算分配系数
  • 故障保护:单个电机失效时自动降权
  • 转向补偿:正反桨配置自动反转yaw控制符号
  • 怠速处理:确保停转后能可靠重启(_spin_min_ratio)
  1. 实际飞行中的混控过程示例:
  1. 需要向右滚转时:
    • 姿态控制器输出正roll值
    • 左侧电机增速(1,4号),右侧电机减速(2,3号)
    • 产生向右的滚转力矩
  2. 需要前进时:
    • 姿态控制器输出负pitch值
    • 后方电机增速(3,4号),前方电机减速(1,2号)
    • 产生向前的俯仰力矩

关键参数:

  • MOT_SLEW_MAX:电机转速变化率限制(防止瞬时大电流)
  • MOT_SPIN_ARMED:怠速PWM值(确保电机随时可响应)
  • MOT_YAW_HEADROOM:偏航控制余量(防止饱和)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值