APM源码分析之 姿态控制
来源:互联网 发布:文档查看软件 编辑:程序博客网 时间:2024/04/28 22:13
姿态数据:
AP_AHRS_DCM ahrs(ins, barometer, gps) 读取处理传感器后的姿态数据
AP_InertialSensor_MPU6000 ins惯性传感器陀螺仪
定时调用_poll_dataà _read_data_transaction 函数,通过spi读取加速度
通过 update 函数 填充 AP_InertialSensor::_accel和AP_InertialSensor::_gyro 变量
罗盘数据(指向(VFR_HUD中的heading((ahrs.yaw_sensor / 100) % 360))):
AP_Compass_HMC5843::read()->_field(修正值COMPASS_OFS 在此叠加)
Compass::calculate_heading 计算方向
->AP_AHRS_DCM::update::drift_correction(delta_t); yaw_error_compass()
-> _body_dcm_matrix= _dcm_matrix; _body_dcm_matrix.rotateXYinv(_trim)
-> _body_dcm_matrix.to_euler(&roll,&pitch, &yaw)
-> yaw_sensor = degrees(yaw) * 100对象:
AC_AttitudeControlattitude_control 姿态控制
AP_MotorsQuadmotors(g.rc_1, g.rc_2, g.rc_3, g.rc_4) 4轴飞行器控制输入
rc1:roll翻滚 rc2:pitch 俯仰 rc3: throttle 油门 rc4: yaw偏航
飞行控制(以定高模式为例):
代码执行顺序
fast_loop():
rate_controller_run 设置控制量到输出变量
AP_Motors::set_roll(rate_bf_to_motor_roll(_rate_bf_target.x))
rate_bf_to_motor_roll算法pid,计算控制量
AP_Motors ::set_pitch(rate_bf_to_motor_pitch(_rate_bf_target.y))
rate_bf_to_motor_pitch算法pid,计算控制量
AP_Motors ::set_yaw(rate_bf_to_motor_yaw(_rate_bf_target.z))
rate_bf_to_motor_yaw 算法pid,计算控制量
set_servos_4 把输出变量,输出到io (pwm 电机执行控制)
update_flight_mode
stabilize_run 稳定模式
update_simple_mode 发现有新的控制指令,执行一次简单模式,坐标转换(有头模式坐标)
get_pilot_desired_lean_angles根据输入量(指令 翻滚和俯仰)计算输出量(控制 翻滚和俯仰)
输出roll_out 和 pitch_out (value =control_in* ANGLE_MAX /4500 )
get_pilot_desired_yaw_rate根据输入量(指令 偏航)计算输出量(控制偏航)
get_pilot_desired_throttle返回油门控制量
roll_angle_ef= roll_out pitch_angle_ef = pitch_out
angle_ef_roll_pitch_rate_ef_yaw_smooth
update_ef_yaw_angle_and_error 计算偏航量
_angle_ef_error.z= wrap_180_cd(_angle_ef_target.z -_ahrs.yaw_sensor)
_angle_ef_target.z= angle_ef_error.z + _ahrs.yaw_sensor
_angle_ef_target.z+= yaw_rate_ef * _dt
frame_conversion_ef_to_bf 坐标转换,没明白怎么回事,需要细看
update_rate_bf_targets 又他妈的坐标转换
set_throttle_out油门控制输出
althold_run 定高模式
前面和stabilize模式一样
target_climb_rate= get_pilot_desired_climb_rate 根据油门量获取期望的爬升率
attitude_control.angle_ef_roll_pitch_rate_ef_yaw_smooth同稳定模式
pos_control.set_alt_target_from_climb_rate(target_climb_rate,G_Dt)
_pos_target.z += target_climb_rate * G_Dt 设置当前定高高度
pos_control.update_z_controller()具体见油门部分文档数据流图:
以roll 为例,分析rate_bf_to_motor_roll (rate_target_cds)内部数据,已经pid 调节的过程
关于参数rate_target_cds,它其实是_rate_bf_target.x,也即是_angle_bf_error*_p_angle_roll,本来是目标角度与实际角度的差值,在这里变成了目标角速度,也就是说这里的pid 调节实际上是以角速度为目标的。
current_rate = (_ahrs.get_gyro().x * AC_ATTITUDE_CONTROL_DEGX100) 获取当前横滚的角速度,基本上是陀螺仪的原始数据了
dd 数据实例1,:解锁后起飞后(不实际飞起来),不动遥控的roll,保持_angle_ef_target.x 为0,人为将机体,倾斜,此时pid控制输出应该是以机体保持水平为目标的
数据实例2:将PID参数设置为默认值,机体飞行将摇摇晃晃,不动遥控的roll,保持_angle_ef_target.x 为0
飞行姿态控制器结构(AC_AttitudeControl)
作为飞控的控制核心部分,唯一的目的是使飞机稳定的保持目标姿态,吃透了这部分代码,基本上就掌握了飞控的最核心部分,虽然代码很少,但确实很重要,所有的飞行模式都是以它为基础的
- APM源码分析之 姿态控制
- APM源码分析之 主流程
- APM源码分析之 油门跟踪
- 多旋翼姿态控制mc_att_control源码简单分析-位置控制
- Pixhawk之姿态控制篇(1)_源码算法分析(超级有料)
- Pixhawk之姿态控制篇(1)_源码算法分析
- PX4原生固件教程---mc_att_control源码分析(姿态控制)
- Pixhawk之姿态控制
- Pixhawk之姿态解算篇(3)_源码姿态解算算法分析
- Pixhawk之姿态解算篇(3)_源码姿态解算算法分析
- Pixhawk之姿态解算篇(3)_源码姿态解算算法分析
- PIXHAWK源码分析之二—Hello Sky(PIXHAWK读取姿态数据并且显示)
- px4源码学习四--固定翼姿态控制模块阅读
- Pixhawk之姿态控制篇(2)_控制策略
- 从APM源码分析GPS、气压计惯导融合
- LDD3源码分析之访问控制
- LDD3源码分析之访问控制
- LDD3源码分析之访问控制
- linux 学习
- Codeforces Round #287 (Div. 2) D. The Maths Lecture 数位dp
- node在Fedora 22系统下开发环境搭建
- 【日文硬盘版】Muv-luv AF+Muv-Luv ATE(带全CG存档+免安装,卸载补丁+打开存档文件夹补丁+日文攻略)
- 安卓MP3播放器开发实例(1)之音乐列表界面
- APM源码分析之 姿态控制
- 动态按钮Button的实现
- PHP:选择排序法
- 阅读了Steve Yegge的文章。其中有一篇叫“Practicing Programming”(练习编程),写成于2005年
- POJ 2579 && HDU 1218 Blurred Vision(水~)
- 团中央第一书记与超级表格陈坤极玩自拍
- 【我的面经】说说简历的细节——软件开发岗位
- first bad version
- Vim的编码选项