ROS勉強会(ラズパイマウスハッカソン)に参加しました

Pocket
LINEで送る

本日のROS勉強会はラズパイマウスを使ったハッカソンということで、参加してきました。

SLAMの動作確認のためにLinuxのGUI環境(普段はそんなもん使わない。CLIオンリー。)を仮想マシンで作らなければならなかったり、ネットワークがつながらないマシンの修理係などをやったりとちょくちょく中断しましたが、13時から18時まで、とにかくひたすらコードを書きました。書いている途中の写真がない・・・。

モニタがない状態でLANがつながらないと終わりなのでモニタ持参

成果は次の2点でした。

終わったあとは主催の皆様と人形町の肉寿司に行きました。こちらも食うのに夢中で写真がありません。

以上、勉強会帰りの人のブログ的なテイストでお送りいたしました。参加側に回るのは本当に久しぶりです。主催者の皆様ありがとうございました!

アフィリエイトで恐縮ですが、持参したモニタはこれ↓です。

寝る。

Pocket
LINEで送る

CPUの個数でcatkin_makeが通ったり通らなかったり

Pocket
LINEで送る

表題の通り少しハマりました。ROSについては本を書いたものの、基礎的な内容+Pythonなので、C++のコードのビルドについてはほとんど勉強しておらず、良く分かってないのが良くわかりました。同じようにハマる人がこの記事を見つけてくれたらと。また、この症状の回避方法について良く知られているのならば教えていただければと。

症状

  • 1. .msgファイルと、それを使うC++のコードを含むパッケージのcatkin_makeが、.msgファイルの処理の前にノードのコードのコンパイルを始めて一度コケるが、2度目で通る。

これはたぶん回避方法があるはずでちゃんと調べろという話ですが、面白いのは続きです。

  • 2. Travis CIだと2回catkin_makeしても通らない。

これで「???」になりました。ちなみに1については、自分のデスクトップ機でもラズパイでも2回で通ります。

ちなみにエラーはこんな感じです。Buttons.hとLeds.hが、.msgファイルから作られるヘッダファイルで、これがないとC++のコードのところでヘッダファイルが無いと叱られます。

原因

自分のPCやラズパイでは1回目のcatkin_makeはエラーを出すものの.msgの処理を完了できて、一方Travis CIの場合は完了できないということは、非同期処理のズレだろうというのがまず思いつきました。そして、Travis CIのエラーに

Invoking "make -j2 -l2" failed

とあったので、たぶんズレはコア数の違いで起こるんだろうと思いました。(makeのjオプションは、何並列で処理をするかを指定するオプションです。)

ということで、手元で

$ catkin_make -j2 

を繰り返したら、何回catkin_makeしても失敗するという、Travis CIで起きたのと同じ現象が起こりました。ちなみにPCのCPUのコア数は8、ラズパイでも4だったので、Travis CIの方が少ないということになります。

解決(超小手先)

ということで、Travis CIでcatkin_makeするシェルスクリプトの行を

catkin_make -j8 || catkin_make -j8 #CPU2個だけど8並列頑張ってね。しかも1回目コケたらもう一回やってね。

というように変更したらテストにパスしました。

お断りしておきますが、小手先です。何かすればコンパイルの順番を制御できるはずなのですが・・・。

完全解決

・・・と書いたら教えていただきました。

(もっと短い書き方がありそうですが)とりあえずベタにCMakeLists.txtに以下のように書いたら一回のcatkin_make(オプションなし)で通りました。

