ArduPilot 入門 (7):ビルドが失敗する、シミュレーターが起動しない場合のトラブルシューティング

ビルドが失敗する、シミュレーターが起動できない、など環境構築時にうまくいかない経験をされた方も多いのではないでしょうか。
ArduPilot はほとんど毎日更新が入っているため、これまで動作していた環境を最新版に更新することで動かなくなる、ということがあります。
実際に本ブログでシミュレーターの環境構築手順を公開した後に、ArduPilot の要件に追加が発生し、本ブログ通りに実行しても正しく動作しない時期がありました。
私は困った時、「ドローンソフトウェアエンジニア養成塾※ のコミュニティ(入塾した人たちが活発に意見を交換している場)で何度も助けられましたし、GitHub 上の情報、Developer Wiki やその他にも様々な情報を確認しながら問題を解決してきました。

そこで今回は、ビルド手順、シミュレーター環境構築手順において、問題が発生した場合の対処方法について、これまでの経験やコミュニティに蓄積したナレッジをご紹介します。

※ 「ドローンソフトウェアエンジニア養成塾」コミュニティでは、塾生仲間でArduPilot を様々な機体で動かしたり、センサーのドライバー開発など実用化に向けたプロジェクトが多く動いており、塾生は貴重な開発現場に加わることができます。
ArduPilotを利用しようとして環境設定で苦労された方は多いと感じています。このような情報を公開することで「ドローンソフトウェアエンジニア養成塾」に興味を持って頂けたら嬉しいです。是非開催情報をご確認ください。

 

ArduPilot のソースコードを最新版にすると動作しなくなった

対象:SITL、BUILD

これまで正常に動作していた環境が、最新版に更新することで動作しなくなった場合は本事象に該当します。もしくは、手順通りに新規環境構築したがうまくいかない、という方もこちらに該当している可能性があります。

 

調査方法1

Developer Wiki で、環境構築手順に変更が発生していないかを確認してください。

シミュレーターの環境構築手順
Setting up SITL on Linux
http://ardupilot.org/dev/docs/setting-up-sitl-on-linux.html

Setting up SITL on Windows
http://ardupilot.org/dev/docs/sitl-native-on-windows.html

Setting up SITL using Vagrant
http://ardupilot.org/dev/docs/setting-up-sitl-using-vagrant.html

make によるビルド手順
Building ArduPilot for Pixhawk/PX4 on Linux with Make
http://ardupilot.org/dev/docs/building-px4-for-linux-with-make.html

Building ArduPilot for Pixhawk/PX4 on Windows with Make
http://ardupilot.org/dev/docs/building-px4-with-make.html

Building ArduPilot for Pixhawk/PX4 on Mac with Make
http://ardupilot.org/dev/docs/building-px4-with-make-on-mac.html

Eclipse によるビルド手順
Building for Pixhawk/PX4 using Eclipse on Windows
http://ardupilot.org/dev/docs/editing-the-code-with-eclipse.html

 

調査方法2

GitHub の Issues に問題として投稿されていないかを確認します。
https://github.com/ArduPilot/ardupilot/issues/

「DevEnv」や「BuildSystem」というラベルは要チェックです。
例えば、10月中旬ごろに最新版の ArduPilot のソースコードを取得した方は下記のエラーが発生するようになりました。
future

赤の四角で囲んだ部分はスタックトレースと呼び、エラー発生時に呼び出されていた関数情報です。スタックトレースは、関数呼び出しの流れを示し、上から下への順番に関数が呼び出されています。そのため、エラー発生時のスタックトレースを見る場合、一番最後の関数呼び出しが処理を中断させた”直接”原因となります。(直接原因と記載したのは、根本的な原因と区別するため)
今回の場合は、mavgen.py の 12 行目となっています。
https://github.com/ArduPilot/pymavlink/blob/7b0d51cca7e75b3cf84f5dbb74e76f727816e50d/generator/mavgen.py#L12

