備忘録:Random freeze Problem (Ubuntu 16.04 on Intel Joule 570x)

まず,結論: Intel のBay TrailとUbuntu 16.04の組み合わせはc-state bugがあり,ランダムにフリーズする.解決策はgrubに intel_idle.max_cstate=1 を追記する. ことの成り行き: Intel Joule 570x とGPSモジュールで遊んでいた時のこと 「あれ,gpsd動かしてるとフリーズするぞ?しかもシステムが完全に」 被害者:Intel Joule 570x(Ubuntu 16.04) 被害状況:起動後1分から20分程度の間にシステムが完全にフリーズ.フリーズまでの時間はランダム.gpsdを止めるとフリーズしない. 状況から考えてまず浮かび上がった容疑者は4人 容疑者1:gpsd 容疑者2: シリアルポートの設定(stty) 容疑者3: gpsmonなどのgpsdクライアント 容疑者4: FTDIのUSB-Serial変換ドライバ 捜査: まずgpsmonを使っているとフリーズしたので,gpsmonを停止してみるがフリーズする.また,gpsdを起動するとフリーズする傾向があったため,そこのバグを疑う.とりあえずgpsdを止めてみるとフリーズしない.そこで,gpsdを止めた状態でscreenコマンドでシリアル通信内容を確認してみる.すると止まる. シリアルポートの設定かとおもい,sttyでいろいろ設定を変えてみるものの,シリアル通信内容を見ていると止まる.しかも止まるまでの時間はランダム.突然完全にフリーズするので,ソフトウエアな感じがしない.もっとローレベルな部分で止まってる気がする.そこで,FTDIのドライバを疑うも,海外の同じような症状の人が「ドライバビルドして入れ直したけどダメ」と書き込んでいたので,行き止まる. 手がかりとしては,突然がっつり止まることから非常にローレベルな部分,なんならハードウエアの障害くさい. で,いろいろ調べてみて最初に書いたBay TrailアーキテクチャとUbuntu 16.04(kernel 4.2以降)のバグにたどり着く.Intel Joule 570xはBay Trailらしく,もろにこの問題にぶち当たった. Bay TrailはAtomとかCeleron, Pentiumみたいな最近の省電力なチップで採用されているので,Ubuntuを使う人も多い気がします.謎のフリーズに悩まされている人は,c-stateを1にするという対策で解決する可能性があります. 残存課題: しかし,なぜusb-serialを使うと起きるのかは謎のまま.また,これでC-stateがmaxで1になると,たとえばjouleで最低でも0.5A程度,常に消費することになる(c-stateが通常範囲だと,0.1Aとか必要に応じて電力消費を抑えられる). 組み込み&ubuntuでこの問題は結構痛い.     Advertisements

備忘録:Velodyne & Raspberry Pi3

先週はデスマーチだったので,今朝半日はちょっと息抜き研究. Velodyne VLP-16, 32は100BASE-TのLANでイケるので,Raspberry Pi3 で記録だけならできるんじゃないかと. やりたいこと データ記録の問題,手間を解消したい. Velodyneを使って実験することが多いけども,記録用PCが一つだと不具合時にデータが残らなかったり,学生さんはデータを保存し忘れたり,そもそも記録用PCを起動していなかったり,と.なので,補助用に安くデータを自動で保存したい.(まぁ,Velodyneのコストに比べたらPCだろうがRasPiだろうが大して変わらないけども.) 結論 ほぼいけた.ポイントは軽いtcpdumpを使うこと.再生は,Raspberry PiをそのままホストのPCにLAN接続して,tcpreplayする.あたかもVelodyneが繋がっているかのように動く.  tcpdump -i (interface_name) -n -B 524288 -w (filename) -C 2048 (interface_name) から入って来るパケットを名前解決なし,バッファサイズ524288で (filename)というファイルに書き込む.大きくなりすぎると不便なのでとりあえず2048MBごとに分割. これをやっていくつか気付いたこと 1.Ubuntu MateでWiresharkだと,イケそうだけど,たまにロスしたり,データレートが若干低い(おそらくどこかでロスしてる).tcpdumpでも時々ロスが出る. 2.pcapデータをrosで再生すると,rpmやパケットレートの設定で一部欠けたり謎のノイズが発生することがある.一部欠ける問題は,_npackets:=90で突破できたがノイズが消えない.rosのvelodyne_driverのバグか? 3.上記2の問題は,tcpreplayだと発生しない. 1.Raspi 上でtcpdump Raspberry Pi3 (Ubuntu Mate)にtcpdumpを入れてパケットを記録.大体900[p/s]程度. 1分に1回くらいでロスが出る.これを許容できる環境では非常に便利だけれども.なんとか対策したいところ.そこで,tcpdump時に-nオプションをつける. -n   Don’t convert addresses (i.e., host addresses, port numbers, etc.) to names. 名前解決をしないことで処理速度を上げる.これでロスがほとんどなくなる ちなみにIntel NUC (Core i7, 1000BASE-T)はオプションなしでも抜けがない.…

