2017年12月10日日曜日

ブログ移転します。


以下のアドレスのサイトにブログを移転します。
  http://robot-bibimbap.com/wp/

併せて、wikiも作ってみました。
      http://www.robot-bibimbap.com/dokuwiki/doku.php   

よろしくお願いいたします。


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接続している機体と隊列走行とかできたら楽しそうですね。

2017年4月30日日曜日

ロボットのコンソールを作ろう = Bluetoothの出力をlinux(ラズパイ)で取得 =

今回はUART-Bluetooth変換モジュールの出力をlinuxで取得する方法について書きます。

やりたいこと


前回の記事で、いくつかのUART-Bluetooth変換モジュールを紹介しました。

今回はlinux(ラズパイ)での通信手順について説明します。

どうすればいいか


モジュールが変わっても基本的な使い方は同じで
 1. ペアリングをする
 2. デバイスファイルを割り当て
 3.デバイスファイルにアクセス
の三つです。ちなみに、Windowの場合ペアリングをした後に、仮想ComポートでBluetooth機器にアクセスできることが多いです。

1.ペアリングをする
必要なパッケージのインストール
sudo apt-get install bluetooth bluez-utils

Bluetooth機器の検索
hcitool scan
繋ぎたい機器のマックアドレスを探す


Bluetooth機器との接続のための対話モードに入る
bluetoothctl
(忘れてしまって申し訳ないのだが、Bluetoothをデーモン起動みたいなステップがあったかも)

 対話モード
 > pair MACアドレス
 > trust MACアドレス
 > connect MACアドレス
 > exit


2.デバイスファイルの割り当て
sudo rfcomm bind /dev/rfcomm1  繋ぎたい機器のMACアドレス
上記のコマンドで/dev/rfcomm1がBluetoothの入出力をするためのデバイスファイルとなります。

3.デバイスファイルにアクセス
通信にはPythonのpyserial等を使うのがよいと思います。pyserialで先ほど割り当てたデバイスファイルにアクセスするとマイコンとのデータの送受信が可能です。
注) うまく通信ができなかったら/dev/rfcomm1の読み書きの権限に注意してください。

そのうちサンプルコードを追加します。





ロボットのコンソールを作ろう = マイコン(UART) - Bluetooth間の通信 =

マイコンのインターフェースとしてUARTは基本的だと思います。PCとマイコンを接続する際には次のようなシリアルUSB変換モジュールを使用することが多いでしょう。
秋月電子で600円で買えますし、基板サイズが小さく使いやすいです。

超小型USBシリアル変換モジュール
http://akizukidenshi.com/catalog/g/gM-08461/

さて、UARTの信号を無線化する選択肢の中で手軽なのはBluetoothへの変換です。
(他の選択肢としてはZigbee等がありますね。)

UARTとBluetoothの変換ができるモジュールをざっとあげてみます。

マイクロチップ(秋月で手に入るRNシリーズ)
   マイクロチップ Bluetooth RN4020-V/RM123
     RN4020
     http://akizukidenshi.com/catalog/g/gM-10066/    
     大きさは小さいがBLEなので通信速度が出ない  

     マイクロチップ Bluetoothモジュール RN42-I/RM
     RN42
     http://akizukidenshi.com/catalog/g/gM-07612/
     扱い易いが大きさが少し大きい
     通信速度が230400bpsまでしか出ない

ランニングエレクトロニクス
     SBDBT5Vです
      SBDBT
    http://www.runele.com/ca1/8/p-r-s/
      Bluetoothドングルが必要
      かさばって、でかい
      ルネサス製のマイコンの書き込みを無線化できる(flash programmerで書き込めた)
      通信速度が230400bpsまでしか出ない
      PCとの通信は仮想COMポート

STマイクロ
  SPBT2632C2A.AT2 STMicroelectronics | 497-13189-ND DigiKey Electronics
      SPBT2632C2A
      小さい
      通信速度が560kbpsまで出る
      マイコンと2Mbpsで通信可能
      PCとの通信は仮想COMポート
      digikeyで2000円くらい


この中だと断然、SPBT2632C2Aがおすすめです。配線もUARTのRX、TX、GND、電源、
どこかのピンのプルアップくらいしかないので楽です。ただ、ちょっとデータシートがわかりにくいです。



次回は、UART-Bluetooth変換モジュールを介してやりとりされる信号をPCで取得する方法について書きたいと思います。


2017年4月29日土曜日

ロボットのコンソールを作ろう -概要編-

書く内容が多いので何本かの記事にわけて書きたいと思います。
今回は連載一回目の概要編です。

作ったもの

こんなの作ってみました。マイクロマウスの調整用コンソールです。
以下が可能です。
 ・ロボットの各種パラメータを常に表示
 ・ロボットからのデバッグメッセージ(printfの内容)を表示
 ・迷路の情報リアルタイムに表示
 ・gamepadの入力をロボットに送信





コンセプト

何を作りたいのか?

「自分で作ったロボットの調整および、開発の補助ツールとしてロボットのデータを表示するターミナルのようなものを作りたい」

