概述
航点读写步骤
关于航点设计方面的代码,我只阅读了MainV2.cs文件,FlightPlanner.cs、FlightData.cs文件,在使用MP(MissionPlanner 缩写,在之后,我都会用这个缩写来代替)时,一般先在FlightPlanner.cs中,Gmap上,规划好航点,然后点击“Write WPs“按钮将航点发送到飞控(无人设备),再通过“Read Wps”,从飞控中读取航点。
地图显示效果
当在FlightPlanner.cs中,Gmap上设计好航点,并点击点击“Write WPs“按钮时(飞控和地面站处于连接状态下),在FlightData.cs界面上,将会显示在FlightPlanner.cs中规划好的航点,所以我认为,FlightData.cs会读取飞控的航点。
FlightData.cs读取飞控的航点核心代码
在FlightData_Load方法中,开辟了一个新的线程thisthread,该线程将会执行mainloop方法,该方法中的while循环,将用于更新FlightData界面的所有数据数据源。
和航点相关的核心代码
if (waypoints.AddSeconds(5) < DateTime.Now)
{
//Console.WriteLine("Doing FD WP's");
updateClearMissionRouteMarkers();
var wps = MainV2.comPort.MAV.wps.Values.ToList();
if (wps.Count >= 1)
{
var homeplla = new PointLatLngAlt(MainV2.comPort.MAV.cs.HomeLocation.Lat,
MainV2.comPort.MAV.cs.HomeLocation.Lng,
MainV2.comPort.MAV.cs.HomeLocation.Alt / CurrentState.multiplieralt, "H");
var overlay = new WPOverlay();
{
List<Locationwp> mission_items;
mission_items = MainV2.comPort.MAV.wps.Values.Select(a => (Locationwp)a).ToList();
mission_items.RemoveAt(0);
}
if (wps.Count == 1)
{
overlay.CreateOverlay((MAVLink.MAV_FRAME)wps[0].frame, homeplla,
mission_items,
0 / CurrentState.multiplieralt, 0 / CurrentState.multiplieralt);
}
else
{
overlay.CreateOverlay((MAVLink.MAV_FRAME)wps[1].frame, homeplla,
mission_items,
0 / CurrentState.multiplieralt, 0 / CurrentState.multiplieralt);
}
}
var existing = gMapControl1.Overlays.Where(a => a.Id == overlay.overlay.Id).ToList();
foreach (var b in existing)
{
gMapControl1.Overlays.Remove(b);
}
gMapControl1.Overlays.Insert(1, overlay.overlay);
overlay.overlay.ForceUpdate();
distanceBar1.ClearWPDist();//清空distanceBar1上的航点距离
var i = -1;
var travdist = 0.0;
var lastplla = overlay.pointlist.First();
foreach (var plla in overlay.pointlist)
{
i++;
if (plla == null)
continue;
var dist = lastplla.GetDistance(plla);
distanceBar1.AddWPDist((float) dist);
if (i <= MainV2.comPort.MAV.cs.wpno)
{
travdist += dist;
}
}
travdist -= MainV2.comPort.MAV.cs.wp_dist;
if (MainV2.comPort.MAV.cs.mode.ToUpper() == "AUTO")
distanceBar1.traveleddist = (float) travdist;
}
RegeneratePolygon();
// update rally points
rallypointoverlay.Markers.Clear();
foreach (var mark in MainV2.comPort.MAV.rallypoints.Values)
{
rallypointoverlay.Markers.Add(new GMapMarkerRallyPt(mark));
}
// optional on Flight data
if (MainV2.ShowAirports)
{
// airports => 机场
foreach (var item in Airports.getAirports(gMapControl1.Position).ToArray())
{
try
{
rallypointoverlay.Markers.Add(new GMapMarkerAirport(item)
{
ToolTipText = item.Tag,
ToolTipMode = MarkerTooltipMode.OnMouseOver
});
}
catch (Exception e)
{
log.Error(e);
}
}
}
waypoints = DateTime.Now;
}
下面这段代码,将从飞控上读取到的航点信息,封装到List列表中。
List<Locationwp> mission_items
mission_items = MainV2.comPort.MAV.wps.Values.Select(a => (Locationwp)a).ToList();
再在图层中,创建航点
if (wps.Count == 1)
{
overlay.CreateOverlay((MAVLink.MAV_FRAME)wps[0].frame, homeplla,
mission_items,
0 / CurrentState.multiplieralt, 0 / CurrentState.multiplieralt);
}
else
{
overlay.CreateOverlay((MAVLink.MAV_FRAME)wps[1].frame, homeplla,
mission_items,
0 / CurrentState.multiplieralt, 0 / CurrentState.multiplieralt);
}
最后
以上就是欢呼小蜜蜂为你收集整理的MissionPlanner源码分析----WP航点设计相关的全部内容,希望文章能够帮你解决MissionPlanner源码分析----WP航点设计相关所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复