pixhawk 整体架构的认识
此篇blog的目的是對(duì)px4工程有一個(gè)整體認(rèn)識(shí),對(duì)各個(gè)信號(hào)的流向有個(gè)了解,以及控制算法采用的控制框架。
PX4自動(dòng)駕駛儀軟件可分為三大部分:實(shí)時(shí)操作系統(tǒng)、中間件和飛行控制棧。
1.NuttX實(shí)時(shí)操作系統(tǒng)
提供POSIX-style的用戶操作環(huán)境(如printf(), pthreads,/dev/ttyS1,open(),write(),poll(),ioctl()),進(jìn)行底層的任務(wù)調(diào)度。
2.PX4中間件
PX4中間件運(yùn)行于操作系統(tǒng)之上,提供設(shè)備驅(qū)動(dòng)和一個(gè)微對(duì)象請(qǐng)求代理(micro object request broker,uORB)用于駕駛儀上運(yùn)行的單個(gè)任務(wù)之間的異步通信。Px4被3DR開(kāi)源后,整個(gè)代碼結(jié)構(gòu)被?改,原先的系統(tǒng)被摒棄,進(jìn)而采用Nuttx,但是核心思想沒(méi)變-為了簡(jiǎn)化開(kāi)發(fā)而采用犧牲部分效率的消息傳遞機(jī)制,這是Px4 與ArduPilot 最本質(zhì)的差別。
3.PX4飛行控制棧
飛行控制棧可以使用PX4的控制軟件棧,也可以使用其他的控制軟件,如APM:Plane、APM:Copter,但必須運(yùn)行于PX4中間件之上。
此部分又可分為
決策導(dǎo)航部分:根據(jù)飛行器自身安全狀態(tài)和接收到的命令,決定工作于什么模式,下一步應(yīng)該怎么做。
位置姿態(tài)估計(jì)部分:根據(jù)傳感器得到自身的位置和姿態(tài)信息,此部分算法含金量最高,算法也相當(dāng)多。
位置姿態(tài)控制部分:根據(jù)期望位置和姿態(tài)設(shè)計(jì)控制結(jié)構(gòu),盡可能快、穩(wěn)的達(dá)到期望位置和姿態(tài)。
控制器輸出部分:mixer和執(zhí)行器,pwm限幅。
算法在Firmware/src/modules,驅(qū)動(dòng)在Firmware/src/drivers
px4原生固件模塊列表:
系統(tǒng)命令程序
mavlink?–通過(guò)串口發(fā)送和接收mavlink信息
sdlog2?–保存系統(tǒng)日志/飛行數(shù)據(jù)到SD卡
tests?–測(cè)試系統(tǒng)中的測(cè)試程序
top?–列出當(dāng)前的進(jìn)程和CPU負(fù)載
uORB?– 微對(duì)象請(qǐng)求代理器-分發(fā)其他應(yīng)用程序之間的信息
驅(qū)動(dòng)
mkblctrl–blctrl電子模塊驅(qū)動(dòng)
esc_calib?–ESC的校準(zhǔn)工具
fmu?–FMU引腳輸入輸出定義
gpio_led?–GPIO LED驅(qū)動(dòng)
gps?–GPS接收器驅(qū)動(dòng)
pwm?–PWM的更新速率命令
sensors?–傳感器應(yīng)用
px4io?–px4io驅(qū)動(dòng)
uavcan?–uavcan驅(qū)動(dòng)
飛行控制的程序
飛行安全和導(dǎo)航
commander?–主要飛行安全狀態(tài)機(jī)
navigator?–任務(wù),失效保護(hù)和RTL導(dǎo)航儀
估計(jì)姿態(tài)和位置
attitude_estimator_ekf?–基于EKF的姿態(tài)估計(jì)
ekf_att_pos_estimator?–基于EKF的姿態(tài)和位置估計(jì)
position_estimator_inav–慣性導(dǎo)航的位置估計(jì)
multirotor姿態(tài)和位置控制器
mc_att_control–multirotor姿態(tài)控制器
mc_pos_control?–multirotor位置控制器
fixedwing姿態(tài)和位置控制器
fw_att_control?–固定翼飛機(jī)的姿態(tài)控制
fw_pos_control_l1?–固定翼位置控制器
垂直起降姿態(tài)控制器
vtol_att_control?–垂直起降姿態(tài)控制器
3.1決策
3.1.1 任務(wù)決策。以任務(wù)為導(dǎo)向,任務(wù)決策主要決定多旋翼下一步“去哪兒”,進(jìn)一步,需要規(guī)劃路徑,使得整個(gè)過(guò)程能滿足諸如:飛向航路點(diǎn)并沿航線飛,以及飛向航路點(diǎn)并避障等要求。
3.1.2?健康管理和失效保護(hù)。以安全為導(dǎo)向, 失效保護(hù)主要決定多旋翼下一步“去哪兒”。多旋翼飛行器在飛行前或飛行中,可能會(huì)發(fā)生通信故障、傳感器失效和動(dòng)力系統(tǒng)異常等,這些意外會(huì)直接導(dǎo)致控制任務(wù)無(wú)法完成。這一部分包括安全問(wèn)題的介紹、機(jī)載設(shè)備的健康評(píng)估、機(jī)載設(shè)備的健康監(jiān)測(cè)、失效后的保護(hù)建議。
傳感器校正在commander里面
對(duì)應(yīng)的程序在Firmware/src/modules/commander和Firmware/src/modules/navigator
完成任務(wù)模式切換,同時(shí)考慮電池電量、GPS等傳感器是否正常工作等信息。
commanderorb_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); navigatororb_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位置估計(jì)和姿態(tài)估計(jì)
此部分需要大量理論知識(shí),暫時(shí)還比較欠缺。
sensors是對(duì)陀螺儀、加速度計(jì)地磁計(jì)的一個(gè)處理
3.3位置控制和姿態(tài)控制
3.4pwm輸出
3.4.1mixer
官方地址(已失效)對(duì)應(yīng)的內(nèi)容
混合器輸出定義控制器的輸出是如何映射到電機(jī)和伺服輸出。所有內(nèi)置mixer文件位于ROM文件系統(tǒng)的/etc/mixers目錄,并編譯成固件。Mixer是一組獨(dú)立的映射器,從控制讀入寫入,寫入執(zhí)行器輸出。一個(gè)模塊,結(jié)合一組根據(jù)預(yù)先定義的規(guī)則和參數(shù)的輸入,產(chǎn)生一組輸出。
Mixer的定義是文本文件,用一個(gè)大寫字母后跟一個(gè)冒號(hào)開(kāi)頭的行。所有其他的行都會(huì)被忽略,這意味著解釋性文本可與定義相混合。每個(gè)文件可以定義多個(gè)Mixer。由一個(gè)Mixer產(chǎn)生的執(zhí)行器輸出的數(shù)量是特定的。
起始形式如下:
<tag>:<mixer arguments>
標(biāo)簽選擇Mixer的類型,“M”為一種簡(jiǎn)單求和Mixer,“R”為多轉(zhuǎn)子(多旋翼)Mixer等。
一個(gè)空的Mixer不消耗控制,并產(chǎn)生一個(gè)執(zhí)行機(jī)構(gòu)的輸出,其值始終為零。通常一個(gè)空的Mixer被用作占位符Mixer的集合中,以實(shí)現(xiàn)制動(dòng)器輸出的特定模式。
空的Mixer定義形式:
Z:
?
(2)簡(jiǎn)單的Mixer
一個(gè)簡(jiǎn)單的Mixer的開(kāi)始:
M: <control count>
O: <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
如果為零,則輸出就為零,Mixer輸出的固定值是受限制的。
第二行定義了輸出輸出定標(biāo)器和標(biāo)量參數(shù)。雖然計(jì)算作為浮點(diǎn)運(yùn)算進(jìn)行的,存儲(chǔ)在所述定義文件中的值是由10000倍縮放,-0.5偏移被編碼為-5000.
?
該定義繼續(xù)描述控制輸入和縮放項(xiàng):
S: <group> <index> <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
這些值定義了控制組從那些定標(biāo)器中讀取數(shù)據(jù),和該組內(nèi)的值的偏移。是特定于設(shè)備讀取Mixer的定義。
?
當(dāng)用于混合車輛的控制,混合器組0是車輛姿態(tài)控制組,索引值從0到3通常分別是:roll,pitch,yaw,thrust。
?
具體詳解見(jiàn):https://pixhawk.org/dev/mixing?s[]=mixer
?
(3)多旋翼Mixer
在多旋翼混合器結(jié)合四個(gè)控制輸入(roll,pitch,yaw,thrust)為一組用于驅(qū)動(dòng)電機(jī)速度控制器制動(dòng)輸出。
Mixer定義的形式:
R: <geometry> <roll scale> <pitch scale> <yaw scale> <deadband>
參數(shù)解釋:
? ? 機(jī)械:包括quad(4x,4+),hex(6x,6+),octo(8x,8+)
? ? 單獨(dú)的roll,pitch和yaw控制因子
? ? 電機(jī)輸出死區(qū) ?
pixhawk 整體架構(gòu)的認(rèn)識(shí)
標(biāo)簽:
原文地址:http://blog.csdn.net/czyv587/article/details/51627787
總結(jié)
以上是生活随笔為你收集整理的pixhawk 整体架构的认识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Px4源码框架结构图
- 下一篇: pixhawk软件架构