目录
1、界面布局
这边是参考了拓攻地面站的布局,但是基本上还是不一样的,删除MP地面站原本的冗余模式。只保留基本的信息显示和重要的消息和控制指令。飞机在目前的课程上这个地面站上是无法完成校准和参数设置的。这一阶段的地面站只考虑基本的功能,也是方便用户使用的地面站。目标是简洁,易于使用。因为要考虑到多机控制,所以该地面站设计有一个多机控制界面,多机控制界面是另外一个菜单界面,和这个界面还是有很大的不同。在多机控制那一章节会有介绍,这里不做讨论。
2、基本参数的显示
基本参数采用的是TabControl控件完成的菜单切换功能,里面是一些基本的数据信息和一些控制指令,显示高度,距离,空速,飞行时间等等。在基本操作里面是对飞控的一般的控制指令,前后左右方向,开伞,或者直接控制舵机的一些指令
3、UI初步设计
UI的设计第一点是布局的设计,这部分如果是大型软件,都是有专门的UI设计工程师来完成。包含人机交互,设计美学功底,甚至要有使用工程师的高度参与。这也是为什么不同的地面站,外观差别很大。这和软件的设计理念有很大关系,向MP的地面站,因为是考虑给研发调试人员用的,所以有比较丰富调试接口。但是这样就给实际使用带来了冗余,也导致了软件会有BUG,带来了软件的不稳定性。单纯从使用功能上讲地面站软件不是一个非常复杂的软件,是一个中等规模的软件。这也是我们设计软件的出发点,功能尽量简洁够用,然后逐步细化,优化。长期维护一个相对比较简洁到的地面站。如果对于界面的UI设计,有特殊要求的,可以修改,包括HUD界面都是底层的绘图操作,还是比较简单的。市场上也有很多提供现成航空UI控件,可以授权购买,也很方便。适配屏幕的dock操作也是重点
4 、数传端口打开
数传端口主要是设计打开数传连接和关闭数传连接,涉及到连接成功的检查,还有数传连接的信号强度设计显示。 理解:
dv1 = new Device()类
dv1.Start();//start函数完成的功能
异步显示反馈对话框 ProgressReporterDialogue
连接寻找心跳包的委托 FrmProgressReporterDoWorkNOParams
5、GPS卫星数据显示
Gps_nmulabel.Text = MAV.cs.satcount.ToString();//显示GPS卫星数量
CurrentState 重点是这个状态类的理解,里面存放了飞控的所有状态,是一个飞控mavlink消息的缓冲区。
6、电量显示
系统状态包里面是显示系统电量的,系统电量的显示,要校准飞控测量出的电压和真实电量电压,得出校准偏移量。
public struct mavlink_sys_status_t
{
/// <summary> Bitmask showing which onboard controllers and sensors are present. Value of 0: not present. Value of 1: present. Indices defined by ENUM MAV_SYS_STATUS_SENSOR MAV_SYS_STATUS_SENSOR</summary>
public /*MAV_SYS_STATUS_SENSOR*/uint onboard_control_sensors_present;
/// <summary> Bitmask showing which onboard controllers and sensors are enabled: Value of 0: not enabled. Value of 1: enabled. Indices defined by ENUM MAV_SYS_STATUS_SENSOR MAV_SYS_STATUS_SENSOR</summary>
public /*MAV_SYS_STATUS_SENSOR*/uint onboard_control_sensors_enabled;
/// <summary> Bitmask showing which onboard controllers and sensors are operational or have an error: Value of 0: not enabled. Value of 1: enabled. Indices defined by ENUM MAV_SYS_STATUS_SENSOR MAV_SYS_STATUS_SENSOR</summary>
public /*MAV_SYS_STATUS_SENSOR*/uint onboard_control_sensors_health;
/// <summary> Maximum usage in percent of the mainloop time, (0%: 0, 100%: 1000) should be always below 1000 </summary>
public ushort load;
/// <summary> Battery voltage, in millivolts (1 = 1 millivolt) </summary>
public ushort voltage_battery;
/// <summary> Battery current, in 10*milliamperes (1 = 10 milliampere), -1: autopilot does not measure the current </summary>
public short current_battery;
/// <summary> Communication drops in percent, (0%: 0, 100%: 10'000), (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV) </summary>
public ushort drop_rate_comm;
/// <summary> Communication errors (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV) </summary>
public ushort errors_comm;
/// <summary> Autopilot-specific errors </summary>
public ushort errors_count1;
/// <summary> Autopilot-specific errors </summary>
public ushort errors_count2;
/// <summary> Autopilot-specific errors </summary>
public ushort errors_count3;
/// <summary> Autopilot-specific errors </summary>
public ushort errors_count4;
/// <summary> Remaining battery energy: (0%: 0, 100%: 100), -1: autopilot estimate the remaining battery </summary>
public byte battery_remaining;
};
7、飞控模式状态显示
System_modelabel.Text = MAV.cs.mode;//mode飞机当前模式状态
Firmware_label.Text = MAV.cs.firmware.ToString();//固件类型
8、飞控数据报错显示
messageHight为系统报错的成员,系统的一些报错在里这里面显示。注意:这个成员函数对于Ardupilot固件是有效的,PX4的系统报错显示不是用的这个消息成员。这个变量在PX4固件里面是没法打印出来的,需要根据PX4源码的mavlink部分来调试解析,因为这个MAVLINK库是从Missionplanner处剥离出来的,所以有一部分代码是对PX4的兼容性不是很好,我们需要分析PX4的源码来修改一些地方。这个源码框架我也比较建议是不同固件做不同的编写,比如四旋翼是四
旋翼的地面站,固定翼是固定翼专门的地面站,PX4是专门的地面站。不在一个地面站里面做所有机型,飞控的兼容性配置,这样会极大的降低地面站编写的复杂程度。
if (massag_error != MAV.cs.messageHigh)//如果这次的报错和上次的不一样,就更新本次的报错内容,防止textbox重复循环打印报错
{
Error_box.AppendText("错误/警告:" + dv1.comPort.MAV.cs.messageHigh + "\r\n");
}
massag_error = MAV.cs.messageHigh;