加入时间估计,兼容新飞机固件
配置文件加入默认加速度,速度等参数
This commit is contained in:
parent
79669581f1
commit
b729f6b78e
@ -17,6 +17,7 @@ using System.Windows.Media.Media3D;
|
||||
using System.Diagnostics;
|
||||
using Plane.FormationCreator.Util;
|
||||
using System.Collections;
|
||||
using System.Windows;
|
||||
|
||||
namespace Plane.FormationCreator.Formation
|
||||
{
|
||||
@ -308,6 +309,71 @@ namespace Plane.FormationCreator.Formation
|
||||
set { Set(nameof(Orientation), ref _Orientation, value); }
|
||||
}
|
||||
|
||||
//水平加速度
|
||||
private float _FC_acc_xy = 0;
|
||||
public float FC_acc_xy
|
||||
{
|
||||
get { return _FC_acc_xy; }
|
||||
set { Set(nameof(FC_acc_xy), ref _FC_acc_xy, value); }
|
||||
}
|
||||
//垂直加速度
|
||||
private float _FC_acc_z = 0;
|
||||
public float FC_acc_z
|
||||
{
|
||||
get { return _FC_acc_z; }
|
||||
set { Set(nameof(FC_acc_z), ref _FC_acc_z, value); }
|
||||
}
|
||||
|
||||
//水平最大速度
|
||||
private float _FC_maxvel_xy = 0;
|
||||
public float FC_maxvel_xy
|
||||
{
|
||||
get { return _FC_maxvel_xy; }
|
||||
set { Set(nameof(FC_maxvel_xy), ref _FC_maxvel_xy, value); }
|
||||
}
|
||||
|
||||
//上升最大速度
|
||||
private float _FC_maxvel_up = 0;
|
||||
public float FC_maxvel_up
|
||||
{
|
||||
get { return _FC_maxvel_up; }
|
||||
set { Set(nameof(FC_maxvel_up), ref _FC_maxvel_up, value); }
|
||||
}
|
||||
//下降最大速度
|
||||
private float _FC_maxvel_down = 0;
|
||||
public float FC_maxvel_down
|
||||
{
|
||||
get { return _FC_maxvel_down; }
|
||||
set { Set(nameof(FC_maxvel_down), ref _FC_maxvel_down, value); }
|
||||
}
|
||||
|
||||
|
||||
//水平默认速度
|
||||
private float _FC_defvel_xy = 0;
|
||||
public float FC_defvel_xy
|
||||
{
|
||||
get { return _FC_defvel_xy; }
|
||||
set { Set(nameof(FC_defvel_xy), ref _FC_defvel_xy, value); }
|
||||
}
|
||||
|
||||
//上升默认速度
|
||||
private float _FC_defvel_up = 0;
|
||||
public float FC_defvel_up
|
||||
{
|
||||
get { return _FC_defvel_up; }
|
||||
set { Set(nameof(FC_defvel_up), ref _FC_defvel_up, value); }
|
||||
}
|
||||
//下降默认速度
|
||||
private float _FC_defvel_down = 0;
|
||||
public float FC_defvel_down
|
||||
{
|
||||
get { return _FC_defvel_down; }
|
||||
set { Set(nameof(FC_defvel_down), ref _FC_defvel_down, value); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private TasksStatus _TaskState = TasksStatus.Stop;
|
||||
public TasksStatus TaskState
|
||||
@ -1523,22 +1589,35 @@ namespace Plane.FormationCreator.Formation
|
||||
Tasks[1].FlytoTime = 2;
|
||||
for (int taskIndex = 2; taskIndex < Tasks.Count; taskIndex++)
|
||||
SetTaskFlytime(taskIndex);
|
||||
Message.Show($"任务时间计算执行完成----");
|
||||
}
|
||||
public void CheckAllTaskFlytime()
|
||||
{
|
||||
if (_copterManager.FC_VER_NO < 3)
|
||||
{
|
||||
Alert.Show("不支持的功能", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
//第一个航点1,是调整航点根据地面摆放情况调整,默认2+1秒
|
||||
//从2开始检查
|
||||
for (int taskIndex = 2; taskIndex < Tasks.Count; taskIndex++)
|
||||
CheckTaskFlytime(taskIndex);
|
||||
Message.Show($"任务检测执行完成----");
|
||||
}
|
||||
|
||||
|
||||
public void SetTaskFlytime(int taskIndex,bool settime=true,float currspeed=-1.0f)
|
||||
public void SetTaskFlytime_v1(int taskIndex, bool settime = true)
|
||||
{
|
||||
double speed = 5.0f; //默认速度
|
||||
|
||||
if ((taskIndex > 0 )&&(taskIndex < Tasks.Count) &&( Tasks[taskIndex].TaskType == FlightTaskType.FlyTo))
|
||||
if ((taskIndex > 0) && (taskIndex < Tasks.Count) && (Tasks[taskIndex].TaskType == FlightTaskType.FlyTo))
|
||||
{
|
||||
if (_copterManager.Copters.Count() > 0)
|
||||
{
|
||||
|
||||
//计算之前航点有没改变速度,有就取最后一次速度
|
||||
if (currspeed==-1.0)
|
||||
//if (currspeed == -1.0)
|
||||
{
|
||||
for (int _taskIndex = taskIndex-1; _taskIndex > 1; _taskIndex--)
|
||||
for (int _taskIndex = taskIndex - 1; _taskIndex > 1; _taskIndex--)
|
||||
|
||||
{
|
||||
var curWaypoint = Tasks[_taskIndex].SingleCopterInfos.FirstOrDefault();
|
||||
@ -1547,13 +1626,10 @@ namespace Plane.FormationCreator.Formation
|
||||
speed = curWaypoint.LevelSpeed;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
double maxDistance = 0.0f;
|
||||
string copterName = "";
|
||||
|
||||
|
||||
foreach (var copter in _copterManager.Copters)
|
||||
{
|
||||
var prevWaypoint = Tasks[taskIndex - 1].SingleCopterInfos.FirstOrDefault(c => c.Copter == copter);
|
||||
@ -1561,7 +1637,7 @@ namespace Plane.FormationCreator.Formation
|
||||
if ((curWaypoint.IsChangeSpeed) && (curWaypoint.LevelSpeed == -1))
|
||||
{
|
||||
Message.Show($"任务{taskIndex + 1}飞机编号:{copter.Id}是自动速度,无法计算时间!");
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
//当前航点是否改变速度,有就取修改的速度
|
||||
@ -1571,29 +1647,285 @@ namespace Plane.FormationCreator.Formation
|
||||
speed = curWaypoint.LevelSpeed;
|
||||
|
||||
}
|
||||
|
||||
|
||||
double distance = GeographyUtils.CalcDistance(
|
||||
prevWaypoint.TargetLat, prevWaypoint.TargetLng, prevWaypoint.TargetAlt,
|
||||
curWaypoint.TargetLat, curWaypoint.TargetLng, curWaypoint.TargetAlt);
|
||||
prevWaypoint.TargetLat, prevWaypoint.TargetLng, prevWaypoint.TargetAlt,
|
||||
curWaypoint.TargetLat, curWaypoint.TargetLng, curWaypoint.TargetAlt);
|
||||
if (distance > maxDistance)
|
||||
{
|
||||
maxDistance = distance;
|
||||
copterName = copter.Name;
|
||||
// speed = curWaypoint.LevelSpeed;
|
||||
// speed = curWaypoint.LevelSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
double time = CalculateFlyIime(maxDistance, speed);
|
||||
Message.Show($"任务{taskIndex+1}最大航点间距 = {Math.Round(maxDistance, 2)}米, 水平速度={Math.Round(speed, 2)}, 飞行时间 = {Math.Round(time, 2)}秒, 飞机编号:{copterName}");
|
||||
Message.Show($"任务{taskIndex + 1}最大航点间距 = {Math.Round(maxDistance, 2)}米, 水平速度={Math.Round(speed, 2)}, 飞行时间 = {Math.Round(time, 2)}秒, 飞机编号:{copterName}");
|
||||
if (settime)
|
||||
Tasks[taskIndex].FlytoTime = (int)Math.Round(time, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
return;
|
||||
}
|
||||
public void SetTaskFlytime_v2(int taskIndex,
|
||||
float acc_xy, float acc_z,
|
||||
float defvel_xy, float defvel_up, float defvel_down,
|
||||
bool settime = true)
|
||||
{
|
||||
if ((taskIndex > 0) && (taskIndex < Tasks.Count) && (Tasks[taskIndex].TaskType == FlightTaskType.FlyTo))
|
||||
{
|
||||
if (_copterManager.Copters.Count() > 0)
|
||||
{
|
||||
string copterName = "";
|
||||
double maxDistance_xy = 0.0f;
|
||||
double maxDistance_z = 0.0f;
|
||||
double maxDistance_up = 0.0f;
|
||||
double maxDistance_down = 0.0f;
|
||||
string copterName_xy = "";
|
||||
string copterName_up = "";
|
||||
string copterName_down = "";
|
||||
|
||||
foreach (var copter in _copterManager.Copters)
|
||||
{
|
||||
var prevWaypoint = Tasks[taskIndex - 1].SingleCopterInfos.FirstOrDefault(c => c.Copter == copter);
|
||||
var curWaypoint = Tasks[taskIndex].SingleCopterInfos.FirstOrDefault(c => c.Copter == copter);
|
||||
|
||||
double distance_xy = GeographyUtils.CalcDistance(
|
||||
prevWaypoint.TargetLat, prevWaypoint.TargetLng, 0,
|
||||
curWaypoint.TargetLat, curWaypoint.TargetLng, 0);
|
||||
double distance_z = curWaypoint.TargetAlt - prevWaypoint.TargetAlt;
|
||||
|
||||
|
||||
if (distance_xy > maxDistance_xy)
|
||||
{
|
||||
maxDistance_xy = distance_xy;
|
||||
copterName_xy = copter.Name;
|
||||
}
|
||||
|
||||
if (Math.Abs(distance_z) > maxDistance_z)
|
||||
{
|
||||
maxDistance_z = Math.Abs(distance_z);
|
||||
}
|
||||
|
||||
|
||||
if (distance_z > 0)
|
||||
{
|
||||
if (distance_z > maxDistance_up)
|
||||
{
|
||||
maxDistance_up = distance_z;
|
||||
copterName_up = copter.Name;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (-distance_z > maxDistance_down)
|
||||
{
|
||||
maxDistance_down = -distance_z;
|
||||
copterName_down = copter.Name;
|
||||
}
|
||||
}
|
||||
}//循环结束
|
||||
|
||||
double time_xy = getMinfligthtime((float)maxDistance_xy, acc_xy, defvel_xy);
|
||||
double time_up = getMinfligthtime((float)maxDistance_up, acc_z, defvel_up);
|
||||
double time_down = getMinfligthtime((float)maxDistance_down, acc_z, defvel_down);
|
||||
double tasktime = time_xy;
|
||||
copterName = copterName_xy;
|
||||
string divstr = "水平";
|
||||
if (time_up > tasktime)
|
||||
{
|
||||
tasktime = time_up;
|
||||
copterName = copterName_up;
|
||||
divstr = "上升";
|
||||
}
|
||||
|
||||
if (time_down > tasktime)
|
||||
{
|
||||
tasktime = time_down;
|
||||
copterName = copterName_down;
|
||||
divstr = "下降";
|
||||
}
|
||||
tasktime = Math.Max(time_xy, time_up);
|
||||
tasktime = Math.Max(tasktime, time_down);
|
||||
Message.Show($"任务{taskIndex + 1}距离:水平{Math.Round(maxDistance_xy, 2)}米;垂直:{Math.Round(maxDistance_z, 2)}米, " +
|
||||
$"最长耗时:{Math.Round(tasktime, 2)}秒,用于{divstr}飞行,编号:{copterName}"
|
||||
);
|
||||
if (settime)
|
||||
Tasks[taskIndex].FlytoTime = (int)Math.Round(tasktime, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
public void SetTaskFlytime(int taskIndex, bool settime = true)
|
||||
{
|
||||
if (taskIndex <= 1)
|
||||
{
|
||||
Message.Show($"无法估计起飞或2号任务飞行时间,请根据现场情况调整");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_copterManager.FC_VER_NO >= 3)
|
||||
{
|
||||
float _acc_xy = FC_acc_xy;
|
||||
float _acc_z = FC_acc_z;
|
||||
float _defvel_xy = FC_defvel_xy;
|
||||
float _defvel_up = FC_defvel_up;
|
||||
float _defvel_down = FC_defvel_down;
|
||||
if (Tasks[taskIndex].SingleCopterInfos.FirstOrDefault().IsChangeSpeed)
|
||||
{
|
||||
_defvel_xy = Tasks[taskIndex].SingleCopterInfos.FirstOrDefault().LevelSpeed;
|
||||
_defvel_up= Tasks[taskIndex].SingleCopterInfos.FirstOrDefault().UpSpeed;
|
||||
_defvel_down = Tasks[taskIndex].SingleCopterInfos.FirstOrDefault().DownSpeed;
|
||||
}
|
||||
|
||||
SetTaskFlytime_v2(taskIndex, _acc_xy, _acc_z, _defvel_xy, _defvel_up, _defvel_down, settime);
|
||||
}
|
||||
else SetTaskFlytime_v1(taskIndex, settime);
|
||||
}
|
||||
//新版本才有的功能,老版本直接提示推出了
|
||||
public void CheckTaskFlytime(int taskIndex)
|
||||
{
|
||||
if ((taskIndex > 0) && (taskIndex < Tasks.Count) && (Tasks[taskIndex].TaskType == FlightTaskType.FlyTo))
|
||||
{
|
||||
if (_copterManager.Copters.Count() > 0)
|
||||
{
|
||||
string copterName = "";
|
||||
double maxDistance_xy = 0.0f;
|
||||
double maxDistance_z = 0.0f;
|
||||
double maxDistance_up = 0.0f;
|
||||
double maxDistance_down = 0.0f;
|
||||
string copterName_xy = "";
|
||||
string copterName_up = "";
|
||||
string copterName_down = "";
|
||||
|
||||
foreach (var copter in _copterManager.Copters)
|
||||
{
|
||||
var prevWaypoint = Tasks[taskIndex - 1].SingleCopterInfos.FirstOrDefault(c => c.Copter == copter);
|
||||
var curWaypoint = Tasks[taskIndex].SingleCopterInfos.FirstOrDefault(c => c.Copter == copter);
|
||||
|
||||
double distance_xy = GeographyUtils.CalcDistance(
|
||||
prevWaypoint.TargetLat, prevWaypoint.TargetLng, 0,
|
||||
curWaypoint.TargetLat, curWaypoint.TargetLng, 0);
|
||||
double distance_z = curWaypoint.TargetAlt - prevWaypoint.TargetAlt;
|
||||
|
||||
|
||||
if (distance_xy > maxDistance_xy)
|
||||
{
|
||||
maxDistance_xy = distance_xy;
|
||||
copterName_xy = copter.Name;
|
||||
}
|
||||
|
||||
if (Math.Abs(distance_z) > maxDistance_z)
|
||||
{
|
||||
maxDistance_z = Math.Abs(distance_z);
|
||||
}
|
||||
|
||||
|
||||
if (distance_z > 0)
|
||||
{
|
||||
if (distance_z > maxDistance_up)
|
||||
{
|
||||
maxDistance_up = distance_z;
|
||||
copterName_up = copter.Name;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (-distance_z > maxDistance_down)
|
||||
{
|
||||
maxDistance_down = -distance_z;
|
||||
copterName_down = copter.Name;
|
||||
}
|
||||
}
|
||||
}//循环结束
|
||||
|
||||
double time_xy = getMinfligthtime((float)maxDistance_xy, FC_acc_xy, FC_maxvel_xy);
|
||||
double time_up = getMinfligthtime((float)maxDistance_up, FC_acc_z, FC_maxvel_up);
|
||||
double time_down = getMinfligthtime((float)maxDistance_down, FC_acc_z, FC_maxvel_down);
|
||||
double tasktime = time_xy;
|
||||
copterName = copterName_xy;
|
||||
string divstr = "水平";
|
||||
if (time_up > tasktime)
|
||||
{
|
||||
tasktime = time_up;
|
||||
copterName = copterName_up;
|
||||
divstr = "上升";
|
||||
}
|
||||
|
||||
if (time_down > tasktime)
|
||||
{
|
||||
tasktime = time_down;
|
||||
copterName = copterName_down;
|
||||
divstr = "下降";
|
||||
}
|
||||
tasktime = Math.Max(time_xy, time_up);
|
||||
tasktime = Math.Max(tasktime, time_down);
|
||||
if (Tasks[taskIndex].FlytoTime < tasktime)
|
||||
{
|
||||
|
||||
Message.Show($"任务{taskIndex + 1}距离:水平{Math.Round(maxDistance_xy, 2)}米;垂直:{Math.Round(maxDistance_z, 2)}米, " +
|
||||
$"目前飞行时间:{Tasks[taskIndex].FlytoTime}秒,最少需要:{Math.Round(tasktime, 2)}秒,用于{divstr}飞行,编号:{copterName}"
|
||||
);
|
||||
if (Alert.Show($"任务{taskIndex + 1}时间过短,目前{Tasks[taskIndex].FlytoTime}秒至少{Math.Round(tasktime, 2)}秒才能全部飞到目标,需要更改吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Warning)
|
||||
== MessageBoxResult.OK)
|
||||
{
|
||||
Message.Show($"任务{taskIndex + 1}飞行时间{Tasks[taskIndex].FlytoTime}秒更改为{Math.Round(tasktime, 0)}秒");
|
||||
Tasks[taskIndex].FlytoTime = (int)Math.Round(tasktime, 0);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
float fabsf(float vvalue)
|
||||
{
|
||||
return Math.Abs(vvalue);
|
||||
|
||||
}
|
||||
float sqrt(float vvalue)
|
||||
{
|
||||
return (float)Math.Sqrt(vvalue);
|
||||
|
||||
}
|
||||
|
||||
|
||||
float getMinfligthtime(float Distance, float fc_acc, float fc_maxspeed)
|
||||
{
|
||||
if ((Distance == 0) || (fc_acc == 0) || (fc_maxspeed == 0)) return 0;
|
||||
float fDis = fabsf(Distance);
|
||||
float facc = fabsf(fc_acc);
|
||||
|
||||
float realflytime = 0.0f;
|
||||
//计算一半的距离
|
||||
float hafdis = (fDis / 2);
|
||||
//计算最大速度
|
||||
float vel = (float)sqrt(2 * facc * hafdis);
|
||||
//如果速度超过最大速度
|
||||
if (vel > fc_maxspeed)
|
||||
//使用最大速度
|
||||
vel = fc_maxspeed;
|
||||
//加速时间
|
||||
float acctim = vel / facc;
|
||||
//加速距离
|
||||
float accdis = vel * vel / (2 * facc);
|
||||
//匀速段时间
|
||||
float vtime = (hafdis - accdis) / vel;
|
||||
//到一半的时间
|
||||
float haftime = acctim + vtime;
|
||||
realflytime = haftime * 2;
|
||||
return realflytime;
|
||||
}
|
||||
|
||||
public static double CalculateFlyIime(double s, double v)
|
||||
{
|
||||
@ -2459,6 +2791,40 @@ namespace Plane.FormationCreator.Formation
|
||||
if (readvalue != "" && int.TryParse(readvalue, out intTemp))
|
||||
Orientation = int.Parse(readvalue);
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_acc_xy");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_acc_xy = float.Parse(readvalue);
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_acc_z");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_acc_z = float.Parse(readvalue);
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_maxvel_xy");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_maxvel_xy = float.Parse(readvalue);
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_maxvel_up");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_maxvel_up = float.Parse(readvalue);
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_maxvel_down");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_maxvel_down = float.Parse(readvalue);
|
||||
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_defvel_xy");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_defvel_xy = float.Parse(readvalue);
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_defvel_up");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_defvel_up = float.Parse(readvalue);
|
||||
|
||||
readvalue = inifilse.IniReadvalue("Default", "FC_defvel_down");
|
||||
if (readvalue != "" && float.TryParse(readvalue, out floatTemp))
|
||||
FC_defvel_down = float.Parse(readvalue);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -61,7 +61,16 @@ namespace Plane.FormationCreator.Formation
|
||||
public bool IsLandWaypoint
|
||||
{
|
||||
get { return _IsLandWaypoint; }
|
||||
set { Set(nameof(IsLandWaypoint), ref _IsLandWaypoint, value); }
|
||||
set {
|
||||
|
||||
Set(nameof(IsLandWaypoint), ref _IsLandWaypoint, value);
|
||||
if (_flightTaskManager.SelectedTask == null) return;
|
||||
foreach (FlightTaskSingleCopterInfo info in _flightTaskManager.SelectedTask.SingleCopterInfos)
|
||||
{
|
||||
info._IsLandWaypoint = _IsLandWaypoint;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private bool _IsChangeSpeed = false;
|
||||
@ -72,7 +81,15 @@ namespace Plane.FormationCreator.Formation
|
||||
public bool IsChangeSpeed
|
||||
{
|
||||
get {return _IsChangeSpeed; }
|
||||
set { Set(nameof(IsChangeSpeed), ref _IsChangeSpeed, value); }
|
||||
set {
|
||||
Set(nameof(IsChangeSpeed), ref _IsChangeSpeed, value);
|
||||
if (_flightTaskManager.SelectedTask == null) return;
|
||||
foreach (FlightTaskSingleCopterInfo info in _flightTaskManager.SelectedTask.SingleCopterInfos)
|
||||
{
|
||||
info._IsChangeSpeed = _IsChangeSpeed;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -83,7 +100,14 @@ namespace Plane.FormationCreator.Formation
|
||||
public float LevelSpeed
|
||||
{
|
||||
get { return _LevelSpeed; }
|
||||
set { Set(nameof(LevelSpeed), ref _LevelSpeed, value); }
|
||||
set {
|
||||
Set(nameof(LevelSpeed), ref _LevelSpeed, value);
|
||||
if (_flightTaskManager.SelectedTask == null) return;
|
||||
foreach (FlightTaskSingleCopterInfo info in _flightTaskManager.SelectedTask.SingleCopterInfos)
|
||||
{
|
||||
info._LevelSpeed = _LevelSpeed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -94,7 +118,14 @@ namespace Plane.FormationCreator.Formation
|
||||
public float UpSpeed
|
||||
{
|
||||
get { return _UpSpeed; }
|
||||
set { Set(nameof(UpSpeed), ref _UpSpeed, value); }
|
||||
set {
|
||||
Set(nameof(UpSpeed), ref _UpSpeed, value);
|
||||
if (_flightTaskManager.SelectedTask == null) return;
|
||||
foreach (FlightTaskSingleCopterInfo info in _flightTaskManager.SelectedTask.SingleCopterInfos)
|
||||
{
|
||||
info._UpSpeed = _UpSpeed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float _DownSpeed = 1.5f;
|
||||
@ -104,7 +135,14 @@ namespace Plane.FormationCreator.Formation
|
||||
public float DownSpeed
|
||||
{
|
||||
get { return _DownSpeed; }
|
||||
set { Set(nameof(DownSpeed), ref _DownSpeed, value); }
|
||||
set {
|
||||
Set(nameof(DownSpeed), ref _DownSpeed, value);
|
||||
if (_flightTaskManager.SelectedTask == null) return;
|
||||
foreach (FlightTaskSingleCopterInfo info in _flightTaskManager.SelectedTask.SingleCopterInfos)
|
||||
{
|
||||
info._DownSpeed = _DownSpeed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1409,7 +1409,7 @@ namespace Plane.FormationCreator.ViewModels
|
||||
DateTime MissionTime_log = DateTime.Now.AddSeconds(5);
|
||||
Message.Show("任务开始:" + MissionTime_log.ToString());
|
||||
//循环3次 发送起飞命令 避免通信问题
|
||||
for (int i = 0; i < 20; i++)
|
||||
for (int i = 0; i < 20; i++) //20
|
||||
{
|
||||
await _commModuleManager.DoMissionStartAsync(null,
|
||||
MissionTime.Hour,
|
||||
@ -1583,7 +1583,7 @@ namespace Plane.FormationCreator.ViewModels
|
||||
await _RtcmInfoViewModel.RtcmManager.Close(_RtcmInfoViewModel.SerialPortsSelectdValue);
|
||||
}
|
||||
|
||||
Alert.Show("开始写入航点,请稍等!(先关灯再开可恢复飞机灯光)", "提示");
|
||||
Alert.Show("开始写入航点,飞机绿色成功红色失败!(先关灯再开灯可恢复飞机灯光)", "提示");
|
||||
_commModuleManager.ClearMissionWriteState();
|
||||
for (int i = 0; i < coptercount; i++)
|
||||
{
|
||||
@ -1615,14 +1615,14 @@ namespace Plane.FormationCreator.ViewModels
|
||||
switch (_flightTaskManager.Tasks[j].TaskType)
|
||||
{
|
||||
case FlightTaskType.TakeOff:
|
||||
int takeofftime = (int)(_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetAlt / 2.5 + 5);
|
||||
//int takeofftime = (int)(_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetAlt / 2.5 + 5);
|
||||
missions.AddRange(CreateLEDMissions(_flightTaskManager.Tasks[j].SingleCopterInfos[i].LEDInfos));
|
||||
missions.Add(Mission.CreateTakeoffMission(
|
||||
_flightTaskManager.Tasks[j].SingleCopterInfos[i].TakeOffWaitTime,
|
||||
_flightTaskManager.Tasks[j].TakeOffTime,
|
||||
_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLat - _flightTaskManager.OriginLat,
|
||||
_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLng - _flightTaskManager.OriginLng,
|
||||
_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetAlt - groudAlt)
|
||||
_flightTaskManager.Tasks[j].SingleCopterInfos[i].TakeOffWaitTime, //起飞等待时间
|
||||
_flightTaskManager.Tasks[j].TakeOffTime, //起飞时间
|
||||
_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLat - _flightTaskManager.OriginLat, //位置没用
|
||||
_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLng - _flightTaskManager.OriginLng, //位置没用
|
||||
_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetAlt - groudAlt) //下一个航点的高度
|
||||
);
|
||||
break;
|
||||
|
||||
@ -1639,6 +1639,7 @@ namespace Plane.FormationCreator.ViewModels
|
||||
|
||||
double Lat = _flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLat - _flightTaskManager.OriginLat;
|
||||
double Lng = _flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLng - _flightTaskManager.OriginLng;
|
||||
//如果是返航点,位置写入固定值,这样直接返回起飞点
|
||||
if (_flightTaskManager.Tasks[j].SingleCopterInfos[i].IsLandWaypoint)
|
||||
{
|
||||
Lat = 90;
|
||||
@ -1665,30 +1666,37 @@ namespace Plane.FormationCreator.ViewModels
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//虚拟ID在排序时已经变为ID了,直接按ID写入
|
||||
// var targetCopter = _copterManager.Copters.FirstOrDefault(o => o.VirtualId == (i+1));
|
||||
// bool result = await _commModuleManager.WriteMissionListAsync(targetCopter, missions);
|
||||
bool result = await _commModuleManager.WriteMissionListAsync(_copterManager.Copters[i], missions);
|
||||
|
||||
//CommWriteMissinState state = new CommWriteMissinState(result);
|
||||
//_commModuleManager.missionWriteState.Add(int.Parse(_copterManager.Copters[i].Id), state);
|
||||
if (!result)
|
||||
//186是通讯模块的限制--张伟那边
|
||||
if (missions.Count > 186)
|
||||
{
|
||||
|
||||
if (_copterManager.SortType == CopterManager.CopterSortType.ByVID)
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].VirtualId} 通信模块传输失败!");
|
||||
else
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].Id} 通信模块传输失败!");
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].VirtualId} 航点数量超过186,请减少再重写该飞机!");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_copterManager.SortType == CopterManager.CopterSortType.ByVID)
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].VirtualId} 通信模块传输完成!");
|
||||
//虚拟ID在排序时已经变为ID了,直接按ID写入
|
||||
// var targetCopter = _copterManager.Copters.FirstOrDefault(o => o.VirtualId == (i+1));
|
||||
// bool result = await _commModuleManager.WriteMissionListAsync(targetCopter, missions);
|
||||
bool result = await _commModuleManager.WriteMissionListAsync(_copterManager.Copters[i], missions);
|
||||
|
||||
//CommWriteMissinState state = new CommWriteMissinState(result);
|
||||
//_commModuleManager.missionWriteState.Add(int.Parse(_copterManager.Copters[i].Id), state);
|
||||
if (!result)
|
||||
{
|
||||
|
||||
if (_copterManager.SortType == CopterManager.CopterSortType.ByVID)
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].VirtualId} 通信模块传输失败!");
|
||||
else
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].Id} 通信模块传输失败!");
|
||||
}
|
||||
else
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].Id} 通信模块传输完成!");
|
||||
{
|
||||
if (_copterManager.SortType == CopterManager.CopterSortType.ByVID)
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].VirtualId} 通信模块传输完成!");
|
||||
else
|
||||
Message.Show($"飞机:{_copterManager.Copters[i].Id} 通信模块传输完成!");
|
||||
}
|
||||
await Task.Delay(500).ConfigureAwait(false);
|
||||
}
|
||||
await Task.Delay(500).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -920,7 +920,7 @@ namespace Plane.FormationCreator.ViewModels
|
||||
return _AutoWayPointAllTmCommand ?? (_AutoWayPointAllTmCommand = new RelayCommand<int>(async =>
|
||||
{
|
||||
|
||||
if (Alert.Show("本操作将导致所有任务飞行时间重新计算,您确定要继续吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Warning)
|
||||
if (Alert.Show("本操作将导致2号任务以后所有任务飞行时间重新计算(不修改悬停时间),您确定要继续吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Warning)
|
||||
== MessageBoxResult.OK)
|
||||
{
|
||||
_flightTaskManager.SetAllTaskFlytime();
|
||||
@ -929,8 +929,24 @@ namespace Plane.FormationCreator.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private ICommand _OptimizeRouteCommandRet;
|
||||
private ICommand _CheckTmCommand;
|
||||
public ICommand CheckTmCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
return _CheckTmCommand ?? (_CheckTmCommand = new RelayCommand<int>(async =>
|
||||
{
|
||||
|
||||
if (Alert.Show("本操作将检测2号任务以后所有任务飞行时间是否合理,您确定要继续吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Warning)
|
||||
== MessageBoxResult.OK)
|
||||
{
|
||||
_flightTaskManager.CheckAllTaskFlytime();
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
private ICommand _OptimizeRouteCommandRet;
|
||||
public ICommand OptimizeRouteCommandRet
|
||||
{
|
||||
get
|
||||
|
@ -94,7 +94,7 @@
|
||||
Margin="0,5,5,0" Width="105"
|
||||
Command="{Binding BackTakeOffPointCommand}" />
|
||||
|
||||
<Button Margin="0,5,5,0" Content="估计时间" Width="105" Command="{Binding AutoWayPointTmCommand}"/>
|
||||
<Button Margin="0,5,5,0" Content="计算时间" Width="105" Command="{Binding AutoWayPointTmCommand}"/>
|
||||
|
||||
|
||||
</StackPanel>
|
||||
@ -242,7 +242,7 @@
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<CheckBox Content="返航点" ToolTip="勾选后航点仅高度有用,经纬度无效,无视原点自动飞回起飞点" Margin="0,5,0,0" IsChecked="{Binding IsLandWaypoint,UpdateSourceTrigger=PropertyChanged}" />
|
||||
<Button Content="应用到所选" Margin="0,2,5,0" Command="{Binding SetIsLandCommand}" Grid.Column="1"/>
|
||||
<Button Content="影响所有飞机" Margin="0,2,5,0" IsEnabled="False" Command="{Binding SetIsLandCommand}" Grid.Column="1"/>
|
||||
|
||||
|
||||
</Grid>
|
||||
@ -259,7 +259,7 @@
|
||||
<RowDefinition/>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
<CheckBox Content="改变速度" Margin="0,3"
|
||||
<CheckBox Content="改变最大速度" Margin="0,3"
|
||||
IsChecked="{Binding IsChangeSpeed, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
<StackPanel Margin="0,0" Grid.Column="1">
|
||||
<TextBlock Text="水平" Margin="0,0,5,5" VerticalAlignment="Center" HorizontalAlignment="Left"/>
|
||||
@ -272,7 +272,7 @@
|
||||
<TextBox Width="45" Margin="5,0,5,5" VerticalAlignment="Center"
|
||||
Text="{Binding DownSpeed, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
</StackPanel>
|
||||
<Button Content="应用到所选" Margin="5,0,5,5" Grid.Row="1" Grid.Column="1" Command="{Binding SetIsChangeCommand}"/>
|
||||
<Button Content="改变后需重新计算飞行时间" IsEnabled="False" Margin="5,0,5,5" Grid.Row="1" Grid.Column="1" Command="{Binding SetIsChangeCommand}"/>
|
||||
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
@ -570,8 +570,10 @@
|
||||
<StackPanel Orientation="Horizontal" Margin="0,5,0,5" >
|
||||
<Button Width="120" Margin="10,5,0,5" Content="导入外部航点" Command="{Binding ImportBlenderWayPointCommand}"/>
|
||||
<Button Width="120" Margin="10,5,0,5" Content="导入起飞位置" Command="{Binding ImportBlenderCopterPosCommand}"/>
|
||||
<Button Width="120" Content="自动飞行时间" Margin="10,5,0,5"
|
||||
<Button Width="120" Content="计算飞行时间" Margin="10,5,0,5"
|
||||
Command="{Binding AutoWayPointAllTmCommand}" HorizontalAlignment="Right" />
|
||||
<Button Width="120" Content="检查飞行时间" Margin="10,5,0,5"
|
||||
Command="{Binding CheckTmCommand}" HorizontalAlignment="Right" />
|
||||
<Button Width="120" Content="飞行图案" Margin="10,5,0,5"
|
||||
Command="{Binding SetHorseRaceLampCommand}" Visibility="Collapsed" HorizontalAlignment="Right" Height="26"/>
|
||||
</StackPanel>
|
||||
|
Loading…
Reference in New Issue
Block a user