2018年6月10日日曜日

YDLidar X4 をESP32で使ってみた

1万円LidarのYDLidar X4を使ってみた記録です。

概要

・YDLidar X4のシリアル信号デューティ比問題を改造で乗り切り、ESP32を含む様々なシリアルに繋ぎやすくした。
・ESP-IDF向けの実装でデータを取得できるようにした。
・角度計算の式を近似式で軽量化した。


ハードウェアの修正

YDLidar X4にはシリアルのデューティ比が狂うという問題があります。以下のオシロの図はLow/High/Low/Highとなっていますが、真ん中のHiとLowの幅をみると長さが違います。これを修正する必用があります。
この問題を修正する改造ポイントが以下になります。ここは赤外線で来た鈍った信号を閾値で0/1に変換するコンパレータが入っています。矢印の先が閾値を決定する12kの抵抗(
2個)です。

 上の図でP2の位置の電圧を可変にするために、既存の抵抗をとっぱらった後に、
抵抗とポテンショを以下のように繋ぎます。
P1==[R4.7k]==[POT 10k]==[R4.7k]==P3
ポテンショの中点をP2に接続すればOKです。
調整はオシロがあれば、良いのですが、なければ以下の私の実装だと、check sum errorをESP_LOGEで出力しているので、そのerrorが減るように真ん中付近からポテンショを動かしてみて下さい。

ESP-IDF用の実装

