「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で送る