こんなことを数年前からずっと考えていました。そして、これがある程度形になってきたので苦労したところや勘所になりそうなところをブログにまとめてみることにしました。


私が、作っているのはマイクロマウスと呼ばれるロボットですが、開発時間の大多数はプログラムのデバッグ及び、走行パラメータの調整です。そのため、少ない開発時間で効率的にロボットを開発するためには開発環境の整備はクリティカルに効いてきます。(私はツールを作るのが好きなので、開発環境を作ることが目的になってる気がしないでもない。)

多くのロボットを作っている人はこのような自分用ツールを作っていると思います。
そこで、私も作ってみようと作り始めてみたのです。

要件としては、こんなところを設定してみました。

 ・printfの結果を出力
 ・ロボットの内部パラメータをリアルタイムに表示
 ・ロボットとの接続は無線接続
 ・無線部分のハードウェアはできるだけ小型にする
 ・アプリを明示的に立ち上げるのは面倒なので、勝手につながる
 ・接続が切れても勝手に再接続
 ・Webアプリで実現
 ・ロボットが複数あっても対応可能

htmlやjavascript、サーバーやlinuxの知識が作ろうと思い立ったときにあまりなかったので、習作の意味もあります。


使った技術

恥ずかしながら、組み込みのC言語以外はあまり得意ではないので正しい使い方をしていないものもあると思います。
 ・Node             Webサーバを立てるのに使用
  (最近mosquittoがWebsocketに対応していることに気づく、Webサーバいらないな)
 ・MQTT           ラズパイ同士の通信に使用 
 ・Websocket   ブラウザで表示しているアプリとサーバー間の通信に使用
 ・Bluetooth     マイコンのUARTとBluetoothの変換
   ・html5           Webアプリの見た目部分
 ・javascript     Webサーバーの記述、html内での通信ロジックの記述
 ・python          Bluetoothへの入出力、gamepadへの入力を取得



システム図

システムはラズパイ2匹が裏方で、人が見る画面はWebアプリとして実現しています。



連載予定

 ・マイコン(UART) - Bluetooth間の通信
 ・Bluetoothの出力をlinux(ラズパイ)で取得 (pythonを利用)
 ・gamepadの出力をlinux(ラズパイ)で取得  (pythonを利用)
 ・MQTTで遊ぼう 
 ・Webserverを立てよう
 ・Webアプリを作ってみよう (そんな大げさではない... )
   ・printfの結果を出力するコンソールをWebアプリで実現
 ・スクリプトのデーモン化 (nodeのforeverを利用 )
 ・ノンブロッキングな通信を実現するには 
 ・three.jsで迷路を作ったよ




書きたいと思ったことをつらつらと並べてみました。私はこんなにたぶん書かないと思います。



2017年1月14日土曜日

「あれっ? このプログラム動作変わってなくね?俺はそもそもちゃんと書き込んだのか」現象の対策

はじめに


ロボットの作成中は次の3つのステップを何回もたどります。

   プログラム修正  --> ロボットへ書き込み --> ロボットの動作が変わったことを確認

この3つは省略することができない動作です。


ロボットを長時間調整していて意識が朦朧としてくると、

「プログラムを修正したつもりでいるのにロボットの動作が変わらないぞ?」

となり、

「あれっ? このプログラム動作変わってなくね?俺はそもそもちゃんと書き込んだのか?」現象

に遭遇することが多々あります。


筆者はこの現象に長年悩まされていましたが、ついに重い腰を上げこの現象の対策に乗り出すことにしました。

対策(視覚的に)


とつぜんですが、皆さんはC++の__TIME__、__DATE__、__FILE__というマクロはご存知でしょうか。
これらのマクロはコンパイル時にその環境に応じて"文字列"に置換されます。

まず、対策としてこれらのマクロをロボット起動時に文字列として出力するようにしました。

myprintf3()関数はコンソール出力用の関数です。(適宜自分の環境のコンソール出力用関数に読み替えて下さい。)

compile_hashという変数は__TIME__を文字列ではなく、整数として見て各文字毎に和を取った値です。コンパイルを行う度に値が変わります。

ソース例










しかし、この対策は文字列が出力されるコンソールを見るという視覚的な要素が絡むので、調整に疲れた極限状態の際には効果をあまり発揮しません。

対策(聴覚的に)


視覚的な対策を行う際にcompile_hashというコンパイルの度に代わる変数を用意していました。
これを使って以下のような処理をマイコンの起動時に走らせています。

    compile_hashの値に応じた音程で音を鳴らす。

これにより、筆者は「あれっ? このプログラム動作変わってなくね?俺はそもそもちゃんと書き込んだのか?」現象を完全に撃退することに成功しました。

おわりに


ほんとに些細な工夫ですが、プログラムのデバッグ時の無駄時間を少し減らすことに成功しました。個人でのロボット制作の醍醐味の一つが自分を自分のためのSEとして使うことだと思います。こういう工夫するのって結構楽しくないですか。