任务传输
- 任务传输包含两个部分:1 任务从界面到物理飞行器。2 从物理飞行器中上传任务,显示到界面。
- 在界面上通过鼠标添加任务,其实添加的是VisualMissionItem的子类。这些子类会存储在PlanElementController的子类中。当点击上传按钮时,VisualMissionItem的子类会转换成MissionItem的子类存储PlanManage的子类中。然后通过mavlink协议发送到物理小车。
- 下载流程是相反的。
- 任务不仅可以下发到小车,也可以保存的文件。
- PlanManager的子类位于Vehicle中。PlanElementController的子类位于PlanMasterController中。
- 界面上任务传输调用的最顶层的函数位于PlanMasterControlle中。
- PlanElementController的子类中有当前活动的小车。
任务的具体发送是通过小车中PlanManager::writeMissionItems
任务的接收是通过PlanManager::_mavlinkMessageReceived函数接收的
信号传输
- activeVehicleChanged
原始产生对象:MultiVehicleManager
产生方式:地面站有新的小车接入或工具栏手动切换小车
注意:是通过父类再转一下。
传输链:MultiVehicleManager----->PlanMasterController-------->MissionController、GeoFenceController、RallyPointControlle
相关类
PlanManager
PlanManager {
typedef enum {
AckNone,
AckMissionCount,
AckMissionItem,
AckMissionRequest,
AckMissionClearAll,
AckGuidedItem,
} AckType_t;
此类与小车的通信只在执行交易前创建,执行交易后关闭。
将任务上传到小车:先给小车发我有多少条任务 mavlink_msg_mission_count_pack_chan。
然后小车发送获取任务的请求。收到请求后执行_handleMissionRequest()函数。在此函数内打包任务mavlink_msg_mission_item_int_pack_chan。
将任务从小车下载:先给小车发送下载任务的请求mavlink_msg_mission_request_list_pack_chan。
然后小车发送当前一共有多少条任务的消息。收到消息后执行_handleMissionCount()。在此函数里解包个数,然后调用_requestNextMissionItem()逐条请求任务。
小车收到消息后,返回 MAVLINK_MSG_ID_MISSION_ITEM_INT消息。收到此消息后调用_handleMissionItem()
void loadFromVehicle(void) {
1 状态检查inProgress(): 当前没有正在进行上传,下载,删除
2 设置状态变量:_retryCount重连次数,_setTransactionInProgress(TransactionRead)设置当前交易状态为读
3 创建mavlink连接
4 _requestList(void) {
1 清除读缓存
2 打包消息mavlink_msg_mission_request_list_pack_chan
3 启动计时器检查状态
}
}
当小车收到消息后,会发送MAVLINK_MSG_ID_MISSION_ITEM_INT消息。lanManager::_handleMissionItem(const mavlink_message_t& message)函数会被调用
_handleMissionItem(const mavlink_message_t& message) {
1 解包
2 if (_itemIndicesToRead.count() == 0) {
_readTransactionComplete();
} else {
_requestNextMissionItem();
}
}
}
PlanMasterController
PlanMasterController {
此类用于连接:界面,PlanManager,PlanElementController
Q_INVOKABLE void start(void);
Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted = false);
Q_INVOKABLE int readyForSaveState(void) const { return _missionController.readyForSaveState(); }
Q_INVOKABLE void showPlanFromManagerVehicle(void);
Q_INVOKABLE void loadFromVehicle(void);
Q_INVOKABLE void sendToVehicle(void);
Q_INVOKABLE void loadFromFile(const QString& filename);
Q_INVOKABLE void saveToCurrent();
Q_INVOKABLE void saveToFile(const QString& filename);
Q_INVOKABLE void saveToKml(const QString& filename);
Q_INVOKABLE void removeAll(void);
Q_INVOKABLE void removeAllFromVehicle(void);
}