航模爱好趣无穷,正确操纵是关键。莫把器材当玩具,忽视安全悔一生。
新手好问勤练习,远离人群勿炫耀。天下模友一家人,共建美好新生活。
5iMX宗旨:分享遥控模型兴趣爱好

5iMX会员稀缺商品(仅限本周):
DJI Goggles飞行眼镜现货(2999元,即拍即发不加价包顺丰)


5iMX.com 我爱模型 玩家论坛 ——中国最具人气和影响力的综合模型论坛(注册会员超30万,创始于2003年)
楼主: scaple

UAV 地面站软件开发平台 Control Station Studio (306楼 重要功能实现 9.12

  [复制链接]
 楼主| 发表于 2013-8-18 01:38 | 显示全部楼层
点击查看详情
本帖最后由 scaple 于 2013-8-18 01:50 编辑
瑞云和风 发表于 2013-8-10 14:32
仔细看完了楼主的这个帖子,对楼主无比佩服啊,能自己做地面站真是强人啊,相信你应该是个团队吧,我最近 ...

您有什么具体问题在论坛里提出来吧,我会尽量解答的,大伙一块研究恐怕效果更好一些。
问题最好具体一点,这样比较有针对性。


欢迎继续阅读楼主其他信息

 楼主| 发表于 2013-8-18 01:48 | 显示全部楼层
对 tlog 格式遥测数据记录进行操作的类基本完成了。发现几个好玩的地方:

1、MissonPlanner 对遥测数据回放的刷新率大概只能达到 1FPS,难怪总感觉到 MP 在回放数据时不是很流畅。

2、发现几个在标准 mavlink 协议之外的消息,不过也可能是我手上 mavlink 协议版本旧了,也有可能是 mavlink 协议更新了但文档还没有更新,还有可能是 APM 团队在标准 mavlink 协议之外又进行了扩展......无所谓了,对于这种标准 mavlink 协议之外的 message,CSS 准备好了自定义扩展帧这个机制来进行处理,用不着出现一个新 message 就修改程序一次来着...
这几个新消息是:
0x98  mavlink_meminfo_t brkval
0xA3 mavlink_ahrs_t
0xA5 mavlink_hwstatus_t
0xA8 mavlink_wind_t





 楼主| 发表于 2013-8-23 00:14 | 显示全部楼层
APM 的机载参数设置,或者更准确的说应该是 ArduPlane 的机载参数设置,俺觉得这是 APM 应用的精髓之所在。稍微夸张一点,基本上可以用博大精深来形容。这两百多个参数的含义、作用大体搞明白,APM的应用就基本没有什么不清楚的地方了。

MissionPlanner当中很多的功能设置,例如航点半径的设置、默认返航高度、巡航油门的设置、电压/电流/空速传感器的接口或使用与否,rc遥控器的校准,等等等等N多初中高级功能的设置,其实质都是通过上行参数设置完成的,MP只不过提供了一个简洁的界面进行了包装。

俺在CSS设计之初就考虑到了机载参数与正常下行遥测参数的问题,分别为其提供了数据总线和机载参数总线两个机制,上述两总线可以进行数据关联,可用来分别代表机载参数的GCS本地状态和UAV远端状态。是不是有点绕?赫赫,将来有时间俺会详细讲讲其中的细节。这个问题在实现的时候确实有点复杂,主要体现在以下两点:1、貌似不同版本的ArduPlane的机载参数个数、顺序是不同的,这点要是搞错,后果很严重。2、机载参数在上下行传输时可能会出现超时情况,必须进行处理和相关提示。

CSS当中的机载参数设置页面,可以直接对某个或某几个参数进行装订操作以实现预定的功能。或利用其他控件协同“条件触发-动作响应”机制搭建起机载参数的设置及传输操作界面。

666.JPG




 楼主| 发表于 2013-8-24 02:04 | 显示全部楼层
麻烦事情,arduplane升级更新太快,2.71版的时候还只有260多个机载参数,到了2.74b版就增加到了290多个。这还不算,仅仅是mavlink_request_data_stream_t消息似乎就发生了改变。请求消息的Id变了,而且下行速率更新数据没有以前高了,明显一卡一卡的,无论是MP还是我的CSS都是如此。以前的版本下行速率能到4kb/s,60多fps,现在大概只有一半了。
 楼主| 发表于 2013-8-26 00:52 | 显示全部楼层
本帖最后由 scaple 于 2013-8-26 01:06 编辑

今天在阴有小雨的情况下进行了多架次飞行,分别使用 MissionPlanner 和 CSS 进行了飞行。

在CSS控制下进行了Menual、Stablilize、RTL、AUTO 模式下的飞行,基本达到预期目的。唯一出现的意外是地面站Xbee的底板USB插口因为多次插拔,今天彻底挂掉了。以至于今天出现了飞机在天上转圈,地面在抢修数传模块的情景。但是最终还是没有修好....囧

木有视频,因为DVR里面忘记装SD卡了,木有飞行照片,因为在忙着修xbee。倒是天上有个鸟对飞机特别感兴趣,老是跟在后面飞,没及时拍下来,可惜了。但是有数据,最珍贵的数据下来了,哈哈哈哈哈,tlog格式遥测数据,与MP兼容。

第一次降落没落好,降落在满是积水的车辙里面了,不过俺的飞机连水塘都落过,这点小积水算啥。

载机,好小子1720、2216电机9寸桨、1.2G图传、4500 3s电池,凯夫拉及玻璃纤维加强。ArduPlane 2.71

CF18三防本相当给力,小雨下冒雨使用毫无压力,这简直是我几年来X宝上买的最值的东西之一。

666.jpg

20130825_183445.jpg

20130825_183018.jpg


 楼主| 发表于 2013-8-27 01:37 | 显示全部楼层
悲了个催的,大半年没摸电络铁手生了,修xbee底座焊个5pin的排针花了一晚上,先是焊反了,然后又拆,然后再焊...

整理了一下地图包,5、600平方公里,1m的卫片竟然有2G多,当然,还包含了8级的全国地图...
发表于 2013-8-27 11:04 | 显示全部楼层
scaple 发表于 2013-6-29 09:04
CSS作为无人机/车/船控制软件的开发平台,其诸多的编辑设定功能由一系列编辑器组成,它们分别为:仪表编辑器 ...

您好,有些问题需要请教您下,能加下我Q吗?451290891.谢谢了

 楼主| 发表于 2013-8-27 12:28 | 显示全部楼层
liangdyc 发表于 2013-8-27 11:04
您好,有些问题需要请教您下,能加下我Q吗?451290891.谢谢了

有什么问题在论坛里面提吧,大家一块讨论效果会更好。俺的QQ经常是想起来才偶尔上来看看,平时一般不在线。

您的问题:

你好,谢谢你的解答,其实可能是我没说明白。在我的理解中,就是地面站软件通过发送mavlink协议里面的相关命令,然后飞控会根据不同的命令做出不同的反应。那么这个命令怎么发?比如前面说到要得到姿态数据,那么用66号命令。这个命令怎么发出去?难道用串口助手我打一个66,然后发出去?我现在需要的不是具体哪个指令是什么意思,而且这些指令怎样发出去。

直接把合成好的数据帧写入串口就行了,比方说将  req_stream_id 为 3 的下行数据传输速率调整为 0,合成后的数据帧内容为 FE 06 36 FF BE 42 00 00 01 01 03 01 3D 94,把这14个字节的数据写入串口就ok了


-------------------------------------------------------------------------------------

>>> GCS Msg:  MAVLINK_MSG_ID_REQUEST_DATA_STREAM ( 66/0x42)
>>> FE 06 36 FF BE 42 00 00 01 01 03 01 3D 94 , W:1
>>> req_message_rate=0; target_system=1; target_component=1; req_stream_id=3; start_stop=1;


发表于 2013-8-28 18:06 | 显示全部楼层
scaple 发表于 2013-8-27 12:28
有什么问题在论坛里面提吧,大家一块讨论效果会更好。俺的QQ经常是想起来才偶尔上来看看,平时一般不在线 ...

你好,看到你的解释了。我用串口助手把你说的那几个字节发送出去,没有反应。具体情况我现在也弄不清楚了。

发表于 2013-8-28 18:07 | 显示全部楼层
本帖最后由 liangdyc 于 2013-8-28 18:09 编辑
scaple 发表于 2013-8-27 12:28
有什么问题在论坛里面提吧,大家一块讨论效果会更好。俺的QQ经常是想起来才偶尔上来看看,平时一般不在线 ...

而且,通过这几天的测试,我发现,地面站与APM连接的时候,好像之间还需要进行通信,才能正式启动。另外我是用的那个USB线直接和APM连接的。不是走的数传模块或者其他的。


 楼主| 发表于 2013-8-28 20:49 | 显示全部楼层
liangdyc 发表于 2013-8-28 18:06
你好,看到你的解释了。我用串口助手把你说的那几个字节发送出去,没有反应。具体情况我现在也弄不清楚了 ...

>>> GCS Msg:  MAVLINK_MSG_ID_REQUEST_DATA_STREAM ( 66/0x42)
>>> FE 06 36 FF BE 42 00 00 01 01 03 01 3D 94 , W:1
>>> req_message_rate=0; target_system=1; target_component=1; req_stream_id=3; start_stop=1;

这条指令当中req_message_rate 字段的数值为0,表示请求下行发送的数据刷新率为0,也就是说这条指令实际上是关闭了req_stream_id=3的数据下行传输。你把req_message_rate改成大于0的数值,应该就有数据下来了,具体是哪类数据我记不清楚了。当然,你也可以把req_stream_id改为10,这个我记得好像是姿态数据。具体字段数值与字节位置的对应关系,看我前面贴过的图。

还有要注意的是,写入串口的必须是16进制的数据,而非 FE 06 36 FF BE 42 00 00 01 01 03 01 3D 94 这个字符串




 楼主| 发表于 2013-8-28 20:54 | 显示全部楼层
本帖最后由 scaple 于 2013-8-28 21:00 编辑
liangdyc 发表于 2013-8-28 18:07
而且,通过这几天的测试,我发现,地面站与APM连接的时候,好像之间还需要进行通信,才能正式启动。另外我 ...

MP与apm建立连接的时候,MP上行发送了一个请求机载参数下行发送的msg上去,APM接受并响应该消息后,下行传送ArduPlane的200多个参数。MP必须完整接收这些参数后,才能继续运行。

实际上,无论MP是否请求下行参数传送,只要连接建立后,MP都在接收并处理APM的下行数据了。这只不过是MP的一个强制措施罢了。

USB连接是最可靠的数据通讯方式,相对其他无线数传。



发表于 2013-8-29 18:54 | 显示全部楼层
scaple 发表于 2013-8-28 20:54
MP与apm建立连接的时候,MP上行发送了一个请求机载参数下行发送的msg上去,APM接受并响应该消息后,下行传 ...

非常感谢你啊,这么耐心详细的解释。

发表于 2013-8-31 14:43 | 显示全部楼层
scaple 发表于 2013-8-28 20:54
MP与apm建立连接的时候,MP上行发送了一个请求机载参数下行发送的msg上去,APM接受并响应该消息后,下行传 ...

不过还是不好意思。。。还是没反应。嘿嘿。可能是我不怎么会弄吧

 楼主| 发表于 2013-9-1 00:42 | 显示全部楼层
liangdyc 发表于 2013-8-31 14:43
不过还是不好意思。。。还是没反应。嘿嘿。可能是我不怎么会弄吧

前面说漏了一点,如果您需要对例子当中某个字段数值进行更改的话,相应的,最后两位CRC校验码也必须随之改变。否则,APM肯定不会有什么响应动作。

先用mp把apm的下行数据关掉,然后关闭MP,用串口助手打开apm,发送如下图所示的 请求机载参数下行传送 message 上去,机载参数就源源不断地下来了...

8887.JPG


 楼主| 发表于 2013-9-1 00:51 | 显示全部楼层
终于把 tlog 格式遥测数据的记录、回放搞定了。记录简单,很容易就弄完了。回放有点啰嗦,一方面原有的遥测数据记录与回放机制我不想就此舍弃,另外一方面还得在此基础之上再加入 tlog 格式数据的回放及控制机制,于是就弄得有点麻烦。

相对于 MP,改进了两点,首先MP在回放记录时,时间分辨率只能达到秒级,也就是说刷新频率最高是 1fps。虽然tlog格式的时间分辨率轻易可以到几十ms级别,但是MP没有很好的进行利用。
其次对数据记录中上行指令的发送在回放过程中进行了个简单提示。

8889.JPG

8885.JPG


发表于 2013-9-1 16:44 | 显示全部楼层
scaple 发表于 2013-9-1 00:51
终于把 tlog 格式遥测数据的记录、回放搞定了。记录简单,很容易就弄完了。回放有点啰嗦,一方面原有的遥测 ...

膜拜大神,膜拜大神。出来了。啊哈哈哈。太感谢了。

发表于 2013-9-1 18:54 | 显示全部楼层
本帖最后由 liangdyc 于 2013-9-1 21:33 编辑
scaple 发表于 2013-9-1 00:42
前面说漏了一点,如果您需要对例子当中某个字段数值进行更改的话,相应的,最后两位CRC校验码也必须随之改 ...

非常感谢你的帮忙,现在已经收到数据了。正在做数据校验。但是5555,又遇到问题了。  1、比如发送的命令为:FE 06 36 FF BE 42 00 00 01 01 03 01 3D 94。各数据位的含义我已经懂了。3D 94是校验和。我用CRC-16-CCITT校验软件对上面数据进行处理,却获得的不是3D 94,而是44 2F。对FE 02 91 FF BE 15 01 01 78 9B 进行校验,获得的校验和为:FA 7F而不是78 9B。这是怎么一回事?是不是还有其他的问题呢?(刚才又仔细研究下资料,好像是需要校验的数据+ crc_extra )。这个CRC_extra在它那个mavlin库里面可以查到。查到的是: #ifndef MAVLINK_MESSAGE_LENGTHS
#define MAVLINK_MESSAGE_LENGTHS {9, 31, 12, 0, 14, 28, 3, 32, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 25, 23, 30, 101, 22, 26, 16, 14, 28, 32, 28, 28, 22, 22, 21, 6, 6, 37, 4, 4, 2, 2, 4, 2, 2, 3, 13, 12, 19, 17, 15, 15, 27, 25, 18, 18, 20, 20, 9, 34, 26, 46, 36, 0, 6, 4, 0, 21, 18, 0, 0, 0, 20, 0, 33, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 56, 42, 33, 0, 0, 0, 0, 0, 0, 0, 26, 32, 32, 20, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 8, 4, 12, 15, 13, 6, 15, 14, 0, 12, 3, 8, 28, 44, 3, 9, 22, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 30, 18, 18, 51, 9, 0}
#endif

#ifndef MAVLINK_MESSAGE_CRCS
#define MAVLINK_MESSAGE_CRCS {50, 124, 137, 0, 237, 217, 104, 119, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 214, 159, 220, 168, 24, 23, 170, 144, 67, 115, 39, 246, 185, 104, 237, 244, 222, 212, 9, 254, 230, 28, 28, 132, 221, 232, 11, 153, 41, 39, 214, 223, 141, 33, 15, 3, 100, 24, 239, 238, 30, 240, 183, 130, 130, 0, 148, 21, 0, 52, 124, 0, 0, 0, 20, 0, 152, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 183, 63, 54, 0, 0, 0, 0, 0, 0, 0, 175, 102, 158, 208, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 219, 208, 188, 84, 22, 19, 21, 134, 0, 78, 68, 189, 127, 111, 21, 21, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 49, 170, 44, 83, 46, 0}
#endif
这个里面具体是怎样定义的?仔细看了一下长度为9的就可以看到CRC_extra有50,46两个值。具体怎么选啊?能仔细说明下吗?最好举个例子。非常感谢
刚刚又查看了地面站源代码程序,发现他里面做了这个定义:const int X25_INIT_CRC = 0xffff; const int X25_VALIDATE_CRC = 0xf0b8; 好像是0xffff作为CRC—extra的值。但是还是不对。WHY?
QQ图片20130901185322.jpg   

   2、另外对命令的生成自己也有一些疑问。例如你前面教给我的发送FE 02 91 FF BE 15 01 01 78 9B 可以获得数据,非常成功哦。的确是大神,但是疑问来了。对于这已组数据每一位的含义我基本了解了。FE为头,02表示有两个有效数据,91为数据包序列号,FF为系统ID,BE 为组件ID,15为消息ID,01 01两个为数据, 78 9B为校验和。可是如果我现在想写一条让APM发送姿态数据的消息,除了FE以及校验和可以最后确定。那么其他数据位的数据是怎样确定的呢?我也查看了MAVLINK协议说明,很多只是说了某个命令的含义。至于发送命令时,每一位是怎样确定的,却没有说明。您能详细解释下吗?或者举个详细的例子说明下,谢谢了,。     (刚查了资料,总不能什么都让您帮解答吧嘿嘿。消息ID 是固定在协议里的 ,可变化的。组件ID ,系统ID 都是可变得 是根据飞行器类型,模式所定的。这一点自己可以理解了。对了我用的是四旋翼飞行器。

   3、 还有我通过发送那条指令,从APM获取了一些数据,其中一条为:FE 19 58 01 01 16 00 00 00 00 10 01 01 01 4D 4E 54 5F 52 43 5F 49 4E 5F 50 41 4E 00 00 00 02 3E 4B。根据这包数据,我知道其中00 00 00 00 10 01 01 01 4D 4E 54 5F 52 43 5F 49 4E 5F 50 41 4E 00 00 00 02这些为有效数据。但是怎样把他合成有效的或者说我们能够看懂的数据,这里就不大清楚了。比如多少个数据表示的是同一个数,或者哪一个数是表示的正负?因为我们平时在实验室,通信协议和格式都是自己规定的,很少用其他的,所以,这里自己就遇到难题了。
  再次对你前面对我的帮助表示感谢啊。















 楼主| 发表于 2013-9-1 22:12 | 显示全部楼层
本帖最后由 scaple 于 2013-9-1 22:18 编辑
liangdyc 发表于 2013-9-1 18:54
非常感谢你的帮忙,现在已经收到数据了。正在做数据校验。但是5555,又遇到问题了。  1、比如发送的命令为 ...

祝贺你!你已经一步步接近问题的实质了。

1、你说得对,在校验的过程中确实要加上 crc_extra(好像是最后,我记得)。

宏定义 MAVLINK_MESSAGE_LENGTHS 和 MAVLINK_MESSAGE_CRCS 简单的说就是两张表,mavlink在这里用简单查表的形式获取其需要的数据。
MAVLINK_MESSAGE_LENGTHS 表示mavlink message的长度(准确的应该是载荷长度,如果我没记错的话),MAVLINK_MESSAGE_CRCS表示mavlink message 对应的附加校验码。这2个表当中的元素的索引,就是 mavlink msg 的id(即序号),这样,通过message的序号,马上就可以得到message的载荷长度与附加校验码。哈哈,简单吧?

const int X25_INIT_CRC 这个应该是CRC校验迭代运算的初始值,至于其他....Sorry 我现在好想念当年给我上《通信原理》的老师,好多东西又还给他了....5555555

3、4,两个问题的实质其实就是一个:mavlink message,或者我称其为 mavlink 数据帧的帧格式是如何定义的?赫赫,你仔细看下mavlink的源代码去,所有所有mavlink message的帧格式定义及其他信息都定义在程序当中了。是哪个文件我记不得了,得回头看下我的源程序去。

现在真羡慕你们,学习mavlink的时候有那么资源。当初我啃mavlink的时候,几乎连可用可信的数据帧例子数据都没有。

另外说一句,西工大和北航的类似通讯协议我接触过一点,从通讯协议的角度上来说 mavlink 协议还是不错的,考虑得比较周全。可以看出 mavlink在设计的时候是想做为一个海陆空天的通用协议来进行设计的。但是在实现的过程中,mavlink 的通用性并不是太优秀,具体的说就是不同类型的数据帧之间的规律性不是很强,包含了一定数量的特殊规则在里面,这样就给通用化的实现带来一定麻烦。





发表于 2013-9-1 22:16 | 显示全部楼层
本帖最后由 liangdyc 于 2013-9-1 22:18 编辑
scaple 发表于 2013-9-1 22:12
祝贺你!你已经一步步接近问题的实质了。

1、你说得对,在校验的过程中确实要加上 crc_extra(好像是最 ...

5555555555,激动啊。刚刚也是在看源代码,发现真的越来越接近实质问题了。哈哈。还好自己用了一个星期疯狂学习C#,现在部分源代码也能看懂了。激动啊。您能仔细帮我解释下FE 02 91 FF BE 15 01 01 78 9B这个里面的校检码是用的哪个CRC_extra算出来的吗?尤其是怎样通过那个表查到相应的CRC_extra 。现在这里稍微还有点晕。


您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

点击查看详情
快速回复 返回顶部 返回列表