理论广角 ●I 无人飞行器通信网络设计以及实现 翁振粤 (广东省建筑科学研究院设备研究所 广东 广州 5 l0000) [摘要]飞行机器人是一个极具挑战性的多学科交叉的前沿性研究课题。作为空中机器人的无人驾驶直升飞机,在军事上可用于侦察、 监视等,在民用上可用于大地测量、遥感等。目前,美国、日本、欧洲国家等发达国家在这方面的研究已经有了不小的进展,国内的研 究也开始起步。本文就无人飞行器通信网络进行设计讨论。 [关键词]无人飞行器 网络通信 UDP协议 socket编程 中图分类号:TN 文献标识码:A 文章编号:1009-914x(2010)1 7-0305-01 我们采用T IGER~50航模直升飞机作为机械平台,利用IMU,电 子罗盘,G P S,声纳等传感器提供了自主飞行需要的导航信息,采 用了PC—l 04统作为导航计算机。在这些硬件基础上,我搭建了自 主飞行的完整软件平台,完成自主飞行功能,该软件系统包含机站控制 程序和监控平台程序,机站控制程序完成飞行器的自主控制,监控平 台程序完成地面监控功能 机站控制程序运行在PC104上面,而监控 平台程序运行在我们的地面的DELL笔记本上面,两者的通信只能通过 无线网络来连接,本文设计的通信网络就是要达到连接机站软件和地 面站的数据通信目的。 硬件上面,我们选用了思科公司的WRT54GC~CN迷你型无线宽带 路由器作为机载无线通讯设备,它采用802.1 1g作为通讯协议,最大 传输速率达到54M。监控平台采用内置符合802.儿g协议无线以太网 卡的DELL笔记本。 下面是本文的重点,网络软件的设计,分为两个部分:机站部分 和地面站部分。 机站网络软件的设计涉及到的UDP相关的API函数: 从进程到内核传递socket地址结构的4个API:bind;connect: sendto:sendmsg:这些函数从进程拷贝socket的地址结构,并显式 以作为参数传递给这4个函数的地址结构的长度设置sin 1en成员。 而从内核到进程传递socket地址的5个API:accept,recvfroil], getpeername,getsockname均在返回到进程之前设置sin—lell成员。 这些函数提供的基本的socket接口。在这些函数中涉及到几个基本的 系统数据类型,定义在<netillet/in.h>头文件中包括sockaddr in 和sockaddr,两种结构可以相互转换,经常就是将sockaddr in强 行转换成为sockaddr。当把socket地址结构传递给socket API的 时候,总是通过指针来传递的。 了解到上面的基本函数和结构体之后,我们就可以开始编写我们 的软件了。我们机站上面创立三个套接口,分别用于发送状态信息,接 收控制参数和接收飞行目标点。其中两个为服务器端、一个为客户端。 服务器端和客户端的软件构架是不一样的。他们的区别在于,服务程 序总是被动的等待连接,服务程序一启动,初始化完毕就进入等待连 接状态:而客户程序启动后,向远程服务程序发出连接请求,服务程 序收到请求后,按照一定的规则建立连接,连接完成后,两个程序就 之间就建立了一个虚拟的数据通讯链路,这些程序可以直接从自己打 开的套接口读入和写出数据,而不用关心实际的数据链路。下来将介 绍两种基本编程模式程序的编写。 客户程序编写的基本方法 步骤:创建套接口一与远程服务程序 连接一读/写数据一终止连接。创建套接口用socket函数,该函数成 功时返回一个套接口描述字 与远程服务程序连接使用conllect函数, 该函数调用成功后,套接口描述字就与远程服务程序建立好了连接, 可以开始读/写了。读/写数据使用read和write函数。读写完后可 调用函数close关闭套接口,参数为套接口描述字。 服务程序编写的基本方法。步骤:创建套接口一绑定套接口一设 置套接口为监听模式,进入被动接受连接请求状态一接受请求,建立 连接一读/写数据一终止连接。绑定套接口是为本程序分配一个供使 用的通信端口,使用bind函数。调用函数li stell后套接口进入监听 状态,再调用accept函数接受连接请求,如果没有连接请求,accept 函数将使程序进入睡眠状态,直到被远程客户程序的请求所唤醒。连 接一旦建立读/写与客户程序相同。服务程序一般在设置为监听模式 后处于不断的接受请求、处理请求的循环中。 比如我们机站的软件上面,用于发送UAV状态信息的socket接 口就是一个客户端程序,下面分析他的程序。 程序首先打开一个s o cket并初始化: int SOCkfds: struct SOCkaddrin ground: s=socket(AFtNET,SOCKDGRAM,0): bzero(&ground,sizeof(ground)): sockfdground.sinfami1Y=AFINET: addr.s addr=inet addr( 192.168.1.12 ): ground.s inport=htons(20 10): ground.sin之后就可以像读写普通的文件一样来读写那个so ck et了: sendto(sockfd s,&state,sizeof(state),0,(struct S0Ckaddr ¥)&ground, si zeof(ground)): 机站程序的大体框架就是这样。而相对应的在地面站(平台 wi ndow s)这边的so c ket就应当是服务器端,步骤如下: 1、建立Socket 初始化winsock的动态连接库后,需要在服务器端建立一个监听 的Socket,为此可以调用Socke函数来建立这个监听的Socket,并定 义此So ck et所使用的通信协议。 2、绑定端口 要为服务器端定义的这个监听的Socket指定一个地址及端口,这 样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用 b i n d函数。 //利用r socket的成员函数Create来建立socket CGROUNDSTAT I ONV i ew I.CGROUNDSTAT I ONV i ew 0 f r socket.Create(2010,SOCKDGRAM,NULL): ) //利用r socket的成员函数ReceiveFrom来接收客户端发来的 数据rsocket.Recei veFrom(&pDoc~>state,si zeof(pDoc一> state),s—iP,uPort,O); 以上是当发现套接口有数据抵达时执行的代码。 上面大概的讲述了无人机整个网络系统的搭建以及实现。到目 前为止,系统运行良好。证明了上面设计思路的正确性。但是同 时也存在各种问题。包括硬件方面的不稳定,特别在好几次的飞行 试验中,出现过网络突然断开的情况,这必然要求我们进一步改善 整个系统的稳定性。还有就是随着传输数据量越来越大,这就得在 继续使用uDP协议的基础上,软件改进数据包丢失的问题。或者使 用RTP/RTCP实时传输协议以及实时传输控制协议来保证传输实时 性。这些都是以后需要改进的地方。 参考文献: [1]w.Ri chard Steverns《uNIx高级编程》人民邮电出版社. 2O05. [2]w.Richard Steverns著施振川周利民孙宏晖译{Unix 网络编程(第一卷)》清华大学出版社.2 0 0 0. [3]常锐裴海龙《无人直升机监控平台设计与实现》微计算机信 息.2006年5月. [4]肖宏伟《Vi sual c++6.0实效编程百例》[M]人民邮电出 版社.2O02. 料技博克I 305