ARDrone.docx
- 文档编号:3119050
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:26
- 大小:401.53KB
ARDrone.docx
《ARDrone.docx》由会员分享,可在线阅读,更多相关《ARDrone.docx(26页珍藏版)》请在冰点文库上搜索。
ARDrone
AR.Drone四轴飞行器内置ARM9CPU,Linux操作系统,通过WiFi来控制.
开放的Linux内核使得在AR.Drone增加新设备成为可行. AR.Drone是一个很好的DIY平台.
这也正是我入手AR.Drone的主要原因.要知道我既没iPhone也没Apple的其它东东(目前官方只支持iPhone系列做控制端),买来怎玩?
----我的笔记本PC带WiFi,那就拿它来控制AR.Drone.
中秋节假期正好有空,于是我先行写了个简单的Java程序:
在WindowsXP下的DOS窗口运行,向UDP端口5556发送AT命令来控制AR.Drone.
今天收到AR.Drone后就测试了一下:
先发送了起飞AT命令, AR.Drone就立马起飞,升至1米左右后便稳稳地悬停在那儿!
然后发送降落AT命令, AR.Drone便自动完成降落动作.
(我之前都做好了这样的思想准备:
万一降落命令不灵,我就伸手把它拽下来!
)
再试了些其它命令(pitch/roll/yaw/gaz)也都灵.
DIY目标:
1)Java版的跨平台地面控制软件(先在WindowsXP下测试)
a)发送AT命令来控制AR.Drone
b)接受并显示两个摄像头的视频(可选其一或叠加)
c)用键盘控制
d)用游戏杆控制
2)连接AR.Drone到WiFiAP,通过Internet来遥控AR.Drone (能上网的飞行器!
)
3)在WiFiAP间漫游
4)给AR.Drone配上气压高度计/激光高度计(对AR.Drone现有6米超声波高度计的补充)
4)给AR.Drone配上GPS模块和磁罗盘,沿预定路线自主飞行
5)给AR.Drone配上USB3G模块,要飞多远就飞多远----只要电池够:
)
2010.09.26:
增加键盘控制
2010.10.04:
在AR.Drone上用tcpdump抓包分析网络数据
2010.10.05:
Parrot今天发布了AR.Drone的详细开发文档
下载:
https:
//projects.ardrone.org/attachments/download/207/ARDrone_Developer_Guide.pdf
包括飞控AT命令,飞控数据,视频流等,是DIY的福音!
2010.10.17:
增加GPS模块成功
详见第6页110楼
2011.01.01:
USBHost成功,GPS可用VBUS+5V
详见第13页247/251楼
2011.01.02:
AR.Drone成功地读出了U盘里的文件
详见第13页252楼
2011.01.14零点:
USB3G成功
详见第15页292楼
2011.02.17:
USB刷机教程
2011.03.06:
AR.Drone 附加导航板DIY(气压高度计+电子罗盘+GPS)---基于Arduino
2011.03.22:
在GoogleCode上设立ARDroneME开源项目:
(Java(J2ME)WiFi手机上的AR.Drone控制软件,WM6/Symbian等系统)
2011.03.29:
ARDroneME1.2(带触屏软游戏柄):
2011.05.29:
AR.Drone电调通信协议:
2011.07.02:
直接读取AR.Drone摄像头的原始图像
详见第21页415楼
键盘控制
/*
Author:
MAPGPSat
http:
//www.ardrone-
https:
//projects.ardrone.org/projects/ardrone-api/boards
Initial:
2010.09.20
Updated:
2011.03.03
UI_BIT:
00010001010101000000000000000000
||||||||||||+--0:
Buttonturntoleft
|||||||||||+---1:
Buttonaltitudedown(ah-ab)
||||||||||+----2:
Buttonturntoright
|||||||||+-----3:
Buttonaltitudeup(ah-ab)
||||||||+------4:
Button-z-axis(r1-l1)
|||||||+--------6:
Button+z-axis(r1-l1)
||||||+----------8:
Buttonemergencyresetall
|||||+-----------9:
ButtonTakeoff/Landing
||||+-------------------18:
y-axistrim+1(Trimincreaseat+/-1?
?
/s)
|||+---------------------20:
x-axistrim+1(Trimincreaseat+/-1?
?
/s)
||+-----------------------22:
z-axistrim+1(Trimincreaseat+/-1?
?
/s)
|+-------------------------24:
x-axis+1
+-----------------------------28:
y-axis+1
AT*REF=
AT*PCMD=
(float)0.05=(int)1028443341(float)-0.05=(int)-1119040307
(float)0.1=(int)1036831949(float)-0.1=(int)-1110651699
(float)0.2=(int)1045220557(float)-0.2=(int)-1102263091
(float)0.5=(int)1056964608(float)-0.5=(int)-1090519040
AT*ANIM=
AT*CONFIG=
##########Commandlinemode############
Usage:
javaARDrone
altitudemax2m:
javaARDrone192.168.1.1AT*CONFIG=1,\"control:
altitude_max\",\"2000\"
Takeoff:
javaARDrone192.168.1.1AT*REF=1,290718208
Landing:
javaARDrone192.168.1.1AT*REF=1,290717696
Hovering:
javaARDrone192.168.1.1AT*PCMD=1,1,0,0,0,0
gaz0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,0,0,1036831949,0
gaz-0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,0,0,-1110651699,0
roll0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,1036831949,0,0,0
roll-0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,-1110651699,0,0,0
yaw0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,0,0,0,1036831949
yaw-0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,0,0,0,-1110651699
pitch0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,0,1036831949,0,0
pitch-0.1:
javaARDrone192.168.1.1AT*PCMD=1,1,0,-1110651699,0,0
pitch-30deg:
javaARDrone192.168.1.1AT*ANIM=1,0,1000
pitch30deg:
javaARDrone192.168.1.1AT*ANIM=1,1,1000
EmergencyjavaARDrone192.168.1.1AT*REF=1,290717952
##########Keyboadmode############
Usage:
javaARDrone[IP]
Takeoff/Landing:
Spacebar(toggle)
Hovering:
Pausekey
Arrowkeys:
GoForward
^
|
GoLeft<---+--->GoRight
|
v
GoBackward
ArrowkeyswithCtrlkeypressed:
GoUp
^
|
RotateLeft<---+--->RotateRight
|
v
GoDown
Digitalkeys1~9:
Changespeed(rudderrate5%~99%),1isminand9ismax.
*/
import.*;
importjava.util.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.nio.*;
classARDroneextendsFrameimplementsKeyListener{
staticfinalintNAVDATA_PORT=5554;
staticfinalintVIDEO_PORT=5555;
staticfinalintAT_PORT=5556;
//NavDataoffset
staticfinalintNAVDATA_STATE=4;
staticfinalintNAVDATA_BATTERY=24;
staticfinalintNAVDATA_ALTITUDE=40;
InetAddressinet_addr;
DatagramSocketsocket_at;
intseq=1;//SendATcommandwithsequencenumber1willresetthecounter
intseq_last=1;
Stringat_cmd_last="";
floatspeed=(float)0.1;
booleanctrl=false;
booleanlocked=true;
FloatBufferfb;
IntBufferib;
booleanspace_bar=false;//true=Takeoff,false=Landing
finalstaticintINTERVAL=100;
longlastTime=0;
publicARDrone(Stringname,Stringargs[],InetAddressinet_addr)throwsException{
super(name);
this.inet_addr=inet_addr;
ByteBufferbb=ByteBuffer.allocate(4);
fb=bb.asFloatBuffer();
ib=bb.asIntBuffer();
socket_at=newDatagramSocket(ARDrone.AT_PORT);
socket_at.setSoTimeout(3000);
if(args.length==2){//Commandlinemode
send_at_cmd(args[1]);
System.exit(0);
}
System.out.println("Speed:
"+speed);
send_at_cmd("AT*PMODE="+get_seq()+",2");
Thread.sleep(INTERVAL);
send_at_cmd("AT*MISC="+get_seq()+",2,20,2000,3000");
Thread.sleep(INTERVAL);
send_at_cmd("AT*REF="+get_seq()+",290717696");
Thread.sleep(INTERVAL);
send_at_cmd("AT*COMWDG="+get_seq());
Thread.sleep(INTERVAL);
send_at_cmd("AT*CONFIG="+get_seq()+",\"control:
altitude_max\",\"2000\"");//altitudemax2m
Thread.sleep(INTERVAL);
send_at_cmd("AT*CONFIG="+get_seq()+",\"control:
control_level\",\"0\"");//0:
BEGINNER,1:
ACE,2:
MAX
Thread.sleep(INTERVAL);
send_at_cmd("AT*CONFIG="+get_seq()+",\"general:
navdata_demo\",\"TRUE\"");
Thread.sleep(INTERVAL);
send_at_cmd("AT*CONFIG="+get_seq()+",\"general:
video_enable\",\"TRUE\"");
Thread.sleep(INTERVAL);
//send_at_cmd("AT*CONFIG="+get_seq()+",\"network:
owner_mac\",\"00:
18:
DE:
9D:
E9:
5D\"");//myPC
//send_at_cmd("AT*CONFIG="+get_seq()+",\"network:
owner_mac\",\"00:
23:
CD:
5D:
92:
37\"");//AP
//Thread.sleep(INTERVAL);
send_at_cmd("AT*CONFIG="+get_seq()+",\"pic:
ultrasound_freq\",\"8\"");
Thread.sleep(INTERVAL);
send_at_cmd("AT*FTRIM="+get_seq());//flattrim
Thread.sleep(INTERVAL);
send_at_cmd("AT*REF="+get_seq()+",290717696");
Thread.sleep(INTERVAL);
send_pcmd(0,0,0,0,0);
Thread.sleep(INTERVAL);
send_at_cmd("AT*REF="+get_seq()+",290717696");
Thread.sleep(INTERVAL);
//send_at_cmd("AT*REF="+get_seq()+",290717952");//toggleEmergency
//Thread.sleep(INTERVAL);
send_at_cmd("AT*REF="+get_seq()+",290717696");
addKeyListener(this);
setSize(320,160);
setVisible(true);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
}
publicstaticvoidmain(Stringargs[])throwsException{
InetAddressinet_addr;
Stringip="192.168.1.1";
if(args.length>=1){
ip=args[0];
}
StringTokenizerst=newStringTokenizer(ip,".");
byte[]ip_bytes=newbyte[4];
if(st.countTokens()==4){
for(inti=0;i<4;i++){
ip_bytes[i]=(byte)Integer.parseInt(st.nextToken());
}
}
else{
System.out.println("IncorrectIPaddressformat:
"+ip);
System.exit(-1);
}
System.out.println("IP:
"+ip);
inet_addr=InetAddress.getByAddress(ip_bytes);
ARDroneardrone=newARDrone("ARDrone",args,inet_addr);
Thread.sleep(ARDrone.INTERVAL);
NavDatand=newNavData(ardrone,inet_addr);
nd.start();
Thread.sleep(ARDrone.INTERVAL);
Videov=newVideo(ardrone,inet_addr);
v.start();
Thread.sleep(ARDrone.INTERVAL);
ardrone.send_at_cmd("AT*REF="+ardrone.get_seq()+",290717696");
intcnt=0;
while(true){
Thread.sleep(30);//within50mstoavoidARDRONE_COM_WATCHDOG_MASK(pitchandrolldoesnotworkinthisstate)
if(ardrone.seq==ardrone.seq_last)ardrone.send_at_cmd(ardrone.at_cmd_last);
ardrone.seq_last=ardrone.seq;
cnt++;
if(cnt>=5){//30*5=1500,within2000mstoavoidARDRONE_COM_LOST_MASK(needtore-connectforthisstate)
cnt=0;
ardrone.send_at_cmd("AT*COMWDG="+(ardrone.seq++));
}
}
}
publicvoidkeyTyped(KeyEvente){
;
}
publicvoidkeyPressed(KeyEvente){
intkeyCode=e.getKeyCode();
try{
control(keyCode);
}catch(Exceptionex){
ex.printStackTrace();
}
}
publicvoidkeyReleased(KeyEvente){
intkeyCode=e.getKeyCode();
//if(keyCode>=KeyEvent.VK_1&&keyCode<=KeyEvent.VK_9)speed=(float)0.1;//Resetspeed
if(keyCode==KeyEvent.VK_CONTROL)ctrl=false;
}
publicintintOfFloat(floatf){
fb.put(0,f);
returnib.get(0);
}
publicstaticStringbyte2hex(byte[]data,intoffset,intlen){
StringBuffersb=newStringBuffer();
for(inti=0;i Stringtmp=Integer.toHexString(((int)data[offset+i])&0xFF); for(intt=tmp.length();t<2;t++) { sb.append("0"); } sb.append(tmp); sb.append("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARDrone