note


AR.Droneを無線ルータにつないでJava(Processing用ライブラリARDroneForP5)で制御

メモ。AR Droneをすでにある無線ルータにつないでProcessingで制御。

Pasted GraphicPasted Graphic 1

(1)AR.Droneを無線ルータにつなぐ
初期設定だとAR.Droneが提供するアクセスポイントにPC/iPhone/iPadがつなぎにいき、制御する。
これが嫌なので、AR Droneを無線ルータにつなぎたい。
ここをそのまま参考にする。

1. telnet でつなぐ
まずはAR Droneが提供するアクセスポイントにつなぎ、コンピュータからtelnetする。
%telnet 192.168.1.1

2. WiFiの設定スクリプトを書く
例えば環境にある無線ルータのessidが
hogehoge, AR Droneに設定したいIPがhoge.hoge.hoge.hoge, ネットマスクが255.255.254.0 の場合
どこかにmywifi.sh みたいなファイルを生成して中身をこう書く。

gpio 63 -d ho 1
killall udhcpd
ifconfig ath0 down
iwconfig ath0 essid “hogehoge”
iwconfig ath0 mode managed
iwconfig ath0 key off
iwconfig ath0 essid “hogehoge”
ifconfig ath0 hoge.hoge.hoge.hoge netmask 255.255.254.0 up
ifconfig ath0
iwconfig ath0
iwlist ath0 encryption
gpio 63 -d ho 0


上記リンクそのまま。

3. とりあえずテスト
%chmod 755 mywifi.sh
%./mywifi.sh

これでtelnetがきれるので、コンピュータを同じ無線ルータにつなぎ、設定したIPにつなげれるかテスト。
%telnet hoge.hoge.hoge.hoge

つながったら、OK

4. AR DroneのWiFi設定ファイルに書き込む
/bin/wifi_setup.sh の一番最後に、
/スクリプトを保存したディレクトリ/mywifi.sh
と書く。そうすると、AR Droneの初期設定が終わったあと、強引にその初期設定を無視して新しくWiFIにつながるようになる。

(2)Java(Processing用ライブラリARDroneForP5)でWiFIにつながったAR Droneを制御
ここにProcessing用AR Drone制御ライブラリが提供されているので、有り難くダウンロードさせていただく。
eclipseに読み込むと、後々の開発が楽。
とりあえず、サンプルの examples/ARDroneTest.java を動かしたい。
普通に考えるとARDroneTest.java内の、

private void initialize() {
ardrone = new ARDrone(“192.168.1.1”);

ここの部分を設定したIPに書き換えると動きそうだが、
ardrone = new ARDrone(“hoge.hoge.hoge.hoge”);

しかし動かない。Why ?
ardrone.connect(); 部分でこけてるっぽい。

よってライブラリを変更必要があるので、ARDroneForP5.jar は使わないようにする。
で、ライブラリのソースファイルを変更する。

ソースを見ると、ardrone.connect()は内部でARDroneInfo呼び出してそこの中の
connectToDroneThroughFtp() Droneに接続しにいっている。
ただし、その中で指定されているIP
         client.connect(ARDroneConstants.IP_ADDRESS, ARDroneConstants.FTP_PORT);
となっていて、ARDroneConstants.IP_ADDRESS が決め打ちの”192.168.1.1” を参照しているため、examples/ARDroneTest.javaで ardrone = new ARDrone(“hoge.hoge.hoge.hoge”);
として指定してやったIPアドレスが反映されていない。

ARDroneInfo.java のコンストラクタを変えてやる

public ARDroneInfo() {
connectToDroneThroughFtp();
}



を、

private final InetAddress addr;

public ARDroneInfo(final InetAddress addr) {
this.addr = addr;
connectToDroneThroughFtp();
}



としてやり、同じプログラム内の
         client.connect(ARDroneConstants.IP_ADDRESS, ARDroneConstants.FTP_PORT);
これを、
client.connect(this.addr, ARDroneConstants.FTP_PORT);
これに変えてやる。
ARDroneInfoはARDrone.javaからしか参照されてなさそうなので、他に影響はなくて、大丈夫だと思います。

で、ARDroneInfoを呼び出す元の、com.shigeodayo.ardrone.ARDrone.java内の

if (ardroneVersion == null)
ardroneVersion = new ARDroneInfo().getDroneVersion();

この部分を

if (ardroneVersion == null)
ardroneVersion = new ARDroneInfo(inetaddr).getDroneVersion();


これに変えてやる。そうすると、無線ルータにつながったARDroneにきちんとつながりました。

おまけ:自分でソースを直すのがめんどい人は、
com.shigeodayo.ardrone.utils.ARDroneInfo.java を
これ
com.shigeodayo.ardrone.ARDrone.javaを
これ

置き換えると、すぐに動きます。
tomotakaさん、ありがとうございました。