生活随笔
收集整理的這篇文章主要介紹了
Px4源码框架结构图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
此篇blog的目的是對px4工程有一個整體認識,對各個信號的流向有個了解,以及控制算法采用的控制框架。
PX4自動駕駛儀軟件可分為三大部分:實時操作系統、中間件和飛行控制棧。
1.NuttX實時操作系統
提供POSIX-style的用戶操作環境(如printf(), pthreads,/dev/ttyS1,open(),write(),poll(),ioctl()),進行底層的任務調度。
2.PX4中間件
PX4中間件運行于操作系統之上,提供設備驅動和一個微對象請求代理(micro object request broker,uORB)用于駕駛儀上運行的單個任務之間的異步通信。Px4被3DR開源后,整個代碼結構被?改,原先的系統被摒棄,進而采用Nuttx,但是核心思想沒變-為了簡化開發而采用犧牲部分效率的消息傳遞機制,這是Px4 與ArduPilot 最本質的差別。
3.PX4飛行控制棧
飛行控制棧可以使用PX4的控制軟件棧,也可以使用其他的控制軟件,如APM:Plane、APM:Copter,但必須運行于PX4中間件之上。
此部分又可分為
決策導航部分:根據飛行器自身安全狀態和接收到的命令,決定工作于什么模式,下一步應該怎么做。
位置姿態估計部分:根據傳感器得到自身的位置和姿態信息,此部分算法含金量最高,算法也相當多。
位置姿態控制部分:根據期望位置和姿態設計控制結構,盡可能快、穩的達到期望位置和姿態。
控制器輸出部分:mixer和執行器,pwm限幅。
算法在Firmware/src/modules,驅動在Firmware/src/drivers
px4原生固件模塊列表:
系統命令程序
mavlink?–通過串口發送和接收mavlink信息
sdlog2?–保存系統日志/飛行數據到SD卡
tests?–測試系統中的測試程序
top?–列出當前的進程和CPU負載
uORB?– 微對象請求代理器-分發其他應用程序之間的信息
驅動
mkblctrl–blctrl電子模塊驅動
esc_calib?–ESC的校準工具
fmu?–FMU引腳輸入輸出定義
gpio_led?–GPIO LED驅動
gps?–GPS接收器驅動
pwm?–PWM的更新速率命令
sensors?–傳感器應用
px4io?–px4io驅動
uavcan?–uavcan驅動
飛行控制的程序
飛行安全和導航
commander?–主要飛行安全狀態機
navigator?–任務,失效保護和RTL導航儀
估計姿態和位置
attitude_estimator_ekf?–基于EKF的姿態估計
ekf_att_pos_estimator?–基于EKF的姿態和位置估計
position_estimator_inav–慣性導航的位置估計
multirotor姿態和位置控制器
mc_att_control–multirotor姿態控制器
mc_pos_control?–multirotor位置控制器
fixedwing姿態和位置控制器
fw_att_control?–固定翼飛機的姿態控制
fw_pos_control_l1?–固定翼位置控制器
垂直起降姿態控制器
vtol_att_control?–垂直起降姿態控制器
3.1決策
3.1.1 任務決策。以任務為導向,任務決策主要決定多旋翼下一步“去哪兒”,進一步,需要規劃路徑,使得整個過程能滿足諸如:飛向航路點并沿航線飛,以及飛向航路點并避障等要求。
3.1.2?健康管理和失效保護。以安全為導向, 失效保護主要決定多旋翼下一步“去哪兒”。多旋翼飛行器在飛行前或飛行中,可能會發生通信故障、傳感器失效和動力系統異常等,這些意外會直接導致控制任務無法完成。這一部分包括安全問題的介紹、機載設備的健康評估、機載設備的健康監測、失效后的保護建議。
傳感器校正在commander里面
對應的程序在Firmware/src/modules/commander和Firmware/src/modules/navigator
完成任務模式切換,同時考慮電池電量、GPS等傳感器是否正常工作等信息。
[cpp]?view plaincopy
commander????orb_publish(ORB_ID(home_position),?homePub,?&home);??orb_publish(ORB_ID(offboard_mission),?mission_pub,?&mission);??orb_publish(ORB_ID(vehicle_control_mode),?control_mode_pub,?&control_mode);??orb_publish(ORB_ID(vehicle_status),?status_pub,?&status);??orb_publish(ORB_ID(actuator_armed),?armed_pub,?&armed);??orb_publish(ORB_ID(vehicle_command_ack),?command_ack_pub,?&command_ack);????orb_copy(ORB_ID(vehicle_status),?state_sub,?&state);??orb_copy(ORB_ID(parameter_update),?param_changed_sub,¶m_update;??orb_copy(ORB_ID(manual_control_setpoint),?sp_man_sub,?&sp_man);??orb_copy(ORB_ID(offboard_control_mode),?offboard_control_mode_sub,?&offboard_control_mode);??orb_copy(ORB_ID(telemetry_status),?telemetry_subs[i],?&telemetry);??orb_copy(ORB_ID(sensor_combined),?sensor_sub,?&sensors);??orb_copy(ORB_ID(differential_pressure),?diff_pres_sub,?&diff_pres);??orb_copy(ORB_ID(system_power),?system_power_sub,?&system_power);??orb_copy(ORB_ID(safety),?safety_sub,?&safety);??orb_copy(ORB_ID(vtol_vehicle_status),?vtol_vehicle_status_sub,?&vtol_status);??orb_copy(ORB_ID(vehicle_global_position),?global_position_sub,?&gpos);??orb_copy(ORB_ID(vehicle_local_position),?local_position_sub,?&local_position);??orb_copy(ORB_ID(vehicle_attitude),?attitude_sub,?&attitude);??orb_copy(ORB_ID(vehicle_land_detected),?land_detector_sub,?&land_detector);??orb_copy(ORB_ID(battery_status),?battery_sub,?&battery);??orb_copy(ORB_ID_VEHICLE_ATTITUDE_CONTROLS,?actuator_controls_sub,?&actuator_controls);??orb_copy(ORB_ID(subsystem_info),?subsys_sub,?&info);??orb_copy(ORB_ID(position_setpoint_triplet),?pos_sp_triplet_sub,?&pos_sp_triplet);??orb_copy(ORB_ID(vehicle_gps_position),?gps_sub,?&gps_position);??orb_copy(ORB_ID(mission_result),?mission_result_sub,?&mission_result);??orb_copy(ORB_ID(geofence_result),?geofence_result_sub,?&geofence_result);??orb_copy(ORB_ID(vehicle_command),?cmd_sub,?&cmd);??
[cpp]?view plaincopy
navigator????orb_publish(ORB_ID(position_setpoint_triplet),?_pos_sp_triplet_pub,?&_pos_sp_triplet);??orb_publish(ORB_ID(mission_result),?_mission_result_pub,?&_mission_result);??orb_publish(ORB_ID(geofence_result),?_geofence_result_pub,?&_geofence_result);??orb_publish(ORB_ID(vehicle_attitude_setpoint),?_att_sp_pub,?&_att_sp);????orb_copy(ORB_ID(vehicle_global_position),?_global_pos_sub,?&_global_pos);??orb_copy(ORB_ID(vehicle_gps_position),?_gps_pos_sub,?&_gps_pos);??orb_copy(ORB_ID(sensor_combined),?_sensor_combined_sub,?&_sensor_combined);??orb_copy(ORB_ID(home_position),?_home_pos_sub,?&_home_pos);??orb_copy(ORB_ID(navigation_capabilities),?_capabilities_sub,?&_nav_caps);??orb_copy(ORB_ID(vehicle_status),?_vstatus_sub,?&_vstatus)??orb_copy(ORB_ID(vehicle_control_mode),?_control_mode_sub,?&_control_mode)???orb_copy(ORB_ID(parameter_update),?_param_update_sub,?¶m_update);??orb_copy(ORB_ID(vehicle_command),?_vehicle_command_sub,?&cmd);??
3.2位置估計和姿態估計
此部分需要大量理論知識,暫時還比較欠缺。
sensors是對陀螺儀、加速度計地磁計的一個處理
[cpp]?view plaincopy
sensors????orb_publish(ORB_ID(airspeed),?_airspeed_pub,?&_airspeed);??orb_publish(ORB_ID(differential_pressure),?_diff_pres_pub,?&_diff_pres);??orb_publish(ORB_ID(battery_status),?_battery_pub,?&_battery_status);??orb_publish(ORB_ID(rc_channels),?_rc_pub,?&_rc);??orb_publish(ORB_ID(manual_control_setpoint),?_manual_control_pub,?&manual);??orb_publish(ORB_ID(actuator_controls_3),?_actuator_group_3_pub,?&actuator_group_3);??orb_publish(ORB_ID(sensor_combined),?_sensor_pub,?&raw);????orb_copy(ORB_ID(sensor_accel),?_accel_sub[i],?&accel_report);??orb_copy(ORB_ID(sensor_gyro),?_gyro_sub[i],?&gyro_report);??orb_copy(ORB_ID(sensor_mag),?_mag_sub[i],?&mag_report);??orb_copy(ORB_ID(sensor_baro),?_baro_sub[i],?&_barometer);??orb_copy(ORB_ID(differential_pressure),?_diff_pres_sub,?&_diff_pres);??orb_copy(ORB_ID(vehicle_control_mode),?_vcontrol_mode_sub,?&vcontrol_mode);??orb_copy(ORB_ID(parameter_update),?_params_sub,?&update);??orb_copy(ORB_ID(rc_parameter_map),?_rc_parameter_map_sub,?&_rc_parameter_map);??orb_copy(ORB_ID(input_rc),?_rc_sub,?&rc_input);??
[cpp]?view plaincopy
ardrone_interface??orb_publish(ORB_ID(actuator_outputs),?pub,?&outputs);??orb_copy(ORB_ID_VEHICLE_ATTITUDE_CONTROLS,?actuator_controls_sub,?&actuator_controls);??#define?ORB_ID_VEHICLE_ATTITUDE_CONTROLS????ORB_ID(actuator_controls_0)??orb_copy(ORB_ID(actuator_armed),?armed_sub,?&armed);????batt_smbus??orb_publish(_batt_orb_id,?_batt_topic,?&new_report);??orb_copy(ORB_ID(battery_status),?sub,?&status)????bma180??orb_publish(ORB_ID(sensor_accel),?_accel_topic,?&report);????GPS??orb_publish(ORB_ID(vehicle_gps_position),?_report_gps_pos_pub,?&_report_gps_pos);??orb_publish(ORB_ID(satellite_info),?_report_sat_info_pub,?_p_report_sat_info);????hmc5883??orb_publish(ORB_ID(sensor_mag),?_mag_topic,?&new_report);????hott??orb_publish(ORB_ID(esc_status),?_esc_pub,?&esc);??orb_copy(ORB_ID(sensor_combined),?_sensor_sub,?&raw);??orb_copy(ORB_ID(battery_status),?_battery_sub,?&battery);??orb_copy(ORB_ID(airspeed),?_airspeed_sub,?&airspeed);??orb_copy(ORB_ID(esc_status),?_esc_sub,?&esc);????l3gd20??orb_publish(ORB_ID(sensor_gyro),?_gyro_topic,?&report);????lsm303d??orb_publish(ORB_ID(sensor_accel),?_accel_topic,?&accel_report);??orb_publish(ORB_ID(sensor_mag),?_mag->_mag_topic,?&mag_report);????mpu6000??orb_publish(ORB_ID(sensor_accel),?_accel_topic,?&arb);??orb_publish(ORB_ID(sensor_gyro),?_gyro->_gyro_topic,?&grb);????mpu9250??orb_publish(ORB_ID(sensor_accel),?_accel_topic,?&arb);??orb_publish(ORB_ID(sensor_gyro),?_gyro->_gyro_topic,?&grb);????ms5611??orb_publish(ORB_ID(sensor_baro),?_baro_topic,?&report);????pwm_out_sim??orb_publish(ORB_ID(actuator_outputs),?_outputs_pub,?&outputs);??orb_copy(_control_topics[i],?_control_subs[i],?&_controls[i]);??actuator_controls_s?_controls[actuator_controls_s::NUM_ACTUATOR_CONTROL_GROUPS];??orb_copy(ORB_ID(actuator_armed),?_armed_sub,?&aa);????px4flow??orb_publish(ORB_ID(optical_flow),?_px4flow_topic,?&report);??orb_publish(ORB_ID(distance_sensor),?_distance_sensor_topic,?&distance_report);??orb_publish(ORB_ID(subsystem_info),?pub,?&info);????px4fmu??orb_publish(ORB_ID(actuator_outputs),?_outputs_pub,?&outputs);??orb_publish(ORB_ID(safety),?_to_safety,?&safety);??orb_publish(ORB_ID(input_rc),?_to_input_rc,?&_rc_in);??orb_copy(_control_topics[i],?_control_subs[i],?&_controls[i]);??orb_copy(ORB_ID(actuator_armed),?_armed_sub,?&_armed);??orb_copy(ORB_ID(parameter_update),?_param_sub,?&pupdate);????px4io??orb_publish(ORB_ID(vehicle_command),?pub,?&cmd);??orb_publish(ORB_ID(safety),?_to_safety,?&safety);??orb_publish(ORB_ID(battery_status),?_to_battery,?&battery_status);??orb_publish(ORB_ID(servorail_status),?_to_servorail,?&_servorail_status);??orb_publish(ORB_ID(input_rc),?_to_input_rc,?&rc_val);??orb_publish(ORB_ID(actuator_outputs),?_to_outputs,?&outputs);??orb_publish(ORB_ID(multirotor_motor_limits),?_to_mixer_status,?&motor_limits);??orb_copy(ORB_ID(actuator_armed),?safety_sub,?&safety);??orb_copy(ORB_ID(vehicle_command),?_t_vehicle_command,?&cmd);??orb_copy(ORB_ID(parameter_update),?_t_param,?&pupdate);??orb_copy(ORB_ID(actuator_controls_0),?_t_actuator_controls_0,?&controls);??orb_copy(ORB_ID(actuator_controls_x),?_t_actuator_controls_0,?&controls);??orb_copy(ORB_ID(vehicle_control_mode),?_t_vehicle_control_mode,?&control_mode);????stm32(adc)??orb_publish(ORB_ID(system_power),?_to_system_power,?&system_power);??
3.3位置控制和姿態控制
3.4pwm輸出
3.4.1mixer
官方地址(已失效)對應的內容
混合器輸出定義控制器的輸出是如何映射到電機和伺服輸出。所有內置mixer文件位于ROM文件系統的/etc/mixers目錄,并編譯成固件。Mixer是一組獨立的映射器,從控制讀入寫入,寫入執行器輸出。一個模塊,結合一組根據預先定義的規則和參數的輸入,產生一組輸出。
(1)語法:
Mixer的定義是文本文件,用一個大寫字母后跟一個冒號開頭的行。所有其他的行都會被忽略,這意味著解釋性文本可與定義相混合。每個文件可以定義多個Mixer。由一個Mixer產生的執行器輸出的數量是特定的。
起始形式如下:
<tag>:<mixer arguments>
標簽選擇Mixer的類型,“M”為一種簡單求和Mixer,“R”為多轉子(多旋翼)Mixer等。
一個空的Mixer不消耗控制,并產生一個執行機構的輸出,其值始終為零。通常一個空的Mixer被用作占位符Mixer的集合中,以實現制動器輸出的特定模式。
空的Mixer定義形式:
Z:
?
(2)簡單的Mixer
一個簡單的Mixer的開始:
M: <control count>
O: <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
如果為零,則輸出就為零,Mixer輸出的固定值是受限制的。
第二行定義了輸出輸出定標器和標量參數。雖然計算作為浮點運算進行的,存儲在所述定義文件中的值是由10000倍縮放,-0.5偏移被編碼為-5000.
?
該定義繼續描述控制輸入和縮放項:
S: <group> <index> <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
這些值定義了控制組從那些定標器中讀取數據,和該組內的值的偏移。是特定于設備讀取Mixer的定義。
?
當用于混合車輛的控制,混合器組0是車輛姿態控制組,索引值從0到3通常分別是:roll,pitch,yaw,thrust。
?
具體詳解見:https://pixhawk.org/dev/mixing?s[]=mixer
?
(3)多旋翼Mixer
在多旋翼混合器結合四個控制輸入(roll,pitch,yaw,thrust)為一組用于驅動電機速度控制器制動輸出。
Mixer定義的形式:
R: <geometry> <roll scale> <pitch scale> <yaw scale> <deadband>
參數解釋:
? ? 機械:包括quad(4x,4+),hex(6x,6+),octo(8x,8+)
? ? 單獨的roll,pitch和yaw控制因子
? ? 電機輸出死區 ?
總結
以上是生活随笔為你收集整理的Px4源码框架结构图的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。