Point Cloud DataをUnreal Engineで

3DCGI的にというか,ゲームエンジン(Unreal Engineなど)は点群データを表示するのには向いていない(ポリゴンメッシュじゃない!) でもLiDARとか最近のものを使っていると点群データを出したいときはよくある. 点群データをゲームエンジンで! 方法としては, 点群データを事前にメッシュ化する(CloudCompareとか使って) ゲームエンジンで用意されているプラグインなどを使う 点群データをゲームエンジンが読める形式にする なんかが考えられる. 1はすでに試してあり,比較的簡単にできるけど,どうしてもメッシュ化するときにモッコリすることが多い. 2はプラグインが出るのを待つ(Unityは最近読めるらしい)か,自作する. ということで3をやってみた.(いろいろ調べてここに行き着いた.基本的にはここを読んで貰えばわかります.) 点群データの読み込み方 まずゲームエンジンが高速に処理できる方式にする.3DCGIで高速に大きなサイズを読むといえば,テクスチャ!ということで,点群データのx,y,zをR,G,Bに置き換える. これが こうなる. 具体的には精度を最大にするために x,y,zのそれぞれのMIN,MAXを求め,一番幅が広い変数を基準にし それぞれを,基準の変数を元に0-255に収める. それを画像の各ピクセルにR = x(0-255), G = y(0-255), B = z(0-255)として書き出す. で作成できる. これからわかるように,各8bit(256階調)の場合,256分割しかできない.例えばLiDARの精度が1cm程度だとすると,全点群データが 2m 四方程度に収まっていれば精度は落ちにくいが,それ以上だとさらなる工夫が必要.参考文献だと16ビットPNGにする,HDRを使うとかあるけれど,とりあえず8bitでやってみる. 精度確保 使った点群は,大学キャンパスの一部(100m四方程度)なので,256ではかなりの精度低下になってしまう.そこで簡単な工夫としては,複数テクスチャに分けるっていう手がある.上記の0-255を0-65536(16bit)で収め,255で割ったときの商と剰余に分けてそれぞれテクスチャとして書き出し,ゲームエンジン上で元に戻せば,いきなり倍精度になる,と. UnrealEngine 4.13での読み込み 事務仕事が舞い込んだので,後日... とりあえず結果だけ.うーんスムーズ!

備忘録 Autoware で LiDARMAN

