組み込み備忘録

元組み込みエンジニアで現在某大学のM1在籍中です.研究の備忘録的なブログにしようと思います

SITLの機体の総重量を変化させて、挙動を確認する。

SITLの機体の総重量を変化させて、挙動を確認する。

概要

Ardupilotでは実機を飛ばさなくても、シミュレーター(以下SITL)上で機体の挙動を確認することができる。
さて、実際のクワッドコプターにおいては機体にカメラやセンサー等、様々な荷重がかかることが考えられる。
そこで、今回は擬似的に荷物の重量を加算して、挙動がどのように変化するのか、確認してみた。

推力スケーリング

機体に加わる推力は機体の総重量(機体と肥料の重さ)を基にスケーリングしている。
つまり、単純に機体、もしくは肥料の重さを追加しただけでは挙動は変化しない。

SIM_Multicopter.cpp

float MultiCopter::gross_mass() const
{
    return Aircraft::gross_mass() + sprayer.payload_mass() + gripper.payload_mass();
}

SIM_Frame.cpp

void Frame::init(float _mass, float hover_throttle, float _terminal_velocity, float _terminal_rotation_rate)
{
    /*
       scaling from total motor power to Newtons. Allows the copter
       to hover against gravity when each motor is at hover_throttle
    */
    thrust_scale = (_mass * GRAVITY_MSS) / (num_motors * hover_throttle);

    terminal_velocity = _terminal_velocity;
    terminal_rotation_rate = _terminal_rotation_rate;
}

※_massに渡される数値はgross_mass()の返り値が渡される。

修正内容

このままではいくら重さを変えたところで、推力はスケーリングされてしまうため、
挙動に変化はない。
そこで、以下の様にMultiCopterクラスのコンストラクタのframe->initが実行される際に渡す_massを
総重量(gross_mass())ではなく、機体のみの重量(mass)を渡せば良い。

SIM_Multicopter.cpp

MultiCopter::MultiCopter(const char *home_str, const char *frame_str) :
            Aircraft(home_str, frame_str),
            frame(nullptr)
    {
    mass = 3.0f;

    gripper.set_aircraft(this);
    frame = Frame::find_frame(frame_str);
    if (frame == nullptr) {
        printf("Frame '%s' not found", frame_str);
        exit(1);
    }
    // initial mass is passed through to Frame for it to calculate a
    // hover thrust requirement.
    if (strstr(frame_str, "-fast")) {
//        frame->init(gross_mass(), 0.5, 85, 4*radians(360));
        frame->init(mass, 0.5, 85, 4*radians(360));   //機体の重量のみ渡す
    } else {
//        frame->init(gross_mass(), 0.51, 15, 4*radians(360));
        frame->init(mass, 0.51, 15, 4*radians(360)); //機体の重量のみ渡す
    }
    frame_height = 0.1;
    ground_behavior = GROUND_BEHAVIOR_NO_MOVEMENT;
}

加算したい重量は以下の様にcapacityに任意の値を入れる。。

SIM_Sprayer.h

double capacity = 70.0; // litres

当然だが機体の重量に対して極端に大きな値をcapacityに設定してしまうと
飛ばなくなってしまうので注意。

QtCreater起動時に画面が真っ暗になってしまう症状の対策

QtCreater起動時に画面が真っ暗になってしまう症状の対策

Virtual Box上のUbuntuにて、QtCreater起動時に画面が真っ暗になってしまい、まともに使えない症状に長年悩まされてました。

本日この症状の解消方法を見つけたので、報告します。

 

症状

QtCreaterを起動するとウィンドウの右半面が真っ暗になってしまいます。Guest Additionを入れなおしたり、仮想マシン自体を構築しなおしたり、グラボの更新をしたりしましたが、改善されませんでした。

また、別ソフトになりますが、QgroundControlにおいて起動時にVideoReceiverのStart()関数でエラーが発生しており、起動できない症状が発生していました。

f:id:simoneFX:20170524204018j:plain

 

原因・対策

あれこれ調べましたが結局原因はわかりませんでした。そこで、Virtual BoxではなくVMwareで動かしたらどうかと思い、以下手順にしたがってVirtualBox仮想マシンVMwareに移行したところ改善されました

 

