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);
	}
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值