情報畑でつかまえてロゴ
本サイトは NTTテクノクロスが旬の IT をキーワードに
IT 部門が今知っておきたい最新テクノロジーに関する情報をお届けするサイトです

ROSを利用したドローンの制御について(BebopDrone編)

第6回目となります今回は、ROSを利用したドローン(Bebop Drone)の制御方法について、紹介したいと思います。

はじめに

こんにちは。NTTソフトウェアの安井です。
第6回目となります今回は、前回に引き続きROSを利用したドローンの制御方法について、紹介したいと思います。

Bebop Drone用ROSデバイスドライバについて

Bebop Drone 用のROSデバイスドライバとして、 bebop_autonomy が提供されております。

こちらのデバイスドライバを利用することで、ROSを利用したBebop Droneの制御が可能となっています。



ドライバ名 概要 対応機種
bebop_autonomy

Bebop Droneに装備されたカメラより映像ストリームおよび情報の取得が可能。

メッセージの送受信をリレーする。
Bebop Drone

ROSを利用した制御

動作確認は、Ubuntu 14.04 で行いました。
ドローンへの接続は、SDKやNode(nodejs)で制御したときと同様に、ssid が、BebopDrone-xxxxx という名前のドローンを親機としたWiFi接続になっています。

動作環境確認

デバイスドライバである bebop_autonomy のインストール前に、ROSのインストールと、環境設定ワークスペースの作成が必要となりますので、リンクを参考に実施しておきます。
ROSのインストールは、パッケージ類のダウンロードサイズが1GB程度ありますので、回線が遅い場合や、スペックの低いマシンでは、少し時間がかかってしまうため、お気をつけください。
インストール、設定が完了しましたら、bebop_autonomy のインストールを行います。

// 必要なパッケージをインストールする
$ sudo apt-get install build-essential python-rosdep python-catkin-tools
$ sudo apt-get install python-rosinstall
// ソース格納用のディレクトリを作成
$ mkdir -p ~/bebop_ws/src && cd ~/bebop_ws
// catkin ワークスペースを初期化
$ catkin init
// ソースをクローンする
$ git clone https://github.com/AutonomyLab/bebop_autonomy.git src/bebop_autonomy
// 依存関係の確認
$ rosdep update
$ rosdep install --from-paths src -i
// ドライバのビルド
$ catkin build -DCMAKE_BUILD_TYPE=RelWithDebInfo
// 遠隔操作用のソースも必要なため src 配下にクローンしておく
$ cd ~/bebop_ws/src
$ git clone https://github.com/ros-teleop/teleop_tools.git

これで、インストールが完了です。簡単です。
次に、動作確認を行います。
動作確認用として、コンソールを3つ利用するので、terminal を3起動して確認します。

1つめの terminal で、Node や Topic を管理する roscore を起動します。

/* terminal 1 */
$ cd ~/bebop_ws/src
// path を通す
$ source devel/setup.bash
// roscore を起動する
$ roscore

2つめの terminal で、bebop_autnomy を起動します。
起動すると、ドローンとの接続が確立し、バッテリー残量やドローンの情報がコンソール上に表示されます。

/* terminal 2 */
$ cd ~/bebop_ws/src
// path を通す
$ source devel/setup.bash
// bebop_autnomy を起動する
$ roslaunch bebop_driver bebop_node.launch

3つめの terminal で、Topic に Publish することで、離陸と着陸が行えます。

/* terminal 3 */
$ cd ~/bebop_ws/src
// path を通す
$ source devel/setup.bash
// /bebop/takeoff に Publish することで離陸
$ rostopic pub /bebop/takeoff std_msgs/Empty
// /bebop/land に Publish することで着陸
$ rostopic pub /bebop/land std_msgs/Empty

bebop 用の Topic を調べてみると、以下のとおり、様々な Topic が用意されておりました。

/* terminal 3 */
$ rostopic list
/bebop/bebop_driver/parameter_descriptions
/bebop/bebop_driver/parameter_updates
/bebop/camera_control
/bebop/camera_info
/bebop/cmd_vel
/bebop/flattrim
/bebop/flip
/bebop/image_raw
/bebop/image_raw/compressed
/bebop/image_raw/compressed/parameter_descriptions
/bebop/image_raw/compressed/parameter_updates
/bebop/land
/bebop/navigate_home
/bebop/reset
/bebop/states/ARDrone3/CameraState/Orientation
/bebop/states/ARDrone3/GPSState/NumberOfSatelliteChanged
/bebop/states/ARDrone3/MediaStreamingState/VideoEnableChanged
/bebop/states/ARDrone3/PilotingState/AltitudeChanged
/bebop/states/ARDrone3/PilotingState/AttitudeChanged
/bebop/states/ARDrone3/PilotingState/FlatTrimChanged
/bebop/states/ARDrone3/PilotingState/FlyingStateChanged
/bebop/states/ARDrone3/PilotingState/NavigateHomeStateChanged
/bebop/states/ARDrone3/PilotingState/PositionChanged
/bebop/states/ARDrone3/PilotingState/SpeedChanged
/bebop/states/common/CommonState/BatteryStateChanged
/bebop/states/common/CommonState/WifiSignalChanged
/bebop/states/common/ControllerState/isPilotingChanged
/bebop/states/common/FlightPlanState/AvailabilityStateChanged
/bebop/states/common/FlightPlanState/ComponentStateListChanged
/bebop/states/common/MavlinkState/MavlinkFilePlayingStateChanged
/bebop/states/common/MavlinkState/MavlinkPlayErrorStateChanged
/bebop/states/common/OverHeatState/OverHeatChanged
/bebop/takeoff

