5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 1040|回复: 0
打印 上一主题 下一主题

APM系统介绍2

[复制链接]
跳转到指定楼层
楼主
发表于 2017-8-30 22:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接下来从第2条语句到第6条,除了第三条语句是计算主程序执行一次的时间外(可以认为是CPU使用率),其他的都是做标记用。
接下来的程序是执行fast_loop()、medium_loop()、one_second_loop()以及20秒一次的性能监视。此外,在medium_loop( )中还会调用slow_loop( )(执行周期1/3s)。其他语句是辅助作用。飞控系统的主程序执行的就是这几个子程序。以下一一说明功能。
(1) fast_loop( ):这是飞控系统控制的控制核心之一。执行频率50Hz。程序如下:
void fast_loop()
{
// This is the fast loop – we wantit to execute at 50Hz if possible
//—————————————————————–
if (delta_ms_fast_loop >G_Dt_max)
G_Dt_max = delta_ms_fast_loop;
// Read radio ////读取遥控信号
// ———-
read_radio(); //APM_RC.InputCh(CH_ROLL)->ch1_temp-> g.channel_roll.set_pwm(ch1_temp)(即转为control_in)
//油门还有control_failsafe(g.channel_throttle.radio_in);
//g.channel_throttle.servo_out= g.channel_throttle.control_in;
//airspeed_nudge,throttle_nudge,
// check for loss of control signalfailsafe condition ////检查丢失控制信号故障安
//————————————
check_short_failsafe(); //关于failsafe和ch3_failsafe的处理
// Read Airspeed ///读取空速
// ————-
if (g.airspeed_enabled == true && HIL_MODE != HIL_MODE_ATTITUDE)
{ //使能空速计真实飞行时为1
read_airspeed(); //读取空速,并calc_airspeed_errors();
}
else if (g.airspeed_enabled == true&& HIL_MODE == HIL_MODE_ATTITUDE)
{ //真实飞行时为0
calc_airspeed_errors();
}
#if HIL_MODE ==HIL_MODE_SENSORS //飞行模式时为0
// update hil before dcm update
hil.update();
#endif
dcm.update_DCM(G_Dt); ////更新DCM
// uses the yaw from the DCM to givemore accurate turns ///使用从DCM获得的偏航数据,进行更精确的转弯
calc_bearing_error(); //计算得出bearing_error
# if HIL_MODE ==HIL_MODE_DISABLED //飞行模式时为1
if (g.log_bitmask &MASK_LOG_ATTITUDE_FAST)
Log_Write_Attitude((int)dcm.roll_sensor,(int)dcm.pitch_sensor, (uint16_t)dcm.yaw_sensor);
if (g.log_bitmask &MASK_LOG_RAW)
Log_Write_Raw();
#endif
// inertial navigation ////惯性导航
// ——————
#if INERTIAL_NAVIGATION ==ENABLED //这个不执行。本程序的捷联惯性导航算法只能计算飞机飞行姿态,无法结算三维位置,,所以,不能实施完全的惯性导航。或者程序作者正在进行相关试验,或者程序作者的惯性导航不是这个意思,仅是调试时调用这个。
// TODO: implement inertial navfunction //实施惯性导航功能
inertialNavigation();
#endif
// custom code/exceptions for flightmodes ///飞行模式的自定义代码/异常
//—————————————
update_current_flight_mode(); // 导航级PID
// apply desired roll, pitch and yawto the plane ////控制飞机的副翼,升降,方向 if (control_mode > MANUAL) stabilize(); // 控制级PID //write out theservo PWM values
set_servos_4();
// XXX is it appropriate to be doingthe comms below on the fast loop? ////现在适合做快速环路上的COMMS吗?
#if HIL_MODE !=HIL_MODE_DISABLED && HIL_PORT != GCS_PORT //飞行模式时为0
// kick the HIL to processincoming sensor packets //使用HIL处理传入的传感器数据包
hil.update();
#if HIL_PROTOCOL == HIL_PROTOCOL_MAVLINK
hil.data_stream_send(45,1000);
#else
hil.send_message(MSG_SERVO_OUT);
#endif
#elif HIL_PROTOCOL ==HIL_PROTOCOL_MAVLINK && HIL_MODE == HIL_MODE_DISABLED &&HIL_PORT == 0 //飞行模式时为1
// Case for hil object onport 0 just for mission planning //HIL端口的对象,只是用来进行任务规划
hil.update();
hil.data_stream_send(45,1000);
#endif
// kick the GCS to process uplinkdata ////让GCS处理上行数据
gcs.update();
#if GCS_PROTOCOL ==GCS_PROTOCOL_MAVLINK //飞行模式时为
gcs.data_stream_send(45,1000);
#endif
// XXX this should be absorbed intothe above,
// or be a “GCS fast loop”interface
}
这是从我看APM飞控的程序中复制的fast_loop程序。语句后含有我以前对程序的解释说明。在此不再详细说明。
(2) medium_loop( ),这是飞控系统的另外一个核心,执行频率10Hz。用于执行GPS数据和磁力计数据的更新、根据GPS数据进行导航计算、更新高度信息和命令、向地面发送无线数传数据、控制slow_loop( )执行和其他。其中对导航起很重要作用的导航航向的计算就再medium_loop( )中执行。
(3) slow_loop( ),执行周期是1/3s。主要执行长时间故障安全检查、读取三段开关、读取舵面正方向及混控开关、读取地面站指令等操作。
(4) one_second_loop(),执行周期1s。主要执行记录电池电压、发送CPU使用时间等操作。
关于x-plane模拟
关于APM飞控使用x-plane进行模拟飞行的原理,其实是利用x-plane的网络对战功能。因为只有网络对战的时候,x-plane才会向外界输出飞机当前经纬度、飞机姿态、空速等数据信息。APM飞控进行x-plane模拟时需要设置网络端口和进行输出数据设定也证实了这点。X-plane可以模拟飞机型号、飞机参数,飞行环境等对飞机飞行的影响。从飞机型号就可以选择从战斗机、民航机到航模等各种不同飞机的选择。可以模拟飞机燃油、重心、重量的变化。最重要的,它可以模拟外界环境施对飞行的影响。可以设定高空、中空、低空的风速和风向。可以设定海平面气压和温度。此外x-plane还可录下飞行时的数据,可以供以后从各个角度观察飞行情况,察看飞行数据。
在x-plane上模拟其实就是让APM系统通过网络端口接收飞行数据,飞控根据飞行数据解算出需要的控制操作,再输入x-plane控制飞机。由于x-plane提供了非常接近真实飞机的模拟,所以x-plane模拟飞行用于飞控系统的调试时非常省时省力。


您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

快速回复 返回顶部 返回列表