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

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

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

はじめに

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

準備

動作確認は、前回同様にUbuntu 14.04、Bebop Drone で行いました。
ドローンへの接続は、BebopDrone-xxxxx という名前のドローンを親機としたWiFi接続になっています。

動作環境確認


ドライバインストールなどの環境設定については、第6回の記事に記載しております、「ROSを利用した制御」を参照いただければと思います。

飛行制御

それでは、コマンド実行による飛行制御を行っていきます。
実行するコマンドは、以下のとおりです。

$ rostopic pub /bebop/cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"

コマンドの説明です。

Publish のメッセージタイプ : geometry_msgs/Twist
linear.x  (+)      前
(-)      後
linear.y  (+)      左
(-)      右
linear.z  (+)      上
(-)      下
angular.z (+)      左回り(旋回)
(-)      右回り(旋回)

それでは、コマンドを送信して、ドローンを制御していきましょう。といきたいところですが、コマンドの送信には注意が必要です。
まず一つ目は、挿入する値ですが、-1.0~1.0 が設定値の範囲内となっております。
しかし、-1.0 や 1.0 はかなりのスピードが出てしまうため、室内で飛行させているときなどは、おそらく壁などに衝突してしまいます。
また、値が小さすぎた場合でも、ドローン内部の飛行制御との競合(ここは検証による推測ですが、その場にとどまる処理や、ドローン下部にある衝突センサーによる処理が影響していると思われます)により、正常に制御できません。
お奨めの閾値としては、以下の値になります。

Publish のメッセージタイプ : geometry_msgs/Twist
linear.x  (+)      0.05~0.1
(-)      0.05~0.1
linear.y  (+)      0.03~0.05
(-)      0.03~0.05
linear.z  (+)      0.05~0.1
(-)      0.05~0.1
angular.z (+)      0.05~0.1
(-)      0.05~0.1

この辺の値は、ドローン個体差や空調の影響などを受けるため、チューニングが必要な箇所になってきます。

次に、二つ目ですが、コマンドを送信すると、ドローンはその命令に従い、動作し続けます。
動作を停止(ホバリング)させたい場合は、コマンドの説明で示したように、すべての値が「0.0」のメッセージを送信してあげる必要があります。
こちらを送信しないと、停止せず、進み続けてしまうため、かなり危険です。

というところで、コマンド送信による制御を試したい場合は、ターミナルを別々に立ち上げるなどして、すぐに動作を停止できる準備をしてから、実行する必要があります。
離陸&着陸用のターミナルと合わせて、3つのターミナルを立ち上げて、検証してみるのが、まずは良いかと思います。

/* terminal 1 (離陸&着陸) */
$ cd ~/bebop_ws/src
// path を通す
$ source devel/setup.bash
// bebop_autnomy を起動する
$ roslaunch bebop_driver bebop_node.launch
// テイクオフ実行
$ rostopic pub /bebop/takeoff std_msgs/Empty
/* terminal 2 (前進) */
$ rostopic pub /bebop/cmd_vel geometry_msgs/Twist "linear:
x: 0.1
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
/* terminal 3 (ホバリング(停止)) */
$ rostopic pub /bebop/cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"

という具合です。
緊急時は、以下ですぐに着陸できるようにしておけば、安全です。

/* terminal 1 (離陸&着陸) */
// 着陸実行
$ rostopic pub /bebop/land std_msgs/Empty

おまけ

ドローンの課題の一つに、「飛行時間」があります。
Bebop Drone の場合、10分程度となっており、数万~数十万で購入可能なドローンとしては、10分~20分が飛行時間の限界となっております。
そこで、少しでも長時間飛行(というよりも、長時間飛行による検証行う)を実現させたいと思い、強化バッテリーを購入しました。
これです。

あれ?!何か形が変です。正規のバッテリーと比較してみましょう。

強化バッテリー1


あきらかに、重そうです。そして重いです。

不安になりながらも、いざ、テイクオフ。

飛、飛んだ。しかし、重そう!

強化バッテリー2

形状が少し違う関係で、バッテリー設置部とうまく合っていないようです。
強化バッテリー3

そのため、重心が後ろに来てしまうこともあり、かなり不安定です。
いや、少し重心を前にかけてあげられるように、改造してみれば安定するのでは・・・(次回へ続く)

おわりに

次回も、ROSを利用した制御方法について紹介していきたいと思います。次回もご購読いただけると幸いです。

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