オフィシャルにはArduino用の実装があります。(https://github.com/EAIBOT/ydlidar_arduino)しかし、この実装はIO待ちをループで実装しているため、ESP-IDFにはむきません。ということで、実装してみました。
 https://bitbucket.org/akira_you/esp-ydlidarx4/

使い方はmain.c及びydlidarTask.hを見て下さい。C言語でのインターフェイスで呼び出しています。複数のYDLidarを使うにはydlidar_beginの中身を参考にYDLidarクラスを直接呼び出して下さい。

計算高速化(興味ある人向け余談)

 ESP32で使う上で残る問題が計算量です。YDLidar X4のデータは「角度」と「距離」からなりますがこの角度は、距離に依存して補正するAngCorrectという関数で補正をかける必要があります。こいつがatanを含んでいるのですが、5kHzでatanを計算するのはESP32には余裕というわけではないです。
角度補正式

このAngCorrectは十分にDistanceがあれば、1/(a*[Distance]+b)-cという式の形に近似できます。Cは無限遠時の値、約-7.99に固定できるのでa,bを以下のスクリプトで120mmから10mの範囲で最適化しました。(ちなみに120mmは最小測定距離)
  https://gist.github.com/akirayou/3fd54239e6bbd4abb416c8bea73ad1f0




YDLidarX4は罠の多い製品ですが、1万円ならないよかましですよね。
以上


 

2018年5月23日水曜日

デザイナにはデータを構造化して渡そう

イベントのスケジュール欄とかの印刷物を作っていると、後から後から修正が来て結局修正漏れになったりする事って多いですよね。ということで西院フェス(音楽フェス)のパンフ作成でやって上手く行ったワークフローの紹介です。
 イメージ的にこんなやつです。このミュージシャンが変更になった、バンド名に「.」が抜けていたとかいう連絡さ五月雨式にやってきます。

ステップ1:情報を一カ所に集める

西院フェスの場合は、Webで全てを管理してますが、いきなりハードル高いデスよね。Google docなんかでエクセルを共有するだけでも良いかと思います。
エクセルでやるならばvlookupなどを使って、スケジュール一覧にバンドIDいれれば、そこから各種データを切り出せるよ!っていうセルマクロが要るとは思います。

ただし全員がそのデータを見て「便利」と思わないと積極的に更新してくれません。各自の連絡をうけて一人で更新すると気が滅入るので、各ブッキング担当・会場担当が自分で更新してくれる空気作りに数年かかりますが、できちゃうと超楽です。
西院フェスでは以下のように一カ所のデータを多面的に使う事で、全員がソコに有るデータが原本という風に認識しています。

  1. ブッキング担当の音源選考用データベース(音源が貼り付けてあって聴ける)
  2. Webに載せる用のライブスケジュール(自動で連動)
  3. パンフ/ポスター担当がスケジュール及び、ミュージシャン/会場一覧覧をGET
  4. 出演時間の交渉のための各会場担当用の連絡先一覧
  5. PA番長が会場ごとに機材仕込むための要望機材一覧表
  6. PAマンが会場で使う出演順のセッティング図一覧
ちなみに、西院フェスでは以下のようにJSONでスケジュール一覧をGETできるサービスを持っているので、ソレをつかってパンフ担当は仕事をします。

https://saifes.net/joinA/artist_json.php?e=2017spring

ステップ2:データを流し込む

データをイラレのスクリプトを使って流し込みます。文字列がはみ出たりするけれども、どうせフォント縮小でいくのか、改行でいくのかパンフ担当が拘りたいところなので、何もせずはみ出たまま流し込みます。
この時流し込む座標はスケージュール時間と、テンプレートとなるイラレファイルから計算して座標を求めています。なので既に作ったスケジュール枠の上にレイヤーを重ねれば左上の絶対位置は正しいという風になります。


ステップ3:差分を自動生成する 

流し込みができたので完成と思いがちですが、字詰めも終わったぞ〜〜って時に変更依頼がきたりします。ここでゼロから流し込みするわけにはいきません。
ということで、差分情報を元に変更一覧を作ってあげます。この変更一覧は上の流し込みにつかったjsonを流し込みした日付を付与して保存しておくことで解決です。その流し込みからの差分をしりたいので、二つのjsonをひかくするだけでOKです。diffsche.pyという専用のプログラムで差分があったスケジュールだけを出してくれるので、そこだけ修正漏れがないかを確認すればOKです。
会場担当がバンド名やジャンルを修正して、それをパンフ担当に伝えてなかったって事がよくあるのですが、そういう伝達漏れの心配はこれでなくなります。


そして、デザイナの作業も変わります。五月雨式に対応するのではなく、デザイナが作業するタイミングで差分データの作成をデータ提供者に要求するのです。確認工数が減るとともに、工数が読みやすくなります。


参考

ソースコードはここに置きました。以上の事を発注者側が全部やるのは無理にしても、こういう管理ができるように、せめて、デザイナには一貫されたフォーマットで矛盾のないデータを作って渡してあげましょうね。
https://bitbucket.org/akira_you/saifes_nagasikomi

 

2018年3月15日木曜日

pyenv環境のpythonににOpenCV3.4.1を入れる

ubuntu/pyenv/python3.6.4の環境で、OpenCV3.4.1をインストールする時のメモです。
OpenCVのインストールについて調べるとsystemのpythonに入れる方法がたくさんでてきて
pyenvで最新のpython試したいぜ!な人向けの解説って少ないですよね。


pythonインストール

pythonのインストール時にはlibpythonを作ってもらうために、enable-sharedオプションが必要です。ということで、以下のようにpythonを再インストールする必要があります。

ONFIGURE_OPTS="--enable-shared" pyenv install 3.6.4

(注:readlineが足りねぇよ。等の警告がでたら素直に追加インストールしましょう。)

OpenCVダウンロード

以下URLからソースコードをダウンロードします。(gitで最新追い駆けたい人はgit cloneで)

https://github.com/opencv/opencv/releases
https://github.com/opencv/opencv_contrib/releases

解答すると、opencv-3.4.1とopencv_contrib-3.4.1 ディレクトリができてるはずです。

依存パッケージインストール

OpenCVのサイトを参考に以下をインストール。

sudo apt install build-essential
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

 

インストール

pyenvのインストールディレクトリは、以下のようになってるはずなので「pyenv which python
」等として調べてください。でとりあえずPROOT環境変数にいれています(書きやすくするため)

export PROOT=~/.pyenv/versions/3.6.4

buildディレクトリを作ってcmakeを走らせます。インストール先はPROOTします(root権限不要)。
注意事項としてはPYTHON3_LIBRARIESを設定する事と、PYTHON2やJAVAを無効にしておくこと。そうしないと、python3のみにインストールとする事で、すべてのライブラリをroot権限なしでインストールできるようになります。 

cd opencv-3.4.1/
mkdir build
cd build



 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.1/modules/ -D BUILD_opencv_python3=ON  -D CMAKE_INSTALL_PREFIX=$PROOT -D PYTHON3_LIBRARIES=$PROOT/lib/libpython3.6m.so -D BUILD_opencv_python2=OFF -D BUILD_JAVA=OFF  ..

注:cmakeをやり直す時はCMakeCache.txtを削除してからcmakeやりおします。
 ここでPython3の項目に「NO」がないことを確認します。



あとはmakeを実行してインストール。

make -j
make install


インストールされてる事の確認は、pythonを起動してimport cv2をすればおk

あと、ROSを使ってる人等は環境変数PYTHONPATHが設定されてたりします。
そっちにpython2.7用のOpenCVが入ってるのでそっちが参照されてしまいます。
unset PYTHONPATHしましょう。





2018年2月7日水曜日

VuforiaのVuMarkでのビット(Element)数について

VurMarkを使おうと思ったけど、会社ではイラレ無い。でも、サンプルのSVGみてXML編集すれば、普通にマーカ作れるじゃん!そこまではいいんだけど、マーカのビット(Element)数を計算するのにイラレがやっぱり必要という落ちで、年休の暇を見ておうちのマシンで検証してみた。
https://library.vuforia.com/articles/Training/VuMark-Design-Guide

結論としてはかなり変わっている。例えば文字列9文字入れるのと10文字入れるので大きくビット数が変わるのでデザインに気を遣うので要注意です。

Stringの場合

 エクセル風にかけば「=7*[文字数] + 7*MAX(MIN(20,INT(( [文字数] -10)/10)*2+4),4)」でエレメント数が得られます。若干9以下と100ちょうどに気持ち悪い処理が入ってる感じがするけどとりあえずmax,minで対応してます。

Binaryの場合

 Stringが7bitなのに対して8bitになっただけかと思いきや、maxの所の引数が違うので注意です。
「 =8*[byte数] +8* MAX(MIN(16,INT((F2-10)/10)*2+4),4)」

byteにしても文字列にしても、20以上では10単位余計なおまけコードが追加されるので20文字ちょうどや!ってなった時は頑張って19文字に押さえるとドット数を減らせます。逆に19文字で白黒の偏りが大きくて気持ち悪いなって時はダミーで1文字足せば白黒の偏りが減ります。

Numericの場合

 規則性が謎でした。
 2^2(=4)以下では必要ビット数+16
2^3(=8)以上では必要ビット数+25
2^19(=1048576)以上では必要ビット数+31
2^50(=1125899906842620)でいったん必要ビット数+30になるけど
2^51で必要ビット数+31に戻ったので・・・・怪しい領域です。

最大値は2^49以下で使うのが無難でしょう

ちなみに以下のように<g id="VuMark-Description">の中に書くのだけれども、IDlengthはダミーで、MaxIDはGUIでの設定値の+1の値をMaxIDに入れるようです。なので編集途中のイラレやSVGにはいってるMaxIDと登録する時のSVGのmaxIDは違いマス。
    <g id="VuMark:test_original"></g>
    <g id="IDtype:numeric"></g>
    <g id="IDlength:1"></g>
    <g id="MaxID:32"></g>
    <g id="Elements:29"></g>

参考まで、サンプルをのsvgをできるだけシンプルにしたmaxID=32のnumericマーカーの例です。
https://gist.github.com/akirayou/32d4e8ae7a666a54f18f7e5d408af475


補足

elementのIDは重要です、ちゃんと桁数まで合わせて連番である必要があります。グループ化されてると1要素としてカウントされるらしいですが・・・細かい所は自信ありません。
 中身が空っぽのグループもないとfailします。(DOMに各要素があることを前提としてアクセスしてるみたい?)
 cleaSpaceだとかボーダーからエレメントまでの隙間など最大辺比5%はあけとけとの事です。
あと、各elementの最小サイズは最大片比で3%です。

2018年1月12日金曜日

アイディアメモ: Hololens等でARマーカを安定に併用したい

従来技術と課題

hololensにVuforiaを組み合わせてARマーカとhololensの空間認識を併用する事自体は行われている。ARマーカが空間認識カメラからみて十分小さい場合、すなわち空間に置かれるような場合は問題はない。しかしモノクロ印刷されたARマーカを手持ちした場合、空間認識のにも影響を与える為にARマーカが手ぶれで移動する際に空間認識にノイズとしてのり画面が揺れる等の弊害がおきる。
ARマーカの例

 Hololensの癖(仮説)

上述の問題は液晶モニタの画面をhololensごしに眺めている場合にはおきない、これは空間認識用のモノクロカメラが赤外光を重視し、可視光による特徴点を空間情報として用いていないため(と推察される)。

対策案

この性質を利用して、スマホ画面に表示されたARマーカを見る事は容易に考えられ、実際に行われている。しかし軽量化のためには印刷されたARマーカを用いる必要がある。

対策案1

https://www.an.shimadzu.co.jp/apl/food/e8o1ci00000003pr.htmにあるように黄色・赤色の着色料は赤〜赤外領域で吸収をもたないものが多い。赤〜赤外に吸収をもたないオレンジ色の着色によってARマーカを印字すれば空間認識側に影響をあたえる特徴点量は大きく減らせると考えられる。具体的には赤102号、黄4号などの着色料を用いる。
この表現では全体に青色が抜けたマーカを用いる事ができる。

対策案2

対策案1とは逆にARマーカの上から赤〜赤外に強い吸収をもつ塗料もしくは光学フィルタをかける。この表現では全体的に青色をかけた色になる。

今後

対策案1はすぐにでも試せるので、試してみる。対策案2はスペクトル一覧みながら身近な物質を探してみる。青色色素でも近赤外に吸光ないのは多いので。


追記:会社の居室ではガタガタふるえまくるほど起きる現象なのに、家の環境だと、たまにひっぱられるぐらいだなぁ。ぐらいにしか再現しない・・・。  かなりニッチな現象らしく、家での再現に時間かかりそう・・。

2017年10月9日月曜日

うちにある機材一覧

一緒に工作する必要がある、一部の人向けメモです

メカ

  • 3Dプリンタ Solidoodle3 ABS(黒/白) 、TPU(白)
  • カッティングマシンCAMEO2 (一応カッティングしてはっつける端材あり)
  • アクリル端材(小さいの)
  • ディスクグラインダ(バッテリー式)
  • 充電インパクトドライバー
  • ジグソー
  • 丸鋸
  • オービタルサンダー
  • 電気ドリル(ひ弱)
  • 卓上ボール盤(精度はいまいいち)
  • オーブントースター(プラ板用)
  • ラミネーター
  • 布端材(生成り、たくさん)
  • M2,3,4,5タップ
  • M3,5 座ぐりドリル
  • 両頭グラインダ
  • ポリシーと溶着工具(クリップシーラー)&ポリシート端材
  • コンプレッサ(エアーで掃除する用の安物)

電気

  • 半田ごて(温調 Pbフリーのみ)2本
  • 半田シュッ太郎
  • 基板作成道具(トナー転写→エッチング環境一式 両面可、スルーホール不可)
  • ACアダプタ 5V中心にたくさん
  • 安定化電源装置(max 30V 5A)
  • 2chオシロ(20MHz)
  • テスター(V/A/F)
  • 半導体在庫(チップ抵抗[秋月扱いほぼ全部]、コンデンサ0.1uF~100uF付近、トランジスタ、オペアンプ,LEDぐらいは常備)

その他

  • 投光器LED30W
  • ハロゲンランプ30W?
  •  LED電飾ケーブル(自動色変化、フルカラーマイコン制御(12~20cmスパンのもの))
  •  作業用カセットコンロ(蝋燭とかとかすの)
  • Tシャツくん
  • レーザープリンタC2450 
  • プロジェクタ(VGA 1024x800)
  • ミシン
  • ロックミシン
  • フラットヘッドスキャナ
  • ZED Camera
  • WindowsMR
  • ZenfoneAR

2017年9月30日土曜日

やっつけ工作でも、これだけは守ろう。その2


前回の続きです、どちらかというメカものの話

接合部の破壊

 以下は、それぞれ両面テープでビニールシートを「人」の形に接着したものと、「二」の形に接着したものを引っ張って剥がしたものです。



いくつか気づきがありますね。「人」より「二」が強い。そう相手がビニールシートの時はそうです。「何故か」を考えるは割と有用です。

人の字を強くするために、両面テープを増やしてみましょう。
意味あるでしょうか?ありません。なぜなら、最初の1mmがはがれて、次の1mmが剥がれるといった風に結局剥離開始点に掛かる応力はどんなに両面テープを増やしても同じだからです。

では、材質が柔らかいビニールでなくて硬い板だったら?
応力は分散するので両面テープを2枚に増やす意味はあります。

剥離を考えるにあたっては「最大応力」が掛かる点で考えるのが大切なのです。

次ぎに「二」の字の接着について、もっと力をかけたいとします。接着面を増やせば接合面の強度は増えるでしょう。しかし「母材(ビニール本体)」側が痛んでしまっていますね。母材強度を超える接着ができている時に、接着で頑張ってもしょうが無いです。母材の強度をあげるか、大きさを大きくして母材にかかる応力を減らしましょう。
「接着強度は母材強度を超えてればそれで十分」それでも壊れる時は全体を見直しましょう。

ビニールの例だと解りやすいですが、木材のように部品の何処が痛んだが原因で、破壊に至ったのかを見抜くのが難しい部品もあります。関係無い所を強化する遠回りは慣れていてもやりがちなミスです。

ホットメルトグルーはプラスチックにくっつかない?

手芸などで便利なホットメルトグルー。フェルトにはよくつきますが、プラスチックにはあまり着かないという認識はみなさん持っているかと思います。この違いは、「材質」の問題ではなく「形状」の問題です。形が入り組んだものにはグルーが噛み込んでしっかり止まるのです。なのでグルーでどうしても止めたい時に、母材表面をヤスリで粗くしたりするのです。

しかし、そんな悠長な事いってられないですよね。プラスチックが固定できるホットメルトグルーはあります。松ヤニ(ロジン)入りホットメルトグルーです。アホみたいにプラスチックにくっつきます。ロボコン畑の人は松ヤニ入りを昔から多用してるようです。
(参考:https://www.monotaro.com/p/1026/5133/)

ネジが緩む

振動がある部分をネジでとめていると緩みますよね。そんなときはバネ座金(スプリングワッシャー)を入れましょう。
これも何故ネジが止まるのかを考えてみましょう。完全剛体の材料を固定する場合をまず考えます。ネジはネジ本体がバネのように伸びる事で、ばね定数kに応じた力がナットの溝に生じて、その力に由来する摩擦力でネジは止まります。
言うけど、ネジってそんなに伸びないですよね?
プラスチックや金属の板をネジで止めて、そこに衝撃が加わるとき、衝撃で一瞬板が縮んで隙間ができます。 その瞬間にネジが自由に回転します(板が微小に回転してるってのもありますが)。バネ座金は、その衝撃で生じる隙間を埋める働きをもっています。相手がもっとグラグラ、グニョグニョした物体だったら??バネ座金の伸び量では足りなくなりますね。柔らかい木材等でバネ座金やってもあまり意味がないのはそのためです。そんな時は、もっと面積の広い(自作)ワッシャーをかまして面積を広くすることでグニョグニョを低減したり、そもそもダブルナットや、ネジ止め材でナットを固定してしまいます。


回転軸の固定について

モータやポテンショメータ軸と、装置に固定された回転軸の固定。「回転軸を同軸に揃えるのは無理」という事を知らないと苦労します。

同軸で揃えるのは無理なので、軸のブレを吸収する必要があります。モーターの出力をネジ等の棒に伝える場合、がっつり固定するのではなくカップリング(軸継手)と呼ばれる部品を使います。ただカップリングは高いので、小出力なら上の写真のようにビニールホースでもOKです。相手が棒ではなく面である場合は、マジックテープ(面ファスナー)もお勧めです。
また、ロータリエンコーダのように軽いモノは、軸をしっかりとめて、ロータリエンコーダ本体をプラ板のような柔らかいもので固定するという手もあります。

 モータ選定の概算・検算にはワットが便利

「力×速度=仕事率(W)」「力×移動量=仕事(J)」
 アクチュエータの仕様書で「力」や「速度」を目安に選ぶと痛い目を見ます、検算として必ず仕事率(W)を確認しましょう。人間とインタラクションする装置は思いの外高出力になります。 特に足は注意です。VR系の研究で力覚に関する錯覚を研究しているのは、人間の出力がでかすぎて装置で押さえ込むのが現実的ではないという側面もあります。

押すか、引くか。初期検討が大事

多くのメカモノの設計では、材料が座屈しないように「押す」のではなく「引く」設計のほうが軽く少ない材料で作れます。「強度の事はとりあえず後回しにして」とやって試作する事は多いと思うのですが、「押す」設計を「引く」設計に直すのは大がかりになるので、楽して作るために力のかかる主要機構だけは先に時間をかけて考えましょう。