そして、エラーの直接原因は最終行に記載されている “ImportError: No module named future” となります。
それでは、エラーの内容が既に報告されていないかを issues で検索します。
github-issues
すると、1件ヒットしました。(ヒットしない場合には、赤字部分のエラー内容などキーワードを変えて検索、もしくは google で検索をするなど試します)

「lxml」と「future」のパッケージを追加すると書かれています。
下記のコマンドで future、lxml をインストールすることで、今回の事象を解決できます。`
sudo pip install future
sudo pip install lxml

※ Windows 環境は SITL の場合にはこちら、ビルドが失敗する場合にはこちら (多くの場合は PX4 toolchain を最新版に更新することで解決) をご参考ください。

捕捉ですが、上記の問題は ArduPilot が Submodule として使用している MAVLink でエラーが発生しています。この場合、MAVLink 側の issues もチェックするとよいでしょう。
https://github.com/ArduPilot/pymavlink/issues/25

また、条件が異なれば、異なるエラーが表示される場合もあるようです。
“fatal error: include/mavlink/v2.0/ardupilotmega/version.h: No such file or directory”
この場合も同様に、future、lxml をインストールすれば解決します。
https://github.com/ArduPilot/ardupilot/issues/4969

 

sim_vehicle.py: コマンドが見つかりません (sim_vehicle.py: command not found)

対象:SITL

 

調査方法

「環境変数の設定」がうまくいっていない可能性が高いです。

下記、2点の確認を実施してください。
1. 「.bashrc」に設定が登録されているかどうかを確認する
tail ~/.bashrc -n 3
画面に「export PATH=$PATH:$HOME/ardupilot/Tools/autotest」と表示されるかどうかを確認します。

[解決策]
表示されない場合には下記のコマンドを実行します。
echo 'export PATH=$PATH:$HOME/ardupilot/Tools/autotest' >> ~/.bashrc
source ~/.bashrc

 

2. 「.bashrc」の設定を読み込んでいるかを確認します。
echo $PATH
画面に $PATH の値が表示され、その中に
「:/home/<User Name>/ardupilot/Tools/autotest」が含まれるかどうかを確認します。

[解決策]
表示されない場合には、下記のコマンドを実行します。
source ~/.bashrc

 

“ImportError: No module named <モジュール名>” エラーが表示される

対象:SITL、BUILD

必要なモジュールがインストールされていない場合に表示されるエラーメッセージです。

 

対処方法

エラーメッセージに表示されたモジュールをインストールします。

例1) ImportError: No module named wx

sudo apt-get install python-wxtools

例2) ImportError: No module named future

sudo pip install future

※ 上記の例で示したコマンドは Ubuntu の場合です。OS に合わせてインストール方法をご確認ください。

 

マップが表示されない

 

対象:SITL

マップの読み込み時に下記のエラーが発生し、マップの表示に失敗する場合があります。
Loaded module map
Log Directory:
Telemetry log: mav.tlog
MAV> Waiting for heartbeat from tcp:127.0.0.1:5760
Process Process-3:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python2.7/dist-packages/MAVProxy/modules/mavproxy_map/mp_slipmap.py", line 93, in child_task
self.app.frame = MPSlipMapFrame(state=self)
File "/usr/local/lib/python2.7/dist-packages/MAVProxy/modules/mavproxy_map/mp_slipmap_ui.py", line 27, in __init__
state.panel = MPSlipMapPanel(self, state)
File "/usr/local/lib/python2.7/dist-packages/MAVProxy/modules/mavproxy_map/mp_slipmap_ui.py", line 228, in __init__
self.ElevationMap = mp_elevation.ElevationModel()
File "/usr/local/lib/python2.7/dist-packages/MAVProxy/modules/mavproxy_map/mp_elevation.py", line 25, in __init__
self.downloader.loadFileList()
File "/usr/local/lib/python2.7/dist-packages/MAVProxy/modules/mavproxy_map/srtm.py", line 97, in loadFileList
self.createFileList()
File "/usr/local/lib/python2.7/dist-packages/MAVProxy/modules/mavproxy_map/srtm.py", line 115, in createFileList
if childFileListDownload is None or not childFileListDownload.is_alive():
File "/usr/lib/python2.7/multiprocessing/process.py", line 155, in is_alive
assert self._parent_pid == os.getpid(), 'can only test a child process'
AssertionError: can only test a child process
STABILIZE> Unloaded module map

対処方法

SITL は起動時にマップのキャッシュ ファイルを読み込むのですが、初回起動時にはキャッシュが存在せずエラーとなります。キャッシュ ファイルは SITL を起動したまま数分待てば作成されます。

キャッシュの場所:~/.tilecache/SRTM/

上記のフォルダに filelist_python というファイルが作成されれば、次回以降マップが表示されます。
筆者の環境では7分ほどで作成されました。(ネットワーク通信が必要です。また、必要な時間はネットワーク回線の速度、コンピューターの性能により異なります)
filelist_python というファイルが作成されれば、「Ctrl + c」でキャンセルし、再度下記のコマンドで SITL を実行し、マップ画面が表示されるかどうかを確認します。
sim_vehicle.py -j4 --console --map -L Karuizawa

動作後、終了するには「Ctrl + c」を押下します。

初回起動時にマップの読み込みエラーが発生する動作は既に MAVProxy 開発チーム側に報告されており、修正コードも用意されているため今後修正される予定です。
https://github.com/ArduPilot/MAVProxy/pull/277

 

“no such option: -o” エラーが表示される

対象:SITL

オプションの指定が間違っている場合には、「no such option」というエラーが表示されます。
sim_vehicle.py -j4 -map -console
[実行結果]
no such option: -o
Perhaps you want --sim_vehicle_sh_compatible (-C)?

対処方法

上記の場合は、マップとコンソールのオプション指定が誤っています。「-」は1つではなく2つ必要です。
下記で再度実行し直してください。
sim_vehicle.py -j4 --map --console

 

その他、汎用的な対処方法

対象:SITL、BUILD

 

最新版に更新する

利用しているモジュールが古いことでエラーとなる場合があります。原因不明のエラーが発生している場合にも、最新版では修正されているかを一度確認してください。

下記のコマンドでそれぞれのモジュールが最新版になっているか確認します。
ArduPilot とそのサブモジュール
cd ~/ardupilot
git pull
git submodule update --init --recursive

JSBSim (Plane のシミュレーターを動作させる場合)
cd ~/jsbsim
git pull
./autogen.sh --enable-libraries
make

MAVProxy
sudo pip install --upgrade pymavlink MAVProxy

※ Windows の場合はこちらより最新版を取得

サブモジュールを取得し直す

下記のような modules 配下のパスに対して、ファイルが見つからない、といったエラーが発生している場合には、サブモジュールがうまく取得できていない可能性があります。

/home/<User Name>/ardupilot/modules/XXXXX

その場合には、「/home/<User Name>/ardupilot/modules」フォルダを名前変更、もしくは削除を行い、再度サブモジュールを取得します。

git submodule update --init --recursive

 

ArduPilot のソースコードを取得し直す

「/home/<User Name>/ardupilot」フォルダを名前変更して、再度クローンを実施します。

git clone --recursive git://github.com/ArduPilot/ardupilot.git

 

※ 告知
ドローンソフトウェアエンジニア養成塾第3期 (4月1日より開始) の開催が決定しました。
現在、受講者を募集中です。

ArduPilot や Mission Planner の使い方を知りたい方、DroneKit を用いたアプリケーション開発をしたい方、ArduPilot をソースコードレベルで理解してオープンソース コミッターになりたい方、目的別に合わせてコースを用意しておりますので、是非募集ページをご確認ください。

 

著者紹介

yamaguchi_picture山口達也
ドローンソフトウェアエンジニア養成塾 第1期卒業生。

記事の誤りを見つけた方は下記のメールアドレスまでご連絡ください。
techblog@drone-j.com
(週末にメールを確認していますので、対応が遅くなること、休みの日にメールを返信させていただくこと、ご了承ください。)