目录
前面章节已经描述清楚指令和航点的上传,有些优化和功能测试的工作在接下来的章节里面完成
1、GMAP图片加载
我们要实现上图所示的地面站上实时显示载具的位置和方向信息。这就需要GMPA图层的相关知识,关于图层就介绍在前面几章有提到,在本章节的目录里面有个网址也详细介绍了图层的相关知识。
public void addvehiclemarker(double lat, double lng, float angle)
{
if (vehiVleMarker != null)
{
realRouteOverlay.Markers.Remove(vehiVleMarker);//删除上一个地址的图标
}
try
{
PointLatLng point = new PointLatLng(lat, lng);
Size size = new Size(50, 50);
Bitmap bitmap = new Bitmap(global::Amov.Planner.Properties.Resources._01_05,size);//在picture文件夹下找到要加载的图标
vehiVleMarker = new GMarkerGoogle(point, KiRotate(bitmap,angle,Color.Transparent));//得到根据yaw角指向的图标
realRouteOverlay.Markers.Add(vehiVleMarker);//添加该图标到这个图层
}
catch (Exception) { }
}
核心代码如上,新建的位图bitmap里面直接加载了源代码picture里面的一副图片,根据控制器yaw角的角度对于图标做了旋转,让图标既可以显示位置也可以在地图上更具载具的机头朝向实时显示在地图上。
2、实时路径显示与地图纠偏
要利用得到的GPS数据,在GMAP上显示出载具的实时轨迹。在GMAP上规划点比较容易,但是每个点应该具有清除操作,就是数据航点可定是清楚以前的航点。
if (MAV.cs.gpshdop < 3 && MAV.cs.satcount > 6)//GPS信号比较良好的情况下实时显示载具轨迹
{
swpc.DrawWaypoint(gMap.Position, swpc.realRouteOverlay);
}
因为国内的地图数据都是有偏差的,所有地图都要数据纠偏,在MP的代码里面的GMAP的库,都是有纠偏函数的,所有如果用的MP里面的GMAP库,自带纠偏,如果从GMAP官网下载的库,那么就需要纠偏函数。在MP里面的纠偏函数如下:
public class MercatorProjectionGCJ : PureProjection
{
....
private static bool outOfChina(double lat, double lon)
{
if (((lon >= 72.004) && (lon <= 137.8347)) && ((lat >= 0.8293) && (lat <= 55.8271)))
{
return false;
}
return true;
}
private void transform(double wgLat, double wgLon, double[] latlng)
{
if (outOfChina(wgLat, wgLon))
{
latlng[0] = wgLat;
latlng[1] = wgLon;
}
else
{
double num = this.transformLat(wgLon - 105.0, wgLat - 35.0);
double num2 = this.transformLon(wgLon - 105.0, wgLat - 35.0);
double a = (wgLat / 180.0) * 3.1415926535897931;
double d = Math.Sin(a);
d = 1.0 - ((this.ee * d) * d);
double num5 = Math.Sqrt(d);
num = (num * 180.0) / (((this.a * (1.0 - this.ee)) / (d * num5)) * 3.1415926535897931);
num2 = (num2 * 180.0) / (((this.a / num5) * Math.Cos(a)) * 3.1415926535897931);
latlng[0] = wgLat + num;
latlng[1] = wgLon + num2;
}
}
............
}
也比较简单注意纠偏数据即可,如果使用MP里面的GMAP库是自带的,如果用GMAP官方的注意下即可。一般的地面站地图选着均为谷歌中国卫星地图,因为这个地图是更新最好的地图,其他地图的更新比较慢。地图精度对比:基本上没有太大的差异。
3、指令发送的添加
mavlink协议的指令添加在前面也讲过,其实mavlink的指令添加要结合控制器端的代码来联合调试,因为官方代码更新的频率很快所以很多指令的支持在新版本的代码里面不一定响应,请结合飞控代码一起调试。在进入RC通道的模拟遥控器控制载具的时候,控制板的默认遥控器完全失效,这时候PC地面站完全剥夺了控制权这是要注意的地方。(最近测试这个和控制板代码的版本有关系,我们下载的测试版代码可以同时控制),就是比较简单的指令发送。
MAVLink.mavlink_rc_channels_override_t rc = new MAVLink.mavlink_rc_channels_override_t();
// isend = true;
// while (isend)
// {
ushort number = ushort.Parse(ch_textBox.Text);
rc.chan1_raw = (ushort)(1480 + number);
rc.chan2_raw = (ushort)1480;
rc.chan3_raw = (ushort)1480;
rc.target_component = dv1.comPort.MAV.compid;
rc.target_system = dv1.comPort.MAV.sysid;
dv1.comPort.sendPacket(rc, rc.target_system, rc.target_component);//发送RC的mavlink消息指令包
System.Threading.Thread.Sleep(20);
响应按键事件发生指令到控制板
private void Function_KeyDown(object sender, KeyEventArgs e)
private void Function_KeyUp(object sender, KeyEventArgs e)
为按键触发函数,选择的是常用的WASD游戏按键作为,载具的方向控制按键。
-
窗体属性设置为TURE
-
按键松开检测绑定