Oracle VirtualBox で実行している仮想マシンを VMware Fusion、Workstation、または Player にインポートする (2080574) | VMware KB

 

結果

QtCreaterとQGroundControlは今のところ問題なく動いています。

ただ、以前VMwareを使っていた際にVMware toolsが勝手に無効化されてしまう症状に悩まされた経験があるのでこの先も安定して使えるか不安は残ってます。ところで、最近のVMwarevmware-toolsではなくて open-vm-toolsというのに変わったみたいですね。今後もトラブルが起こらないことを祈っています。

 

Unity専用クラスライブラリを生成するツールを作りました。【UnityDLLCreater】

概要

タイトル通りですが、C#のソースファイルからUnity用のクラスライブラリを生成するツールを作成しました。

f:id:simoneFX:20170506113435p:plain
 

ダウンロード:http://yahoo.jp/box/OWUlCD

GitHubhttps://github.com/hiroyuki405/UnityDLLCreater

 

DLLについて

Unityに限ったことではないですが、プログラムが肥大化するとビルドに時間がかかり、開発効率が低下します。そこで、事前にいくつのソースファイルをDLLとして生成することで、ビルド時間を短縮し、開発効率を向上させることができます。

また、頻繁に使用する関数などは1つのDLLにモジュールとしてまとめることで、開発のたびに車輪の再発明をしなくて済みます。

 

使い方

①ソースファイルを作成する。

ライブラリ化するソースファイルを作成します。例として以下のような引数として与えられた文字列に現在時刻を挿入するプログラムを作成します。

f:id:simoneFX:20170506121021p:plain

 

②UnityDLLCreater.exeを実行する。

今回作成したツールが「UnityDLLCreater」です。現状Windows環境でしか動きません(Macの方すみません)

初回起動時にUnityがインストールされているフォルダが聞かれますので、Unityのフォルダを指定してください(初期設定であればPrograms Filesに入ってると思います)

 

f:id:simoneFX:20170506120325p:plain
f:id:simoneFX:20170506120349p:plain
 

 ちなみにこの設定は初回起動時のみで、以降表示されません。

③変換するスクリプトと出力先を指定する。

正しくフォルダが指定されるとウィンドウが立ち上がり、「smcs.bat」、「UnityEngine.dll」、「UnityEditor.dll」の3つに「Succes」が表示されます。

この状態で「変換元スクリプト」と「出力先」を指定します。今回は「testlib.dll」というDLLを生成します。

※変換元スクリプトは"*.cs"ファイルが存在するディレクトリを指定してください。

 

指定が完了したら「DLL生成」をクリックしてください。ビルド:Succesが表示されていれば無事にDLLが生成されています。「出力先」をクリックしてDLLの出力先フォルダを開きます。

 

f:id:simoneFX:20170506120635p:plain

 

④出力したDLLをアセットフォルダに入れる。

生成されたDLL(testlib.dll)はアセットフォルダ配下にコピーすることで、使用できるようになります。ちなみにUnityではアセットフォルダ配下にあるdllは自動で参照設定が行われるため、コピーするだけで使用可能な状態になります。この状態で今回作成したtestlib.dllが使える状態になります。

以下、クラスライブラリを使用して”本日は晴天なり”という文字列の先頭に現在時刻を挿入するスクリプト

 

f:id:simoneFX:20170506121613p:plain

 

 今回作成したtestlib.dllはnamespaceを使用しているため、上記のように使用したい場合はソースファイルの先頭にnamespace(今回であれば"using TestLib")を追記してください。

 

トラブルシューティング

No1.必須ファイルに「Not Found」が表示されてビルドができない。

Unityフォルダが正しく設定されていない場合に表示されます。この場合は再検索ボタンをクリックして再度Unityフォルダを指定してください。

f:id:simoneFX:20170506122951p:plain

 

No2.別VerのUnityで使用できるDLLを作成したい

「再検索」をクリックして作成したいバージョンのUnityが保存されてるフォルダを選択して再度「DLL生成」をクリックしてください。バージョンの差異が近ければバージョン事にDLLを作り直す必要はないかも。未検証です。

 

No3.ビルドができない。

