2017年5月27日土曜日

C++で使える使いやすい線形台数のライブラリ


はじめに

ロボットを開発している際にベクトルや行列のライブラリを使いたくなることは多いと思います。


本来ベクトルである物理量にたいして、その各成分を変数で定義して管理するよりも、クラスや構造体で管理した方がすっきりしますし、ベクトルの演算がオーバーロードされていた場合かなりコードが見やすくなります。
(演算子のオーバーロードは処理パフォーマンスは悪くなりますが、きれいなコードを書いた方が自分にとって幸せな気がします。)


ただ、ベクトルクラスや行列クラスを自分で作るのはちょっと面倒ですよね。ですので、既存のライブラリを使いましょう。

Eigenを導入

Eigenというライブラリを使いましょう。
博士っぽい帽子をかぶっている太った茶色いフクロウがマスコットキャラクターです。


ダウンロード方法

以下からダウンロードできます。
http://eigen.tuxfamily.org/index.php?title=Main_Page


プログラムへの組み込み方

ダウンロードしたら解凍し、自分のコードにEigenというフォルダをまるっとコピーしてください。後はEigenのモジュールをincludeするだけで使えます。

簡単な使用例

例えば、二次元のベクトルを使う場合以下のような記述になります。


//Eigenのモジュールのインクルード
#include <Core>
#include <Geometry>

using namespace Eigen;

// 二次元ベクトルの定義
Vector2f v1(3.3f, 3.0f);
Vector2f v2(1.0f, 0.5f);

Vector2f v = Vector2f::UnitX();
//足し算
v = v1 + v2;
//スカラー倍
v = 3.0 * v1

//各成分へのアクセス方法は↓以外にもいろいろある。
printf("test %f,%f\n",v(0),v(1));

ベクトルの初期化の仕方や各成分へのアクセス方法はいろいろと用意されているようです。他にも便利なものがいろいろと用意されています。

Eigenのリファレンス
https://eigen.tuxfamily.org/dox/group__QuickRefPage.html

Eigenのいいところ


個人的にEigenでいいと思っている点は以下の3点です。
  • クオータニオンのクラスがある。
  • ヘッダファイルのみからなるので、ビルドが必要ない。
  • ルネサスのRXマイコン(開発環境はe2studio)で使えた。

おわりに


もっと早く存在に気付いて積極的に使ってればよかったと後悔しています。自分でベクトルの演算をオーバーロードしたクラスを実装し使ってもいいのですが、素の実装は非常に効率が悪い*ようです。


*) 二項演算子でオブジェクトの生成が何度もされてしまうのが主な原因。Expression Templateとかいうテクニックを使うといいらしい)

2017年5月20日土曜日

ラズパイ3のBluetoothとWifi干渉対策

初めに

BluetoothとWifiはどちらも2.4GHz帯を使用しており、干渉することが知られています。
実際に、ラズパイ3内蔵のWifiとBluetoothを同時使用すると、Bluetoothの受信データにかなりゴミが入ってきます。そこで、今回はこの問題を解決する方法を考えてみました。


何がしたかったのか

自作ロボット <–> ラズパイ3 <–> PC
上記のようにデータのやり取りをしていたが、「ロボット <–> ラズパイ3」間がBluetooth接続であったために、「ラズパイ3 <–> PC 」間の接続をWifiにしてしまうと干渉してしまうので何とかしたい。


対策 : Wifiを5GHz帯で使用

2.4GHz帯の干渉はどう頑張っても解消できません。素直にWifiを5GHz帯にしましょう。
しかし、ラズパイ3の内臓Wifiモジュールは2.4GHzにしか対応してません。なので、外付けのドングルを使うことになりますが、良さげな5GHz帯に対応したドングルってあまりないんですよね。。。


こんなの買ってみた

そこで、発想を転換しラズパイさんにWifi接続させるのはやめて、有線LANを無線LANに変換できるものはないかと探したところ、無線LANコンバーターに行きつきました。
下のエレコム製の小型ルーターが良さそうだったので購入してみました。
エレコム 無線LAN ポータブルルーター WRH-583YL2-S
11ac/a 11n/b/g 433+150Mbps USBケーブル付属
https://www.amazon.co.jp/gp/product/B00ZFLK6KI/




この小型ルーターは以下の特徴があります。
  1. 小型
  2. USBケーブルから給電可能
  3. 2.4GHzと5GHzどちらにも対応
  4. ルーターモード、アクセスポイントモード、コンバーターモードを備える
  5. 有線LANポートを備える
小型で5GHzで使えてかつコンバーターモードを備えているルーターはあまりありませんでした。このルーターは値段も1600円くらいと手ごろです。ちなみに、ルーターの色により結構価格が変わります。黄色は安いです。


使ってみた

自宅で使う際には自宅のルーターにコンバーターモードで繋ぎます。5GHzでつないだら、Bluetoothが安定して無事通信できるようになりました。
ついでに、ラズパイとルーターへの給電をモバイルバッテリーにしてみました。
今はルーターがすでにある自宅内なので小型ルーターをコンバーターモードにしていますが、自宅外で使う際は小型ルーターの設定をアクセスポイントモードに変えてPCを無線でつなげれば問題なくLANを構成可能です。


ラズパイはgamepadの入力を取るためと、Webアプリのサーバーとして利用してます。



野望

ラズパイ3と小型ルーターとモバイルバッテリーの下にステッピングモーターをつけて移動台車にする。Bluetooth接続している機体と隊列走行とかできたら楽しそうですね。