我是靠谱客的博主 欢呼小蜜蜂,最近开发中收集的这篇文章主要介绍MissionPlanner源码分析----WP航点设计相关,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

航点读写步骤

关于航点设计方面的代码,我只阅读了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会读取飞控的航点。
FlightPlannerFlightData界面

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航点设计相关所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部