ビルドができない場合は以下が考えられます。

  1. ソースファイルの記述そのものに誤りがある。
  2. 必須ファイルが正しく設定されていない(Not Foundになっている)
  3. 変換元スクリプトで指定しているディレクトリに*.csファイルが存在しない。

等です。ビルドした際のログを出力するようにしているので、ログの内容も確認してみてください。

 

 

そのほか、何かありましたら遠慮なく連絡してください。

twitter.com

 

 

 

 

 

NetbeansでArdupilotの開発環境を構築する.

はじめまして.

元々組み込み兼Windowsアプリケーション開発エンジニアとして働いていましたが,退職して今年から某大学の博士前期課程に所属しています.

このブログでは知識のアウトプットをしていきたいと思います.

1. NetbeansでArdupilotの開発環境を構築する.

Ardupilotの代表的な開発環境としてEclipseが挙げられますが,

Eclipseにあまり馴染めなかったので,Netbeansを使った開発環境をご紹介したいとおもいます.

環境は以下を想定しております

  • OS:Ubuntu 16.04 LTS(Virtual Box上に環境を構築)
  • IDENetbeans IDE 8.2
  • Board:PixHawk

PCの詳細スペックは省略

2. Netbeansとは

Netbeansとはオラクルが開発したIDEで主にWeb開発でよく使われています.Netbeansの細かい紹介やインストール方法はよそのサイトで大量に書かれているため,本記事では省略します.

f:id:simoneFX:20170427184430j:plain

 

3. Netbeansの利点

Netbeansは軽量でデザインがシンプルかつ扱いやすい点が特徴です.1年近く愛用しており、前職では組み込みLinuxの開発をNetbeansで行っていました。

欠点はEclipseと比べると情報量やプラグインの数で劣る点です。

 

4. Ardupilotのソースファイルを取得する。

今回はNetbeansのインストール方法は省略し、Netbeansはインストール済みで起動ができる状態であることを前提条件とします。

まず、ArdupilotのGitからソースファイルを取得します。gitがなければgitを先にインストールしてください。

sudo apt-get install git
cd ~/
git clone --recursive git://github.com/ArduPilot/ardupilot.git

cd ~/ardupilot

git pull
git submodule update --init --recursive

5. Netbeansを起動しArdupilotのプロジェクトを作成する。

Netbeansを起動し,「ファイル」→「新規プロジェクトを作成」を選択します.

f:id:simoneFX:20170427191007j:plain

「新規プロジェクト」内のカテゴリ「C/C++」を選択し,「既存のソースを使用するC/C++プロジェクト」を選択します.

最後に「次へ」を選択します.

f:id:simoneFX:20170427191116j:plain

 

ここで先程取得したardupilotのソースを指定します.「参照」を選択し,ardupilotのフォルダを選択してください.

問題なければ「次へ」を選択します.

f:id:simoneFX:20170427191249j:plain

 

するとプロジェクトフォルダが作成され,Netbeansの左側にardupilotのプロジェクトフォルダが表示されます.

f:id:simoneFX:20170427191433j:plain

 

以上で,プロジェクトフォルダの作成は終了です.

6. ビルド設定を行う

現状のままだとビルドを行ってもビルドの設定が正しくされていないため,ビルドできません.そこで,ビルドの設定を行います.

ardupilotフォルダを右クリックし,プロパティを選択します.

そしてカテゴリ内の「make」を選択してください.

ここでビルド時の設定を行います.

まず,作業ディレクトリ(ビルドが実行されるフォルダ)を指定します.これはビルドしたいターゲットに応じて異なります.

例えばPlaneをビルドしたいのであれば「ardupilot/Plane」を指定し,Roverでビルドしたければ「ardupilot/APMRover2」を指定します.

f:id:simoneFX:20170427191813j:plain

 

次にビルドコマンドを「make px4-v2」に変更し,「OK」を選択します.

f:id:simoneFX:20170427192151j:plain

以上で設定は終了です.これでNetbeansでビルドを実行する.elfファイルが吐き出され,MissionPlannerでファームウェアを書き込めば新しいカスタムファームウェアで動かすことができます.

余談ですが,ビルドコマンドをwafにすることで「waf build system」を使うこともできます.この辺の解説はまた今度

 

ご指摘ご質問等ありましたら,コメントください.