Bebop Droneのカメラは魚眼レンズになっており、パラメータによって、ドローンの真下までカメラの向きを変更することができるようになっています。

ブラウザからのROSを利用した制御

ROSには、ブラウザからROSによる制御を可能とするため、JavaScriptを利用して制御可能とする ros.jsパッケージが用意されています。ros.js は、rosbridgeパッケージを利用して、rosbridge server と呼ばれる WebSocketサーバを経由して、ROSのPub/Subなどを実行する形になります。
こちらの利用方法について、ご紹介します。

// 必要なパッケージをインストールする
$ sudo apt-get install ros-fuerte-rosbridge-suite
// rosrun を実行するための launch ファイルを作成し、rosbridgeの設定を追加します
// 以下は記入例です
[drone.launch]

<arg name="port" default="9090"></arg>
<arg name="address" default=""></arg>
<arg name="ssl" default="false"></arg>
<arg name="certfile" default=""></arg>
<arg name="keyfile" default=""></arg>
<arg name="authenticate" default="false"></arg>
<group if="$(arg ssl)">
<node name="rosbridge_websocket" pkg="rosbridge_server" type="rosbridge_websocket" output="screen">
<param name="certfile" value="$(arg certfile)" />
<param name="keyfile" value="$(arg keyfile)" />
<param name="authenticate" value="$(arg authenticate)" />
<param name="port" value="$(arg port)" />
<param name="address" value="$(arg address)" />
</node>
</group>
<group unless="$(arg ssl)">
<node name="rosbridge_websocket" pkg="rosbridge_server" type="rosbridge_websocket" output="screen">
<param name="authenticate" value="$(arg authenticate)" />
<param name="port" value="$(arg port)" />
<param name="address" value="$(arg address)" />
</node>
</group>
// あとは、画面とのつなぎ合わせです
// 画面に二つボタンを用意します
[demo_takeoff_land/drone.html]
<div id="landtakeoff">
<button class="landtakeoff" id="takeoff" type="button" onclick="takeoff()">Take off</button>
<button class="landtakeoff" id="land" type="button" onclick="land()">Land</button>
</div>
// 離陸時はtakeoff()、着陸時はland()を呼ぶようにボタンの記載をしたので、JavaScriptは以下のように記載しておきます
[demo_takeoff_land/controller/js/drone.js]
// var rosbridge_server = JSON.parse($script.attr('ipaddr'));
// If there is an error on the backend, an 'error' emit will be emitted.
ros.on('error', function(error) {
console.log(error);
});
// Create a connection to the rosbridge WebSocket server.
ros.connect('ws://[server ip address]:9090');
landmsg = new ros.Topic({
name        : '/bebop/land',
messageType : 'std_msgs/Empty'
}),
takeoffmsg = new ros.Topic({
name        : '/bebop/takeoff',
messageType : 'std_msgs/Empty'
});
function land(){
landmsg.publish()
};
function takeoff(){
takeoffmsg.publish()
};

rosbridge server に接続し、topicを生成し、topic名とメッセージの型を指定した後に、publishを行うことで、bebop_autonomy で用意されているtopicにpublishが行われ、離陸と着陸の操作を行うことができます。
詳しくは、サンプルソースを参照してみていただければと思います。
画面イメージは、このような形になります。

また、このrosjs利用方法については、日本語のページも用意されているので、わかりやすいのではないかと思います。

おわりに

少しずつ、ROSを利用した制御方法についても慣れてきました。更に使いこなして細かい制御ができるように、ノウハウをご紹介していきたいと思います。次回もご購読いただけると幸いです。

著者プロフィール
安井 政人
安井 政人
新しい技術や、スキルの習得を好み、幅広い分野に柔軟に対応できるオールマイティなシステムエンジニア。 最近ではドローンやロボットの技術に注目し、業務を通じてNTTテクノクロスのドローン先駆者になるべく、絶賛奮闘中。 プライベートでは三姉妹のパパ。家の中は男一人で少し肩身が狭いですが、逆境にも負けず子育ても頑張っています!!