add_dependencies(leds ${TARGET_NAME} ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(buttons ${TARGET_NAME} ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(lightsensors ${TARGET_NAME} ${PROJECT_NAME}_generate_messages_cpp)

ありがとうございました!!!

Pocket
LINEで送る

最近のラズパイマウスまわりの情報

Pocket
LINEで送る

最近、ラズパイマウス本の宣伝をしてませんが、ラズパイマウスの開発やラズパイマウス上で動くソフトウェアはどんどん増えてますので、情報を並べておきます。

本の情報はGitHubに掲載しています。

質問お待ちしております!!

ゲームパッドとラズパイマウスをつなぐROSパッケージ

弊研究室の岡崎氏が管理しています。

Hector SLAM + ナビゲーションのパッケージ

同じく岡崎氏作のHector SLAMしながらナビゲーションするパッケージ。千葉工大のOBの前川氏のパッケージからあまりいじっていないそうです。

岡崎さんは現在、移動ロボットでは標準的な構成となるgmappingとナビゲーションメタパッケージをラズパイマウスに移植中です。

イベント等

終わったものや募集が定員に達したものばかり挙げますが・・・。これからもあるかもしれません。ありがとうございます。

オプション(ハードウェア)

色々開発中のようです。どれがもう売っててどれがまだなのかよくわからんのでアールティさんのページでご確認を。

↓こちらはモータの実際の回転量を計測できる基盤(コネクタ)です。

迷路走行用ROSパッケージ

こんな感じで走ります。分岐点でどこを曲がるかは、その時のセンサの値次第です。

学習モジュール

ロボット学会のネタなのでまだ詳細を発表できませんが、今こんなものを作っています。

こういう制御のプログラムでロボットを動かして・・・

ロボットが別の学習プログラムで動きを真似をします。真似してる動作は簡単ですが、学習プログラムもアホみたいに簡単です。

シミュレータ

忘れてました。こちらも色々開発が進んでいるようです。実機と同じようにデバイスファイル(に見せかけたダミーファイル)でセンサ、アクチュエータを通信できるように改造してほしいという依頼を出しています。

Pocket
LINEで送る

「Raspberry Piで学ぶ ROSロボット入門」を安価に楽しむ方法

Pocket
LINEで送る

先月30日に発売された「Raspberry Piで学ぶ ROSロボット入門」ですが、やっぱりロボットが高くて手が出しにくいという反応をいただいておりますので、なくても楽しめるように、いくつかロボットなしのプランを提示します。ついでに本書の内容もどんなものか匂わせます。

もちろん、実機があるのがベストです。

Travis CIとの格闘を楽しむ

本書はロボットを動かすための本ですが、テストがたくさん盛り込んであり、Travis CIも裏の操作対象のような位置付けになっています。また、ロボットがなくても、テストが通るかどうかで、コードが正しいかどうかは、完全ではありませんがだいたい分かります。ということで、勉強だけならTravis CIでテストを通すことを目標にしてコードを書くことができます。

また、講義では、ロボットを1人1台ではなく、教室に数台だけにしておき、テストを通した人から実機を試すという運用も考えられます。これはテストを扱っているからこそ可能になることです。また、私も職業柄、当然講義を持っておりますので、ちゃんと講義や実習が成立するように考えて書いておりますです。

実機を作る

これはかえってコストがかかるかもしれませんが、少しずつ部品を揃えて試していくこともできます。ハードウェアの使用はこちらに公開されていますので、挑戦してみるのも良いかもしれません。

シミュレータと接続

最後、ラズパイマウスのシミュレータで試すという方法もあります。ただ、本書のコードとシミュレータのつなぎこみには少し手間がかかります。少しだけ付録で説明しましたが、ちょっと本書を読み進めないと難しいかと。

ということで、シミュレータの作者にどんどんissueを投げていけば、そのうち答えが出てくるものと予想されます(ひどい)。

また、シミュレータは、入出力口を全てROSのインタフェースで持っています。が、実機はデバイスファイルがインタフェースなので、そういう点ではシミュレータは不完全です。ここをデバイスファイル(もちろん普通のファイルでも可)でブリッジできればシミュレータとして完全なのですが・・・。この点は気になっているところなので、こちらでも働きかけを続けます。

おわりに

3つ挙げたうちの後ろの2つは大変ですが、最初の項目のように、本書は一つのロボットを多人数でシェアしても大丈夫な構成になっています。また、ロボットは持っている人のところで動かして、あとはテスト環境でソフトウェアを書くということもできるようになっています。

ということで、ぜひ一読いただければと。

Pocket
LINEで送る

「Raspberry Piで学ぶ ROSロボット入門」という本を書きました

Pocket
LINEで送る

ロボットにラズパイを載っけてROSで動かすという流行りもの全部乗せの節操のない本を書きました。3月30日に出ます。以前の日経Linuxの連載をまとめて、原型を留めないほどROS化したものです。本日校了ということで、9月から12月までは執筆、1月からは書き直しや校正と、充実した地獄が終わりました。

 

 

まさか自分がROSの本を書くとは思っていませんでした。私のROSに関するコントリビューションは、たまにROS Wikiを翻訳するくらいです。あんまりROSのコミュニティーに仁義が切れてないのは、別のコミュニティーをやってる身としては褒められたものではないという認識なのですが、日経Linuxの内容を強化する上でROSが避けられず、自分も真正面から扱うことにした次第です。

本の中ではこんなことをしています。

内容は大学の講義や実習を想定しています。4月からの講義にはギリギリですが、ぜひ本を手にとっていただければと。

Pocket
LINEで送る

【やっつけ】CGIHTTPServer.test()でウェブサーバを立ち上げるROSのノードを作る

Pocket
LINEで送る

もっと簡単な方法があれば教えてくださーい

やりたいこと

roslaunchでウェブサーバを立ち上げたい。roslaunchを終わらせたらウェブサーバを落としたい。

やり方

次のようなスクリプトwebserver.pyを書いて、scriptsディレクトリに置く。

#!/usr/bin/env python
import rospy, os
import CGIHTTPServer

def kill():
    os.system("kill -KILL " + str(os.getpid()))

os.chdir(os.path.dirname(__file__))
rospy.init_node("webserver")
rospy.on_shutdown(kill)
CGIHTTPServer.test()

launchファイルにノードを次のように書く。

<launch>
  <node pkg="hoge_webserver" name="webserver" type="webserver.py" required="true" args="8080" />
</launch>

解説

スクリプト中のkillは、自分自身のプロセスをぶっ殺す関数で、CGIHTTPServer.test()もろともシステムから消し去ります。これがないと、CGIHTTPServer.test()のスレッド(?)が死にません。

また、roslaunchからこのノードを立ち上げると、システムのディレクトリがドキュメントルートになるので、8行目でディレクトリをscriptsに変更しています。

また、roslaunchからwebserver.pyを立ち上げると引数に余計なものが入るので、ローンチファイルでwebserver.pyに指定する引数をargs=”8080″と明示的に指定しています。

以上。

Pocket
LINEで送る

価値反復のROSパッケージ作った

Pocket
LINEで送る

いつも研究で使っている価値反復のコードをROS化しました。オフライン計算をするためのものなんですが、わざわざROSにしました。なんか使ってもらえそうというアホな理由と、移動ロボットの経路計画くらいならそろそろ半リアルタイム(ロボットが動く前に数秒で計算するとかいう用途)に使えそうだという割と本気の理由から。

使い方はREADMEに書きましたが、日本語でも書いておきます。ウリはマルチスレッドで一気に計算できることです。これを分散処理にまで持っていく(そしてGPU対応にする)のが当面の目標。何千もCPUがあれば並列処理が簡単な分、普通のリアルタイムな探索より速くなったりして(未確認)。

まず、value_iterationというノードを立ち上げます。これがソルバです。

$ rosrun simple_value_iteration_ros value_iteration 

で立ち上がります。

試しに下のような単純なタイルワールドでstate 2に前後左右に移動して到達するという問題を解いてみましょう。

|-----------------------|
|       |       |       |
|state 0|state 1|state 2|
|       |       |       |
|-----------------------|
|       |       |       |
|state 3|state 4|state 5|
|       |       |       |
|-------|-------|-------|
|       |       |       |
|state 6|state 7|state 8|
|       |       |       |
|-------|-------|-------|

解くときは、value_iterationノードに状態数がいくつでどんな行動があるか、状態遷移はどんなのがあるか、終端状態はどれかを書いたファイルを食わせて計算させます。そのファイルがこれ:

なんとなく分かるような気もするけど、分からんような気もする。ちなみに確率的な状態遷移も扱えます。example_state_trans_probが例です。

パッケージには、このファイルをvalue_iterationに食わせて結果を表示するサンプルコードがあります。

simple_value_iteration_ros/scripts/sample.py

です。実行してみます。すぐ収束してしまいますが、価値関数が収束して適切な方策が得られます。

$ rosrun simple_value_iteration_ros sample.py 
### sweep 1 ###
values:
    0 70368744177664        1 1000      2 0 
    3 70368744177664        4 2000      5 1000  
    6 70368744177664        7 3000      8 2000  

policy:
    0 null      1 right     2 null  
    3 null      4 up        5 up    
    6 null      7 up        8 up    

### sweep 2 ###
values:
    0 2000      1 1000      2 0 
    3 3000      4 2000      5 1000  
    6 4000      7 3000      8 2000  

policy:
    0 right     1 right     2 null  
    3 up        4 up        5 up    
    6 up        7 up        8 up  

・・・もっと詳しい説明が必要なんだけど・・・

寝る。

Pocket
LINEで送る

Ubuntu 14.04 server用のROS一撃インストールシェルスクリプト

Pocket
LINEで送る

こういうものは世にたくさんあると思いますが、サーバ版のものはないかもしれません。ちゃんとケアします。

ryuichiueda/ros_setup_scripts_Ubuntu14.04_server

Pocket
LINEで送る