去掉flyto的无用代码,降低数据传输量

加入航点写入和启动任务
This commit is contained in:
panxu 2018-04-30 17:56:11 +08:00
parent 2ae79ec811
commit db60b6b8cc
3 changed files with 262 additions and 592 deletions

View File

@ -45,473 +45,12 @@ namespace Plane.FormationCreator.Formation
}
}
public async Task RunFollowFourLeadersTaskAsync() // 跟随前面飞机
{
int[] followHeadsIndex = { 0, 0, 0, 0};
int followHeadsNum = 0;
int startTaskIndex = 0;
int endTaskIndex = 0;
int taskIndex = _flightTaskManager.CurrentRunningTaskIndex;
if (taskIndex >= 2 && taskIndex <= 4)
{
followHeadsNum = 1;
followHeadsIndex[0] = 0;
followHeadsIndex[1] = 4;
followHeadsIndex[2] = 8;
// followHeadsIndex[3] = 6;
startTaskIndex = 2;
endTaskIndex = 4;
}
if (taskIndex >= 18 && taskIndex <= 20)
{
followHeadsNum = 3;
followHeadsIndex[0] = 3;
followHeadsIndex[1] = 7;
followHeadsIndex[2] = 11;
// followHeadsIndex[3] = 6;
startTaskIndex = 18;
endTaskIndex = 20;
}
/*
if (taskIndex >= 6 && taskIndex <= 6)
{
followHeadsNum = 2;
followHeadsIndex[0] = 0;
followHeadsIndex[1] = 5;
startTaskIndex = 6;
endTaskIndex = 6;
}
*/
if (StaggerRoutes)
{
var infos = SingleCopterInfos;
if (_flightTaskManager.Tasks.IndexOf(this) == startTaskIndex)
{
var tasks = new Task[infos.Count];
for (int i = 0; i < infos.Count; i++)
{
var info = infos[i];
var copter = info.Copter;
var i1 = i;
tasks[i1] = await Task.Factory.StartNew(async () =>
{
await FollowFourLeadersTaskFlySingleCopterAsync(info);
});
}
if (startTaskIndex == endTaskIndex)
{
await Task.WhenAll(tasks).ConfigureAwait(false);
}
else
{
for (int i = 0; i < followHeadsNum; i++)
{
await tasks[followHeadsIndex[i]];
}
}
// await Task.WhenAll(tasks[0]).ConfigureAwait(false);
}
else if ((_flightTaskManager.Tasks.IndexOf(this) > startTaskIndex) && (_flightTaskManager.Tasks.IndexOf(this) < endTaskIndex))
{
var tasks = new Task[followHeadsNum];
for (int i = 0; i < followHeadsNum; i++)
{
var info = infos[followHeadsIndex[i]];
var copter = info.Copter;
var i1 = i;
tasks[i1] = await Task.Factory.StartNew(async () =>
{
await FollowFourLeadersTaskFlySingleCopterAsync(info);
});
}
await Task.WhenAll(tasks).ConfigureAwait(false);
}
else
//(_flightTaskManager.Tasks.IndexOf(this) == endTaskIndex)
{
var tasks = new Task[followHeadsNum];
for (int i = 0; i < followHeadsNum; i++)
{
var info = infos[followHeadsIndex[i]];
var copter = info.Copter;
var i1 = i;
tasks[i1] = await Task.Factory.StartNew(async () =>
{
await FollowFourLeadersTaskFlySingleCopterAsync(info);
});
}
await Task.WhenAll(tasks).ConfigureAwait(false);
while (true)
{
bool isFinishedFlag = true;
for (int i=0; i<infos.Count(); i++)
{
isFinishedFlag = isFinishedFlag && _flightTaskManager.Tasks[startTaskIndex].SingleCopterInfos[i].isFinished;
}
if (isFinishedFlag)
{
break;
}
}
}
}
else
{
await Task.WhenAll(
SingleCopterInfos.Select(info => FollowFourLeadersTaskFlySingleCopterAsync(info))
).ConfigureAwait(false);
}
}
private async Task FollowFourLeadersTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info)
{
var infos = SingleCopterInfos; // 本次任务所有飞机编号
int index = infos.FindIndex(s => s == info); // 本次任务当前飞机编号
int followHead = 0;
int indexHead = 0;
int startTaskIndex = 0;
int endTaskIndex = _flightTaskManager.Tasks.Count();
float directionAngle = 0;
int taskIndex = _flightTaskManager.CurrentRunningTaskIndex;
// 如果当前任务编号属于跟随过程的任务
if (taskIndex >= 2 && taskIndex <= 4)
{
if (index == 0 ) // 当前飞机编号属于领航的飞机
{
followHead = 1;
}
else // 当前飞机编号属于跟随的飞机
{
indexHead = index - 1; // 计算跟随的前方飞机编号
startTaskIndex = 2; // 本次跟随过程开始任务编号
endTaskIndex = 4; // 本次跟随过程结束任务编号
info.isFinished = false;// 赋值结束本次task的初始标志位
directionAngle = 0; // 与前方跟随飞机的角度0为正北方向
}
}
if (taskIndex >= 18 && taskIndex <= 20)
{
if (index == 3 || index == 7 || index == 11)
{
followHead = 1;
}
else
{
indexHead = index + 1;
startTaskIndex = 18;
endTaskIndex = 20;
info.isFinished = false;
directionAngle = 180;
}
}
/*
if (taskIndex >= 6 && taskIndex <= 6)
{
if (index == 0 || index == 5)
{
followHead = 1;
}
else
{
if (index % 2 == 0)
{
indexHead = index - 2;
directionAngle = 90;
}
else
{
indexHead = index + 2;
directionAngle = 270;
}
startTaskIndex = 6;
endTaskIndex = 6;
info.isFinished = false;
}
}
if (taskIndex >= 18 && taskIndex <= 20)
{
if (index == 1 || index == 3 || index == 5 || index == 7)
{
followHead = 1;
}
else
{
indexHead = index + 1;
}
}
if (taskIndex >= 7 && taskIndex <= 9)
{
if (index == 0 || index == 7 )
{
followHead = 1;
}
else
{
indexHead = index - 2;
}
}
if (taskIndex >= 10 && taskIndex <= 12)
{
if (index == 1 || index == 6)
{
followHead = 1;
}
else
{
indexHead = index + 2;
}
}
*/
// 如果不是被跟随的飞机
if (followHead != 1)
{
var infoBefore = infos[indexHead]; // 跟随的飞机编号
DateTime dtNow = DateTime.Now; // 记录当前时间
DateTime dtLastTime = DateTime.Now; // 记录gps上次更新时间
TimeSpan ts = dtNow - dtLastTime; // 记录gps是否更新时间段
int flagRefresh = 1; // gps更新标志
int flagStopTask = 0; // 如果飞机超过5s没有更新gps坐标则认为本次跟随任务结束, 即flagStopTask>=10
double GPSRate = 500; // 500 ms, gps更新时间
Tuple<double, double> targetLatLng = null; // 更新的gps坐标
// int taskIndex = 0;
int stopFlag = 10; // 结束任务标志, 10即10*500ms = 5s
// while (flagStopTask < stopFlag)
while (true)
{
taskIndex = _flightTaskManager.CurrentRunningTaskIndex; // 获取当前任务编号
if (flagRefresh == 1) // 需要更新gps坐标
{
flagRefresh = 0; // 更新标志清零
flagStopTask++; // 结束任务标志加1
// var direction = GeographyUtils.CalcDirection(info.Copter.Latitude, info.Copter.Longitude, infoBefore.Copter.Latitude, infoBefore.Copter.Longitude);
// targetLatLng = GeographyUtils.CalcLatLngSomeMetersAway(infoBefore.Copter.Latitude, infoBefore.Copter.Longitude, (float)( direction), 5);
// 计算目标经纬度
targetLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D(infoBefore.Copter.Latitude, infoBefore.Copter.Longitude, directionAngle, 8);
// 判断飞机当前是否在目标范围内. 球半径1m
if (!info.Copter.ArrivedTarget(targetLatLng.Item1, targetLatLng.Item2, infoBefore.Copter.Altitude))
{
flagStopTask = 0;
for (int j = 0; j < 3; j++)
{
// 发送目标坐标给飞控
await info.Copter.FlyToAsync(targetLatLng.Item1, targetLatLng.Item2, infoBefore.Copter.Altitude);
}
}
}
// 如果没有在目标范围内则一直在循环内。当更新gps标志置位退出循环
// 修改到达目标半径为1m与飞控的判断条件相同, by ZJF
while (!info.Copter.ArrivedTarget(targetLatLng.Item1, targetLatLng.Item2, infoBefore.Copter.Altitude))
{
if (_flightTaskManager.IsPaused == true)
{
await info.Copter.HoverAsync();
return;
}
await Task.Delay(25).ConfigureAwait(false);
dtNow = DateTime.Now;
ts = dtNow - dtLastTime;
if (ts.TotalMilliseconds > GPSRate)
{
break;
}
}
// 如果1、已经是最后一步任务2、结束任务标志位置位3、跟随的飞机已经结束任务则本飞机结束当前任务且切换到悬停模式
if ((taskIndex == _flightTaskManager.Tasks.Count() - 1) && (flagStopTask >= stopFlag) && infoBefore.isFinished)
// if ((taskIndex == _flightTaskManager.Tasks.Count() - 1) && (flagStopTask >= stopFlag) && _flightTaskManager.Tasks[taskIndex].SingleCopterInfos[indexHead].isFinished)
{
info.isFinished = true;
await info.Copter.HoverAsync();
// return;
}
// 如果1、已经是本次跟随过程的最后一步任务2、结束任务标志位置位3、跟随的飞机已经结束任务则本飞机结束当前任务退出循环
if ((taskIndex == endTaskIndex) && (flagStopTask >= stopFlag) && infoBefore.isFinished)
// if ((taskIndex == endTaskIndex) && (flagStopTask >= stopFlag) && _flightTaskManager.Tasks[taskIndex].SingleCopterInfos[indexHead].isFinished)
{
info.isFinished = true;
break;
// return;
}
// 如果任务暂停,则切换到悬停模式
if (_flightTaskManager.IsPaused == true)
{
await info.Copter.HoverAsync();
return;
}
await Task.Delay(20).ConfigureAwait(false);
// 计算是否更新gps标志位
dtNow = DateTime.Now;
ts = dtNow - dtLastTime;
if (ts.TotalMilliseconds > GPSRate)
{
flagRefresh = 1;
dtLastTime = dtNow;
}
}
}
else // 如果是被跟随的飞机
{
DateTime dtNow = DateTime.Now;
DateTime dtLastTime = DateTime.Now;
TimeSpan ts = dtNow - dtLastTime;
taskIndex = _flightTaskManager.CurrentRunningTaskIndex;
for (int j = 0; j < 3; j++)
await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
while (!info.Copter.ArrivedTarget(info.TargetLat, info.TargetLng, info.TargetAlt))
{
if (_flightTaskManager.IsPaused == true)
{
await info.Copter.HoverAsync();
return;
}
await Task.Delay(25).ConfigureAwait(false);
// 为了防止3次发送更新gps坐标失败此处添加每隔1s重新发送目标gps坐标
dtNow = DateTime.Now;
ts = dtNow - dtLastTime;
if (ts.TotalMilliseconds > 1000)
{
for (int j = 0; j < 3; j++)
await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
dtLastTime = dtNow;
}
}
info.isFinished = true;
if (taskIndex == _flightTaskManager.Tasks.Count() - 1)
{
await info.Copter.HoverAsync();
}
// await info.Copter.HoverAsync();
}
}
public async Task RunFlyToOnlyAltTaskAsync() // 仅改变高度
{
if (StaggerRoutes)
{
var infos = SingleCopterInfos;
var tasks = new Task[infos.Count];
for (int i = 0; i < infos.Count; i++)
{
var info = infos[i];
var copter = info.Copter;
var i1 = i;
tasks[i1] = await Task.Factory.StartNew(async () =>
{
if (i1 > 0)
{
var prevCopter = infos[i1 - 1].Copter;
while (CheckCrossing(infos, i1) &&
prevCopter.Altitude - copter.Altitude < 2)
{
await Task.Delay(25).ConfigureAwait(false);
}
}
await FlyToOnlyAltTaskFlySingleCopterAsync(info);
});
}
await Task.WhenAll(tasks).ConfigureAwait(false);
}
else
{
await Task.WhenAll(
SingleCopterInfos.Select(info => FlyToOnlyAltTaskFlySingleCopterAsync(info))
).ConfigureAwait(false);
}
}
private async Task FlyToOnlyAltTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info) // 仅高度变化
{
int taskIndex = _flightTaskManager.CurrentRunningTaskIndex;
int copterIndex = SingleCopterInfos.IndexOf(info);
double infoTargetLat = 0.0;
double infoTargetLng = 0.0;
//if (taskIndex > 0 && taskIndex <= 2)
//{
// infoTargetLat = _flightTaskManager.Tasks[0].SingleCopterInfos[copterIndex].TargetLat;
// infoTargetLng = _flightTaskManager.Tasks[0].SingleCopterInfos[copterIndex].TargetLng;
//}
DateTime dtNow = DateTime.Now;
DateTime dtLastTime = DateTime.Now;
TimeSpan ts = dtNow - dtLastTime;
infoTargetLat = info.Copter.Latitude;
infoTargetLng = info.Copter.Longitude;
for (int i = 0; i < 3; i++)
{
await info.Copter.FlyToAsync(infoTargetLat, infoTargetLng, info.TargetAlt);
}
while (!info.Copter.ArrivedTarget(infoTargetLat, infoTargetLng, info.TargetAlt))
{
if (_flightTaskManager.IsPaused == true)
{
await info.Copter.HoverAsync();
return;
}
await Task.Delay(25).ConfigureAwait(false);
dtNow = DateTime.Now;
ts = dtNow - dtLastTime;
if (ts.TotalMilliseconds > 2000)
{
for (int i = 0; i < 3; i++)
{
await info.Copter.FlyToAsync(infoTargetLat, infoTargetLng, info.TargetAlt);
}
dtLastTime = dtNow;
}
}
// await info.Copter.HoverAsync();
if (taskIndex == _flightTaskManager.Tasks.Count() - 1)
{
await info.Copter.HoverAsync();
}
}
public async Task RunFlyToTaskAsync() // 全部飞到指定航点
{
@ -551,93 +90,8 @@ namespace Plane.FormationCreator.Formation
}
}
/*
private async Task FlyToTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info)
{
int taskIndex = _flightTaskManager.CurrentRunningTaskIndex;
int copterIndex = SingleCopterInfos.IndexOf(info);
DateTime dtNow = DateTime.Now;
DateTime dtLastTime = DateTime.Now;
TimeSpan ts = dtNow - dtLastTime;
int pointNum = 10;
EHLocation[] targetLanLngArray = new EHLocation[pointNum];
if (taskIndex >= 2)
// if (false)
{
var copterPreviousTaskInfo = _flightTaskManager.Tasks[taskIndex - 1].SingleCopterInfos[copterIndex];
var direction = GeographyUtils.CalcDirection2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, info.TargetLat, info.TargetLng);
var distance = GeographyUtils.CalcDistance(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, copterPreviousTaskInfo.TargetAlt, info.TargetLat, info.TargetLng, info.TargetAlt);
var altDiff = info.TargetAlt - copterPreviousTaskInfo.TargetAlt;
var horizontalDiff = GeographyUtils.CalcDistance2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, info.TargetLat, info.TargetLng);
for (int ii = 0; ii < pointNum; ii++)
{
// var targetLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, (float)(GeographyUtils.RadToDeg(direction)), (float)distance * (ii + 1) / pointNum);
var targetLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, (float)(GeographyUtils.RadToDeg(direction)), (float)horizontalDiff * (ii + 1) / pointNum);
var targetAltTmp = copterPreviousTaskInfo.TargetAlt + altDiff * (ii + 1) / pointNum;
targetLanLngArray[ii] = new EHLocation(targetLatLng.Item1, targetLatLng.Item2, targetAltTmp);
}
}
else
{
for (int ii = 0; ii < pointNum; ii++)
{
targetLanLngArray[ii] = new EHLocation(info.TargetLat,info.TargetLng, info.TargetAlt);
}
}
int pointStage = 0;
while (pointStage < 10)
{
for (int i = 0; i < 3; i++)
{
// await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
await info.Copter.FlyToAsync(targetLanLngArray[pointStage].Latitude, targetLanLngArray[pointStage].Longitude, targetLanLngArray[pointStage].Altitude);
await Task.Delay(10).ConfigureAwait(false);
}
while (!info.Copter.ArrivedTarget(targetLanLngArray[pointStage].Latitude, targetLanLngArray[pointStage].Longitude, targetLanLngArray[pointStage].Altitude))
{
if (_flightTaskManager.IsPaused == true)
{
await info.Copter.HoverAsync();
return;
}
await Task.Delay(25).ConfigureAwait(false);
dtNow = DateTime.Now;
ts = dtNow - dtLastTime;
if (ts.TotalMilliseconds > 2000)
{
for (int i = 0; i < 2; i++)
{
// await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
await info.Copter.FlyToAsync(targetLanLngArray[pointStage].Latitude, targetLanLngArray[pointStage].Longitude, targetLanLngArray[pointStage].Altitude);
await Task.Delay(10).ConfigureAwait(false);
}
dtLastTime = dtNow;
}
}
pointStage++;
}
// await info.Copter.HoverAsync();
if (taskIndex == _flightTaskManager.Tasks.Count() - 1)
{
await info.Copter.HoverAsync();
}
}
*/
private async Task FlyToTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info)
{
int taskIndex = _flightTaskManager.CurrentRunningTaskIndex;
@ -651,51 +105,26 @@ namespace Plane.FormationCreator.Formation
}
await info.Copter.SetShowLEDAsync(info.FlytoShowLED);
if (info.Copter.State != Plane.Copters.CopterState.CommandMode)
await info.Copter.GuidAsync();
await info.Copter.GuidAsync();
DateTime dtNow = DateTime.Now;
DateTime dtLastTime = DateTime.Now;
TimeSpan ts = dtNow - dtLastTime;
int pointNum = 10;
PLLocation[] targetLanLngArray = new PLLocation[pointNum];
// if (taskIndex >= 2) // 将地图上两个目标点分成10份
if (false) // 只发送最终目标点
/*
for (int i = 0; i < 5; i++)
{
var copterPreviousTaskInfo = _flightTaskManager.Tasks[taskIndex - 1].SingleCopterInfos[copterIndex];
var direction = GeographyUtils.CalcDirection2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, info.TargetLat, info.TargetLng);
var distance = GeographyUtils.CalcDistance(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, copterPreviousTaskInfo.TargetAlt, info.TargetLat, info.TargetLng, info.TargetAlt);
var altDiff = info.TargetAlt - copterPreviousTaskInfo.TargetAlt;
var horizontalDiff = GeographyUtils.CalcDistance2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, info.TargetLat, info.TargetLng);
for (int ii = 0; ii < pointNum; ii++)
{
// var targetLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, (float)(GeographyUtils.RadToDeg(direction)), (float)distance * (ii + 1) / pointNum);
var targetLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D(copterPreviousTaskInfo.TargetLat, copterPreviousTaskInfo.TargetLng, (float)(GeographyUtils.RadToDeg(direction)), (float)horizontalDiff * (ii + 1) / pointNum);
var targetAltTmp = copterPreviousTaskInfo.TargetAlt + altDiff * (ii + 1) / pointNum;
targetLanLngArray[ii] = new PLLocation(targetLatLng.Item1, targetLatLng.Item2, targetAltTmp);
}
}
else
{
for (int ii = 0; ii < pointNum; ii++)
{
targetLanLngArray[ii] = new PLLocation(info.TargetLat,info.TargetLng, info.TargetAlt);
}
}
int pointStage = 0;
for (int i = 0; i < 5; i++)
{
// await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
await info.Copter.FlyToAsync(targetLanLngArray[pointStage].Latitude, targetLanLngArray[pointStage].Longitude, targetLanLngArray[pointStage].Altitude);
await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
await Task.Delay(10).ConfigureAwait(false);
}
pointStage++;
*/
//发送目标航点1次
await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
await Task.Delay(10).ConfigureAwait(false);
while (!info.Copter.ArrivedTarget(info.TargetLat, info.TargetLng, info.TargetAlt))
{
@ -704,7 +133,7 @@ namespace Plane.FormationCreator.Formation
await info.Copter.HoverAsync();
return;
}
await Task.Delay(25).ConfigureAwait(false); //判断是否到达位置20hz
await Task.Delay(250).ConfigureAwait(false); //判断是否到达位置10hz
dtNow = DateTime.Now;
@ -713,15 +142,10 @@ namespace Plane.FormationCreator.Formation
{
for (int i = 0; i < 2; i++)
{
// await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
await info.Copter.FlyToAsync(targetLanLngArray[pointStage].Latitude, targetLanLngArray[pointStage].Longitude, targetLanLngArray[pointStage].Altitude);
await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, info.TargetAlt);
await Task.Delay(10).ConfigureAwait(false);
}
pointStage++;
if (pointStage == pointNum)
{
pointStage = pointNum - 1;
}
dtLastTime = dtNow;
}
// 当该飞机被标记时,悬停并跳过飞行任务