SIGGRAPH 2016で東大暦本研の味八木先生,暦本先生がLiDARMANという三人称視点を実現するとても興味深い研究を発表されていた. インタラクション2016で発表した,私がやっているRoVという研究とも近い部分があり,せっかくなので,このLiDARMANの”モドキ”を実装してみた(お盆期間). 本家ではROSを使ってリアルタイムマッピングをしているということなので,以前書いたLoam_velodyneを使ってやろうかと思ったが,折角なので名古屋大学(めいだい)が作っているAutowareを使って実現する. まずハードウエアとして居室に転がっていたものをかき集めた. LiDAR: Velodyne VLP-16 PC: Gigabyte BRIX (GB-BXi7-4770R, MEM: 16GB, SSD:1TB) HMD: Oculus DK2 UPS: OpenUPS w/ 4S 5000mAh その他細々したもの 持ち運びも考えて,OpenUPSを使ってNUCをバッテリ駆動できるようにした(待機状態なら1時間以上は動く.フルパワーで処理しても一応落ちない.).一応ポータブル.起動から終了まで,必要なコマンドはテンキー経由でスクリプトを起動できるようにした.モニタは高精細点群もバッチリのRetinaパネル(たまたまあったから). ソフトウエアはまず,Ubuntu14.04のPCにAutowareの最新版をビルド&インストール(最新版はOpenMP対応してる.インストール方法は本家ページ). それから,OculusをUbuntuで使えるようにするためのros_ovr_sdk, oculus_rviz_pluginsをビルド&インストール. 基本的には以前のLoam_velodyneの記事と一緒で,gitでcatekin_ws/srcにダウンロードしてビルド.細かな設定はovrdのページで. 基本それだけ. そこからはAutowareを起動して,VLP-16を使ってndt_mappingを実行すれば,マッピングしながらその様子を見ることができる.実際にその空間で歩くとホントに面白い.世界が点群になった感じ. もう一つ試したのが,ndt_matching. これは予め作っておいたmapと現在のLiDARデータをマッチングすることで位置姿勢を推定できるもので,これを使うと広いマップ内でどこにいるかもわかるし,高精細な点群データを使うことができた. ただ残念なことに現状のAutowareは,マッチングしながらマップを更新するっていうのがすんなりできないっぽい(これは自分でROSノードを作ればできるかもしれない).また,マッピングの安定性や速度,マッチングの安定性や速度など,恐らくパラメータを調整すれば(基本自動運転用なので)もっと良くなるのではないかという点も多かった.Autowareはその辺りの調整もしやすくなっているのでとても便利.また,視点変更などtfを自分で調整したりなど,工夫次第でかなりの可能性を感じることができた. 高精度マップづくりモードはVLP-16にハンドルつけて歩き回ればOK.このセッティング便利. 結果として,お盆の自由研究としては楽しかった.もう少しROSさくさく使えるように勉強しておくと便利かもしれない. 考えてみると,PC,LiDAR以外全部私物投入じゃないか!

備忘録 ROS & Loam_velodyne

VLP-16を使って部屋の点群データを作る.   背景 屋内位置推定がしたい. 名古屋大学オープンソースソフトウエアのAutowareは,Velodyne 32, 64だとNDT mappingが上手くいくが,VLP−16で室内だとダメ(ソース読むと.ある程度の距離からしか見てない.あるいはVelodyneドライバの問題?).もともと自動運転研究用なので,車の入れないような室内でできないのは仕方ない. → [追記] Autoware の ndt_mapping.launchファイルに使う点群の範囲(距離:RANGE),移動距離(SHIFT)を調整すると室内でもできました!すごいぞAutoware!Loam_velodyne はリアルタイム,Autoware は調整しやすく便利,という違いがあるので,そこは適宜. そこで,サクッとROSを使って3D SLAMする.SLAM研究者ではないので,できるだけこの辺りに時間はかけず,成果だけ活用したいので,ありもののパッケージを活用する. 環境 Ubuntu 14.04 準備 ROSのインストール(catkin_wsの設定までしておく) 手順 1.Velodyneドライバの削除 Velodyneドライバが入っている場合,邪魔なので一旦消す(rospack listで確認).VLP−16はまだapt-get でインストールしたVelodyneドライバでは使えない. sudo apt-get remove ros-indigo-velodyne* ちなみにvelodyne 32用のドライバでキャリブファイルを16用で起動しても動く(rviz等で確認できる)が,SLAMなどが正しく実行されない. 2.Velodyneドライバのビルド VLP-16に対応したVelodyneドライバのソースコードをgitからClone catkin_ws/src で git clone https://github.com/ros-drivers/velodyne.git catkin_wsで catkin_make -DCMAKE_BUILD_TYPE=Release 3.loam_velodyneのビルド loam_velodyneはROSサイトからだとオリジナルソースにたどり着かないので,下記ソースをClone(オリジナルとの差分は不明) catkin_ws/src で git clone https://github.com/laboshinl/loam_velodyne.git catkin_wsで catkin_make -DCMAKE_BUILD_TYPE=Release 4.最後にcatkin_ws/devel/setup.bashを実行してrosに登録 source ~/catkin_ws/devel/setup.bash roslaunch できない場合は大体これを忘れてる.…

Real Oriented Virtuality

We demonstrated “RoV: Real oriented virtuality” at Interaction 2016. [Project page] Real oriented virtuality [Conference page]  http://www.interaction-ipsj.org/2016/

Interaction 2016

  We will present “RoV: Real oriented Virtuality…” at Interaction 2016 (Day3, 3A07)

Nagoya COI current result presentation

Our research group presented and demonstrated about the progress of research. [Soooorry, Japanese page only]  http://www.coi.nagoya-u.ac.jp/news/20150828.html