View File

@ -434,6 +434,248 @@ namespace Plane.FormationCreator.ViewModels
}
}
private ICommand _MissionStartCommand;
public ICommand MissionStartCommand
{
get
{
return _MissionStartCommand ?? (_MissionStartCommand = new RelayCommand(async () =>
{
int utchour = DateTime.UtcNow.AddSeconds(5).Hour;
int utcminute = DateTime.UtcNow.AddSeconds(5).Minute;
int utcsecond = DateTime.UtcNow.AddSeconds(5).Second;
foreach (var vcopter in _copterManager.Copters)
{
await vcopter.MissionStartAsync(utchour,
utcminute,
utcsecond,
110.23456,
40.23432);
}
}));
}
}
private ICommand _WriteMissionCommand;
public ICommand WriteMissionCommand
{
get
{
return _WriteMissionCommand ?? (_WriteMissionCommand = new RelayCommand(async () =>
{
ViewModels.ModifyTaskViewModel _taskmodimodel = ServiceLocator.Current.GetInstance<ViewModels.ModifyTaskViewModel>();
var _flightTaskManager = _taskmodimodel.FlightTaskManager;
int coptercount = _copterManager.Copters.Count;
int taskcount = _flightTaskManager.Tasks.Count;
if (taskcount < 2) return;
for (int i = 0; i < coptercount; i++)
{
///写航线开始
var missions = new IMission[taskcount + 1]; //不要起飞任务但增加一个起飞后低空航点,见起飞任务,再增加一个降落低空航点,见降落部分
int missindex = 0;
for (int j = 0; j < _flightTaskManager.Tasks.Count; j++)
{
if (_flightTaskManager.Tasks[j].TaskType == FlightTaskType.FlyTo)
{
missions[missindex++] = Mission.CreateWaypointMission(_flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLat,
_flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLng, _flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetAlt);
}
if (_flightTaskManager.Tasks[j].TaskType == FlightTaskType.TakeOff)
{
//起飞低空航点
missions[missindex++] = Mission.CreateWaypointMission(_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLat,
_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLng, 10);
//不要起飞任务,在写入时会自动加入
//自动起飞10米后需要飞到第一个航点下方
}
if (_flightTaskManager.Tasks[j].TaskType == FlightTaskType.Loiter)
{
missions[missindex++] = Mission.CreateWaypointMission(_flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLat,
_flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLng, _flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetAlt);
}
if (_flightTaskManager.Tasks[j].TaskType == FlightTaskType.ReturnToLand)
{
//降落低空航点
missions[missindex++] = Mission.CreateWaypointMission(_flightTaskManager.Tasks[j - 1].SingleCopterInfos[i].TargetLat,
_flightTaskManager.Tasks[j - 1].SingleCopterInfos[i].TargetLng, 10);
//返航
missions[missindex++] = Mission.CreateReturnToLaunchMission();
}
}
var result = await _copterManager.Copters[i].WriteMissionListAsync(missions);
//MessageBox.Show($"The result of WriteMissions: {result}");
}
// var firstCopter = _copterManager.Copters.First();
// Test TurnAsync.
//var latLng = GeographyUtils.CalcLatLngSomeMetersAway(firstCopter.Latitude, firstCopter.Longitude, 135, 10);
//await _formationController.TurnAsync(_copterManager.AcceptingControlCopters, latLng.Item1, latLng.Item2);
// Test FlyToLatLngAsync.
//var copters = _copterManager.AcceptingControlCopters;
//var centerLat = copters.Average(c => c.Latitude);
//var centerLng = copters.Average(c => c.Longitude);
//var latDelta = 10 * GeographyUtils.MetersToLocalLat;
//var lngDelta = 10 * GeographyUtils.GetMetersToLocalLon(copters.First().Latitude);
//var targetLat = centerLat + latDelta;
//var targetLng = centerLng + lngDelta;
//await _formationController.FlyToLatLngAsync(copters, targetLat, targetLng);
// Test FlyInCircleAsync.
//await _formationController.FlyInCircleAsync(_copterManager.AcceptingControlCopters, centerDirection: 180, radius: 10, loop: false);
// Test FlyAroundCenterOfCoptersAsync.
//await _formationController.FlyAroundCenterOfCoptersAsync(_copterManager.AcceptingControlCopters);
// Test FlyToLatLngAsync.
//var targetLatLng = GeographyUtils.CalcLatLngSomeMetersAway(firstCopter.Latitude, firstCopter.Longitude, 135, 20);
//await _formationController.FlyToLatLngAsync(firstCopter, targetLatLng.Item1, targetLatLng.Item2);
//firstCopter.LoiterTurns(1, 10);
//var radius = await firstCopter.GetParamAsync("CIRCLE_RADIUS");
////await firstCopter.SetParamAsync("CIRCLE_RADIUS", 1500);
////var param = await firstCopter.GetParamAsync("CIRCLE_RADIUS");
//// Alert.Show($"半径设置成功啦: {param}");
////await firstCopter.SetParamAsync("CIRCLE_RATE", 30);
//var rate = await firstCopter.GetParamAsync("CIRCLE_RATE");
//Alert.Show($"半径: {radius} 角速度: {rate}");
//await firstCopter.SetMobileControlAsync(yaw: 90);
//if (!_listeningMissionItemReceived)
//{
// firstCopter.MissionItemReceived += (sender, e) => Alert.Show($"{e.Index} {e.Total} {(Protocols.MAVLink.MAV_CMD)e.Details.id}");
// _listeningMissionItemReceived = true;
//}
// await firstCopter.RequestMissionListAsync();
// var copter = firstCopter;
///* 写航线 */
//// 任务总数。
// await copter.SetMissionCountAsync(6).ConfigureAwait(false);
//// 起飞前准备。
// await copter.WritePreTakeOffMissionAsync().ConfigureAwait(false);
//// 起飞。
// await copter.WriteTakeOffMissionAsync().ConfigureAwait(false);
//// 不断自增的编号。
// ushort index = 2;
//// 航点。
// await copter.WriteWaypointMissionAsync(new EHLocation(copter).AddLatLngAlt(0.001, 0.002, 2), index++).ConfigureAwait(false);
//// 航点。
// await copter.WriteWaypointMissionAsync(new EHLocation(copter).AddLatLngAlt(0.003, 0.002, 2), index++).ConfigureAwait(false);
//// 返航。
// await copter.WriteReturnToLaunchMissionAsync(index++).ConfigureAwait(false);
//// 降落。
// await copter.WriteLandMissionAsync(index++).ConfigureAwait(false);
///* 读航线 */
// 监听“任务项已接收”事件。
// (copter as PLCopter).MissionItemReceived += (sender, e) => Alert.Show($"{e.Mission.Sequence} {e.Mission.Latitude} {e.Mission.Command}");
// 请求任务列表。
// var missions = await copter.RequestMissionListAsync();
// Alert.Show(string.Join(Environment.NewLine, missions.Select(m => $"{m.Sequence}\t{m.Command}\t\t{m.Latitude}")));
/////////////////////////////////* 读航线结束 */
//ICopter previousCopter = firstCopter;
//foreach (var item in _copterManager.Copters.Where(c => c != firstCopter))
//{
// item.Follow(previousCopter, keepYawDifference: false, keepFacingTarget: false);
// previousCopter = item;
//}
//var missions = new Mission[]
//{
// Mission.CreateWaypointMission(new EHLocation(firstCopter).AddLatLngAlt(0.0001, 0, 10)),
// Mission.CreateReturnToLaunchMission(),
// Mission.CreateLandMission()
//};
//var result = await firstCopter.WriteMissionsAsync(missions);
//var result2 = await firstCopter.WriteMissionsAsync(missions);
//Debug.WriteLine($"{result1} {result2}");
///写航线开始
/* var missions = new IMission[]
{
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateWaypointMission(23.123, 113.123, 10),
Mission.CreateReturnToLaunchMission(),
Mission.CreateLandMission()
};
var result = await firstCopter.WriteMissionListAsync(missions);
MessageBox.Show($"The result of WriteMissions: {result}");
*/
/////////////////写航向结束
}));
}
}
private ICommand _FlagCommand;
public ICommand FlagCommand
{

View File

@ -40,6 +40,10 @@
Command="{Binding HoverCommand}" />
<Button Content="手动"
Command="{Binding FloatCommand}" />
<Button Content="航点"
Command="{Binding WriteMissionCommand}" />
<Button Content="开始"
Command="{Binding MissionStartCommand}" />
</WrapPanel>
<WrapPanel>