2019年7月18日木曜日

[メモ] ROS2をMacで動かすときに注意すること

こんにちは。

前回WindowsでROS2試して色々とめんどくさかったので、Macで試してみました。
思ったより色々と地雷を踏んだ末にいちおーサンプルは動きました。(2019.7.18 に動作確認実施)

色々とググって近藤さんのブログ等参考にしたんですが、一番の注意点としては、最新のROS2のバイナリ(https://github.com/ros2/ros2/releases)を使う場合は関連するツールのバージョンがあってないと起動しなかったです。

具体的には以下のようなエラーが大量に出てLibraryがloadできない、みたいな感じだったんですが、エラーにでてくる/usr/local/opt/poco/lib/をみてみたらlibPocoFoundation.62.dylibがあったので、そっちにシンボリックリンクを貼ったら(他のrosbag関連のエラーはちょっとでてたけど無視して)talkerが想定どおり動いてlistener側でTopicが表示されました。(他にもtinyxml2の問題とか踏んだ気もするけど気のせいかもなので省略。)


$ ros2 run demo_nodes_cpp talker

Failed to load entry point 'test': dlopen(/Users/XXXX/ros/dashing/lib/python3.7/site-packages/rclpy/_rclpy.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/poco/lib/libPocoFoundation.60.dylib
  Referenced from: /Users/XXXX/ros/dashing/lib/librosidl_typesupport_c.dylib
  Reason: image not found



以前Ubuntuで試した時は数十分でサンプルは動いた気がするのでもし変なとこではまりたくなかったらUbuntuでやるのが無難なのかなーとは思いました。
ただMacで動くには動くことがわかったので、Ubuntu準備するのがめんどくさい!て場合はバージョン等に気をつけて使ってみるのはありかもしれません。(エラーちゃんと読めば何となく問題もわかるし)


とりあえず動いてめでたしめでたし。

[追記 2019.7.19]
console_bridgeがなくてエラーが表示されていたのでconsole_bridgeを入れてみたら実行時のエラーメッセージがすべて消えた。console_bridge入れる手順見逃してたかな。。

$ brew install console_bridge


次はざっとこの辺みてみよう。
https://index.ros.org/doc/ros2/Tutorials/







2019年6月27日木曜日

[メモ] ROS2のインストール(Windows編)

こんにちは。

前回チュートリアル一通りやろう!と思ったけどそもそもまだ環境設定をしてなかったので、Windowsの設定を行ってみる。

https://index.ros.org/doc/ros2/Installation/Dashing/Windows-Install-Binary/

どうせなら最新を、ということでDashingを選択。

事前準備

Install Chocolatey

chocolateyってのを入れる必要があるらしい。

ここのInstalling Chocolateyを参考にインストールする。

Install OpenSSL

公式でのバージョンの指定が" Win64 OpenSSL v1.0.2."になっていたので、新しいバージョンもあったけど古いのを入れた。

環境変数のPathに”C:\OpenSSL-Win64\bin\”を追加するのを忘れない。

Python、Visual Studio のインストールはスキップ。(インストール済みだったので)

Install OpenCV

サンプルでOpenCV使うことがあるから入れとく模様。
https://github.com/ros2/ros2/releases/download/opencv-archives/opencv-3.4.6-vc16.VS2019.zip

Pathの追加しとくと捗る。C:\opencv\x64\vc16\bin

Install Dependencies

色々必要なものを入れる。ダウンロードしてきてから、以下のコマンドを実行。
$  choco install -y -s <PATH\TO\DOWNLOADS\> asio eigen tinyxml-usestl tinyxml2 log4cxx
<PATH\TO\DOWNLOADS¥>は実際にasioとかダウンロードしたところを指定すればOK。

途中で環境変数書き換わるメッセージがでるが、以下のコマンド打てば開きなおさなくてもいいよと表示されてた。便利~
$ refreshenv

さらにPython関係の設定。
$ python -m pip install -U catkin_pkg empy lark-parser lxml numpy opencv-python pyparsing pyyaml setuptools

RQt関係の設定もして、事前準備完了。
$ python -m pip install -U pydot PyQt5

ROS2 Setup & サンプルの実行


Downloading ROS2

事前準備意外と長かった、、こっからはすんなりいくはず。

ここからwindows用の最新のzipファイルをダウンロードする。とりあえずdebug版にしたら1GBくらいあった。。展開先はC:\dev\ros2を想定してるっぽいのでそこに展開する。

Set up the ROS2 environment

以下のコマンドを実行する。

$ call C:\dev\ros2\local_setup.bat

ROS1でubuntuで実行するときのsetup.bash的なやつかと思われる。
Warningが出るけど、”Install additional DDS implementations (optional)¶”を無視して出ているだけなので、とりあえず問題ない。


Try some Example



おなじみのtalker/listenerのサンプル試したら地味にはまってしまった。。

$ ros2 run demo_nodes_cpp talker
$ ros2 run demo_nodes_py listener

実行しようとすると
C:\>ros2 run demo_nodes_cpp talker
failed to create process.

となってさっぱり理由がわからなかったのでググったら似たような地雷を踏んだ人を発見。

ros2_script.pyの中のPythonのPathが実際にインストールされてるのと違ったので、ros2-script.pyの一行目を書き換えたらいちおーうまく動いた。ちなみにrelease版だとPathが違う模様、うーむ。。みんな踏んでない人はrelease版使ってるのかなあ。

ちなみに以下のエラーが出てるけど、何かミスったかなぁ。Windowsやっぱり使おうて思ったらちゃんと調べてみる。
C:\>ros2 run demo_nodes_cpp talker
Failed to load entry point 'test': No module named 'yaml'
Failed to load entry point 'launch': No module named 'yaml'
Failed to load entry point 'info': No module named 'rclpy._rclpy'


感想

思ったよりはサンプル動かすまで手順少なかったけど、それでもやっぱりちょっとめんどくさかった。わざわざWindows使う理由もないからMacかUbuntuでやろうかな。。


2019年6月26日水曜日

そろそろROS2始めたくなってきた

こんにちは。

今日昼間にROS2本の予約が開始されたのを知った。
https://www.amazon.co.jp/gp/bestsellers/books/500920/ref=zg_b_bs_500920_1

近藤さんの本、早く読みたい、楽しみ~。

だいぶ前にROS2について調べたときにチュートリアルとかないのかーと思って放置してて、久々に見てみたらチュートリアルがあったので、とりあえず一通りこれから見ていこうと思います。

https://index.ros.org/doc/ros2/Tutorials/

あえてUbuntuじゃなくてWindowsかMacでやってみよう。

2019年1月17日木曜日

[備忘録] VirtualboxでGazebo使ったら落ちる時にチェックすること

最近作業メモが多いですが、意外なとこで詰まったのでメモ。

なんとなく家のMacでVirtualbox使ってGazeboを起動したら、強制終了してたので調べたら解決方法発見。

http://syoamakase.hatenablog.com/entry/2016/04/25/163857

 virtualboxの高速化のため3Dアクセラレーションをオンにしていると OpenGL系統でエラーを吐いて強制終了してしまいます。

まさにこれが原因でした。Google先生ありがとう。

2019年1月10日木曜日

[お散歩] LOVOT見てきた [浜町]

そういえば今週LOVOTの体験会に行ってきた。

新しい産業が作られる、と発表会で言ってたのと、実際に見てみると印象が変わる、と聞いたのが気になって、仕事中に散歩がてら浜町へ向かった。
平日の昼間だったからかほぼ貸切でじっくりみれてよかったです。

重さ・固さ


実際に触ってみて思ったよりも固いな、というのと高い高いをしたときに重くて腕が疲れるなー、てのが気になった。

人間の赤ちゃんで、重さが6kgくらいでもここまで重くは感じない気がしたので、もしかしたら硬さや形が抱っこしやすさに大事なのかもしれんなーと気付いたのは実際に触ってみてよかった点。

見た目など


目は10億通りパターンが試せる、てのと声もこだわりのつくり方、ということだったが正直あんまりピンとこなかった。(目玉がプルプル震えてるのと、まぶたが上下書いてあるのは生きてるっぽくは見えた。)寝てる状態で鼻のボタンポチー、で起きるのがちょっと面白かった。体温は熱いは熱いけど思ってたほどではなかった。(夏場は抱っこきついかも)

動き


名前を読んだら近づいてきたり、歩いたらちゃんと付いてきてくれた。
だっこをせがむ時に車輪をたたむのはかっこよかった。

結論


自分のお小遣いではとても買えないので予約はしなかったが、ロボットの市場を作る、という意味ではぜひ頑張ってほしいです。(しかし1年でロボットに100万払う人ってどういう人なんだろう、周りにあまりいなそうでちょっと会ってみたい。)

展示のポスターで犬型よりも早い、と割とaibo意識してるのかなー、てのを感じたので、とりあえずaiboの2万台は超えるといいなー、と思いました。

写真見てたら急にコロ助が欲しくなってきた。。ユカイ工学さんあたりが作ってくれないかなぁ


こげ茶、かな?
薄茶色、かな?こっちのが可愛い気がする



[備忘録] rostopicをpubするときにtopic名入れるだけで補完が効いた

こんにちは。

今日同僚から聞いてえっ、知らなかった。。というのがあったのでメモ。

rostopic をコンソールからpublishするときに

$ rostopic pub -1 トピック名 型 値

と打ちますが、実はトピック名さえ入れてtabを打てば型、値(サンプルで"data: 0.0"みたいなのまで入ってた)ることを初めて知りました。教えてくれた同僚に感謝。


自分が新入社員の頃に、めちゃくちゃできる同期がタブで色々補完できることを知らずにへぇー、そういうこともあるのかーと思ったんですが、まさか10年後に自分が似たような経験をするとはびっくりしました。

2018年12月31日月曜日

今年の振り返り

2018年も残すところあと2時間くらいなので、1年を振り返ってみる。

仕事

転職

夏に転職した。
入社以来9年ちょい同じ会社にいたので、数年前からそろそろ飽きてきたなー、と思うことが多かったので少しずつ動いてはいたのですが、いいタイミングで面白そうな会社が見つかったので即決した。

勤務時間が短くなったり諸々待遇が改善されてストレスが大幅に減った。
わりとデスマになると体重が大幅に変動することがここ数年続いていたが、ピタッと止まった。(むしろ地味に増えててつらい。)
仕事自体はやらなきゃいけないことが多く大変ではあるが、新しいことを色々と学ぶことがあってとても楽しい。

製品化

転職前の仕事については、製品の発売を1年半くらいで実現できて、わりと自分の中ではやりきった感があった。自分がもっとやってみたいと思ったことが組織にとって優先度がわりと低かったのもあって、自然と次に意識が移っていった気がする。

展示会

転職してすぐデモを行う部隊のヘルプに入った。チームのメンバーがスペシャリストが揃っていて正直あまり貢献できなかった気がするが、とても働きやすかった。今まで自分が休んだ時に自分の担当部分が進むことなどまずなかったが、気づいたらガンガン実装が進んでて正直焦った。展示会自体は大成功で、イベント自体も文化祭みたいな感じで楽しすぎた。

子育て

転職して即子供が生まれた。色々と迷惑をかけてしまったが、3人目ということもあり休み等は最小限で済んだ気がする。何人目でもすごくかわいい。

来年の目標

痩せる(4kgくらい多い気がする)

今年1年ここ数年で公私ともに一番充実してた気がする。
来年も頑張ろう。

2017年11月21日火曜日

[メモ] ROSでbagファイルから動画を保存する方法

何回もググってる気がするのでメモ。

http://wiki.ros.org/image_view

1. rosbag playで保存したtopicを再生する。

2. image_viewで以下のコマンドを実行する。

$ rosrun image_view video_recorder image:=/hoge/camera/image_raw _fps:=10 _filename:=201711XX.avi

いっつもfpsを指定するときに_を付けるのをなんだっけなー、と悩んで5分くらい無駄にしてたので、今度からはこのメモをチェックしよう。

2017年10月4日水曜日

VRな講演会

こんにちは。

先日VRの講演会(東大の廣瀬先生)を聞いてきました。
わりと面白くて自分がやってる仕事のヒントになることが多々ありました。

現在のVRは第二世代で、第一世代(1990年くらい)とは質的に違いがあります、と。
第一世代の時はHMDだけぽーん、とあって、コンテンツを作る道具やら、ネットやらなかったのでダメだった、とのこと。

質疑応答で先生にとっての究極のVRは?と聞かれて「ゴジラ」ていってて面白かった。
シン・ゴジラとかで現実的な風景の中でゴジラだけが非現実的なものがあるけどそれでもリアルっぽいと、そういうのがやれるといいなとのことだった。

ここでVRの黒歴史を連載してるっぽいので時間あるときに見てみよう。
https://mine.place/user/8833697a-087d-4ddc-9c4e-c051941798dd

2017年9月23日土曜日

Online ROS使ってみた

こんにちは。

TwitterみてたらOnline ROSなるものがあるのを知ったので、とりあえず触ってみました。
http://www.onlineros.com/index.html

サンプル


サンプルは8個あって主にC++でした。(Pythonは2個)
基本どのsampleもversionはkineticと書いてありました。

Hello Worldからpublish/subscribe, timerの使い方、actionlibなど。
alpha版だからこれから増えていくかもですね。

使い方




サンプルを選ぶとこんな画面が表示されます。

左側でソースコードをいじって、左下のCompile & Runボタンを実行すると、
しばらくすると右側のコンソールに文字が表示されて、実行されました。
(ソースコードいじってからCompile & Runしたらちゃんと修正も反映されました。)


右側の画面で”Terminal”を選ぶとROS_INFOで表示してるログ等が表示されてて、
"Topics"を選ぶとpublishされてるTopicの情報を見ることができました。

上下に表示スペースがあるので、上でTerminal,下でTopicsみたいなかんじで見たい情報が見れて便利。(複数のTopicが見たいとかなると、、今後増えたりするのかな。)

Compile & Run ボタンの下に "Share link" というのがあったので、ためしにソースコード修正して、別のブラウザでリンクを開いたら修正した内容が反映されてた。
これでROS友達と自分のソースコード共有できるね。(そんな友達いないけど。。)

感想


今回MacのChromeで試してみたのですが、やっぱりUbuntuで環境作らずに手軽に試せるのは割と便利だなー、と思いました。出先とかでちょっと試してみたい時に重宝するかも。

alpha版なのでこれからの進化に期待してます。

2017年9月16日土曜日

[メモ] ROSのnodeletでのgdbの使い方

こんにちは。

ROSのnodeletを使ってる時にSegmentation Faultで落ちて、はて、どうやって解析すればいいんだろうと少し悩んだのでそのときのメモ。考えてみたらふつーの手順でした。

1. coreファイル作成元の確認

そもそもnodeletで落ちる時って何を指定すればいいんだろう、と思ったんですが、ふつーにfileコマンドで調べればよかったです。(下のfrom '/usr/XXX/' みたいな部分)

2. gdbでbacktraceの確認

1.でファイルの名前がわかったら、以下のコマンドを実行すればOK

$ gdb /usr/hoge/nodelet core.12345

みたいな感じ。めでたしめでたし

2017年2月9日木曜日

[備忘録] patchelfの使い方

こんにちは。

普段使わないものはなるべくメモっとこうと、patchelfについて調べた&使ったことのメモ。

ここの説明参照。

http://manpages.ubuntu.com/manpages/xenial/man1/patchelf.1.html

--set-interpreter INTERPRETER
         Change  the  dynamic  loader  ("ELF  interpreter") of executable
         given to INTERPRETER.

ということで、

$ patchelf --set-interpreter XXXX で dynamic loaderをXXXXで指定したものに切り替えれた。切り替えたら.elfファイルが実行できたりした。

滅多に使わないだろうけどたまに便利だなー。


2017年1月27日金曜日

[備忘録][ROS] video-stream_opencvを使って、mp4ファイルを読んでpublishしてみた(kinetic)

こんにちは


携帯で撮った動画(mp4)をROSでカメラのデータ読み込む代わりに
どうやって使うんだろう、と調べてやってみたのでメモ。


参考にしたのは以下。
http://wiki.ros.org/video_stream_opencv


手順


とりあえずkinetic対応してなかったので、ソースコードをもってきて、ビルド。

$ git clone https://github.com/ros-drivers/video_stream_opencv.git
$ cd ../catkin_ws
$ catkin_make


よっし、動かすかーと使ってみたところ、なぜかファイルのopenに失敗、とでて実行できず。。
(追記:後で調べたらlaunchファイルのパスの指定がよくわからない感じで絶対パスで指定したらあうまくいきました。)

ファイルを置く場所かなーとか色々調べてみたんですが、結局原因がわからなかったので、
深追いをしないで諦めようとしたところ、scripts以下にtest_video_resource.pyを発見。

test_video_resource.pyは指定したファイルを再生して、OpenCVのcv2.imshowで動画を表示していたので、以下のように修正。

#cv2.imshow("Stream; " + resource_name, frame)
pub.publish(bridge.cv2_to_imgmsg(frame), "bgr8")


そしてこのままだと再生スピードが速すぎたので、while文の中でrate.sleep()を使って表示速度を修正。

rate = rospy.Rate(54)

while rval:
  (中略)
  rate.sleep()


これでやりたいことができました。わーい。
なぜか元のやつは使えなかったけど、やりたいことはできたのでよしとする。


全然関係ないけど最近更新もしてなくて、自分用のメモだしこのままフェードアウトかなーって思ってたら、外国語のブログでusb-camの使い方参考にしてるのを見つけてしまってうわ、個人用のメモが誰かの役に立ったかも!とちょっとうれしかったので自分がやったことはメモ残しとこうと思いました。よかったよかった。

【追記】

使えなかった理由を少しみてみたらちゃんと動いたので動かし方追加。

launchディレクトリ内にあるvideo_file.launchファイルの、video_stream_providerというパラメータのvalueを絶対パスに書き換えたら再生画面が立ち上がりました。

ここで指定したファイル名をsrcディレクトリの中のvideo_stream.cpp内でopenしていて、最初はそこでパスが間違っててopenが失敗してました。

ということで、kineticでもちゃんとvideo_stream_opencvは使えそうです。(publish部分はテスト用ファイルで事足りたので見てませんが)


2016年12月28日水曜日

【Book】 Programming Robots with ROS Chapter13: ROSのStateMachinesについて 続き

こんにちは。

ROSのstate machineの使い方について、続きも読んだのでまとめておく。

A Slightly More Relevant Example

前回の例が簡単すぎるので、実際に使いそうなサンプルの紹介が書いてあった。


- Classは2つ(Drive とTurn)

Driveクラスはロボットが指定した距離移動する(単位:m)。
サンプルではexecute()実行で数字が表示されるだけ。

Turnクラスはロボットが指定した角度回転する(単位:degree)。
サンプルではexecute()実行で数字が表示されるだけ。


- main文の中で3つのwith statementを作成

1. triangle

StateMachine.addを以下の5つの動作について記述。

Drive(1) -> Turn(120) -> Drive(1) -> Turn(120) -> Drive(1)

1m前進->120度回転 -> 1m前進 -> 120度回転 -> 1m前進 を行う。(正三角形が書かれそうですね。)


2. square

StateMachine.addを以下の7つの動作について追加。

Drive(1) -> Turn(90) ->Drive(1) -> Turn(90) ->Drive(1) -> Turn(90) ->Drive(1)

1同様、正方形が書かれそうですね。

3. shapes

StateMachine.add で1,2で作成した triangle, squareを追加し、shapes.execute()を実行。

triangle->squareの順で実行されるので、三角形->四角が書かれる。


1,2 が3のsub stateみたいな感じ。今度使ってみよう。

まとめ

以上、smachを使って階層を持つstate machineの設計の仕方でした。

13章に今回のサンプルの修正版が書いてあったので、次回気が向いたらまとめる。


2016年12月26日月曜日

【Book】 Programming Robots with ROS Chapter13: ROSのStateMachinesについて

こんにちは。

久々にProgramming Robots with ROSの13章「On Patrol」を読んでいたら、ROSでのState Machineの実装が載ってたので、概要をメモ。

State Machines


一般的なステートマシンの状態遷移図がFigure13-1に書いてありました。
状態が変わるイベントが発生したら次の状態に遷移しますよ、と。

State Machines in ROS


ROSでステートマシンを実装するには、smachというパッケージが使えます。

smach使う際には1点注意点があります。
Pythonで書かれているので、パフォーマンスが要求されるケースではあまり使わないほうがいいかもとのこと。

Defining State Machines with smach


2つのステート(OneとTwo)で、各ステートに遷移するタイミングでone かtwoを表示し、もう一方のほうのステートに遷移する、というサンプルプログラムの説明がありました。

サンプルはこんなかんじ。


#!/usr/bin/env python

import rospy
from smach import State, StateMachine

from time import sleep

class One(State):
    def __init__(self):
        State.__init__(self, outcomes=['success'])
       
    def execute(self, userdata):
        print 'one'
        sleep(1)
        return 'success'

class Two(State):
    def __init__(self):
        State.__init__(self, outcomes=['success'])
    def execute(self, userdata):
        print 'two'
        sleep(1)
        return 'success'

if __name__ == '__main__':
    sm = StateMachine(outcomes=['success'])
    with sm:
        StateMachine.add('ONE', One(), transitions={'success':'TWO'})
        StateMachine.add('TWO', Two(), transitions={'success':'ONE'})

    sm.execute()





注意点は以下。

- State, StateMachineをimportする。
 from smach import State, StateMachine

- package.xmlを修正して、smachが使えるようにする。

- それぞれのStateで、親クラスのConstructorを呼ぶ。

- それぞれのStateでexecute(self, userdata) functionを実装する。

- main文で、with statementの中で各stateをaddし、executeを実行する。

まとめ


とりあえずROSでstateの使い方をまとめてみた。わりと楽ですね。

かいてみたもののわかりにくいから後でサンプルも貼る。->貼った。



2016年12月8日木曜日

【備忘録】 ROS Kinetic でusb-camのインストール方法&使い方

こんにちは。

3日坊主じゃないと思ってたらだいぶ更新が滞ってました。。

今日はROS Kineticでusb-camを使おうとしたら、apt-getで入れれなかったので(2016/12/8 現在)ソースコードから入れた時のメモになります。

以下を参考にしました。
https://github.com/bosch-ros-pkg/usb_cam/issues/53


やったこと

小倉さんの本の17章のusbカメラのROSドライバのインストールで、
以下を実行したところ、https://github.com/bosch-ros-pkg/usb_cam/issues/53の眼鏡の好青年がいうとおり、エラーがでました。

$ sudo  apt-get install ros-kinetic-usb-cam
...
E: Unable to locate package ros-kinetic-usb-cam

うひょー、まじかとググったら、眼鏡の好青年に対して以下の方法で対応してね、とコメントがあった。

$ cd ~/catkin_ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ..
$ catkin_make

ビルドが完了したので、以下の2つのコマンドを実行したところ、無事USBカメラの映像が表示されました。めでたしめでたし。

$ rosrun usb_cam usb_cam_node
$ rosrun image_view image_view image:=/usb_cam/image_raw


usb-camなんてみんな使ってそうだし簡単に入れれるだろうと思ったのでいろんな人が開発してるんだなー、と実感しました。ちょっと触ってみた感じ特に問題なく動いてそうです。

いつかはこういう開発に貢献してみたいもんですなー。



2016年11月2日水曜日

【備忘録】OccupancyGridのwidth, heightについて

こんにちは。

たぶん日本で二人くらい僕と同じ間違いを犯すと思うのでメモ。

OccupancyGridを使っててなーんかうまくいかないなー、と思ってて仕様をよーくみてみたら


width[cell]



とかいてあって膝から崩れ落ちました、
[m]だろうと想像して実装してたら一時間無駄になった。。


幅あたりのグリッドのセルの個数みたいです、幅自体はresolutionから計算しろってことですね。

誰かの役に立ちますよーに。。笑

2016年10月31日月曜日

[Book]Programming Robots with ROS Chapter4: Service を読みながらServiceを試した。後編

前回の続き。

前編で下準備が完了したので、後半は実装のお話し。

使用したソースコードはGitHubに後でおく予定。


Implementing a Service

service_server.py

callbackで指定された文の単語数を返す。

注意点

- WordCountResponseとWordCountをimportする。

- ノードを活かしておくためにrospy.spin()使う。手っ取りばやい。


Checking That Everything Works as Expected


作成したノードを実行してみる。

$ rosrun service_sample service_server.py

service_sampleの部分はcatkin_create_pkgで指定したパッケージ名になります。

ちゃんと動いてるか確認するのに、以下を実行。

$ rosservice list

これで/word_countが表示されることを確認。


さらに、追加で情報が欲しい場合は、以下を実行。

$ rosservice info word_count

これでノード名や型、引数等の情報が表示される。



Other Ways of Returning Values from a Service

戻り値、いろんな形式で指定できますよ、の説明。3通り。省略


Using a Service


server側の実装はできたので、コマンドラインから以下で確認することも可能。

$ rosservice call word_count 'one two three'
count: 3


でも通常は別のノードから呼び出すので、client側のサンプル作りましょー。


service_client.py

ポイント

-  rospy.wait_for_service('word_count')でサービスが開始するのを待つ。

 サービスが開始する前の呼び出すと、exceptionで落ちる。

- word_counter = rospy.ServiceProxy('word_count', WordCount)で指定したword_counterに
 引数(文字数確認対象の文字列)を指定して呼び出す。


Checking That Everithing Works as Expected


コマンドラインから動作確認。

$ rosrun service_sample service_client.py these are some words
these are some words -> 4

注意点

何かしらサーバーに問題があると永遠にclientが待ち続けることがあるよ、と。(まじか。。)


Other Ways to Call Service

- 戻り値2個のケース。戻り値を受ける変数がc, iとかだと、srvで定義した順に戻り値が返る。

例: c, i = word_count(words, 3) だと、count, ignoreの順。

- serviceを使うのに、WordCountRequestを使って以下のように書くこともできる。

  request = WordCountRequest('one two three', 3)
  count, ignored = word_counter(request)

この書き方をする場合は、WordCountRequestをimportするのを忘れないこと。

- 引数にword_counter(words='one two three')みたいにキーワードを指定することもできます。
 
ただし、この書き方の場合指定しない引数は不定とかになるのをちゃんと注意しましょうね。


Summary

- serviceの使い方、実装の仕方を一通り確認しました。

- 全部はカバーしてないのでwikiを見ましょうね。http://wiki.ros.org/Services?distro=indigo

- 同期の返事が必要なとき、とか必要なときに使いましょう。
 
 基本replyはすぐ返ることを想定しているので、長時間replyにかかる場合はChapter5の
  action を使ったほうがいいかもしれません。


=============================================================================
ということで、一通りServiceについて終了。
どういうときに使うかは使いながら覚えていこうと思います。


せっかくだからactionについても勉強してみる。近々。


[Book]Programming Robots with ROS Chapter4: Service を読みながらServiceを試した。前編

こんにちは。

Topicばっかり使ってServiceの勉強してないことに気づいたので、せっかくなのでProgramming 
Robots with ROSのChapter4を読みながら動かしてみることにしました。

ちなみにこれ読む前は小倉さんの本で”同期で何かやりたいときに使う何か”くらいの理解でした。
まー読んだ後もあんまり理解は変わってませんが。。笑

まえがき

- あるノードが別のノードのfunctionを呼ぶ場合に使う。

- input/outputを定義するよ

- ユースケースとしては、センサをONしたり、カメラで高解像度の写真を撮ったりすることを想定

既存のサービスも多数ありますが、あえて中身を理解するために今回は独自のserviceを作る、とのこと。

Defining a Service

service-definition fileを自分で定義してみましょう、という段落になります。

message-definition file(Topicで使用する定義)と似ているのですが、
Input/Outputの定義がある点が異なります。

今回文字列から単語数をカウントするサービスですので、定義するサービスは以下とします。

WordCount.srv

string words
---
uint32 count

"---"は入力と出力の間に書きます。

作ったsrvファイルを適切なディレクトリに配置したら、catkin_makeを再度やる必要があります。
この辺は自分でmsg追加したときと同じ手順ですね。

CMakeLists..txtとpackage.xmlを一部修正する必要があります。


CMakeLists.txt

  1.  find_packageにmessage_generationを追加
  2.  add_service_filesにWordCount.srvを追加
  3.  generate_messagesを有効化

package.xml

以下を追加。コメントアウトしてある部分を有効にするのが半分くらいでした。

<build_depend>rospy</build_depend>
<run_depend>rospy</run_depend>

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

以上の修正の後、catkin_makeを実行

実行後、rossrvコマンドで作成されたserviceが正しく設定できているか確認できる。

$ rossrv show WordCount

後編へ続く。

[備忘録] rostest試してみた

こんにちは。

以前rostestについて、本で読んでみたものの実際にやってみないとわからんなー、と思ったので本に載ってたサンプルを試してみました。(まんまだとエラーでたので一部修正しましたが。)

参考にしたのは以下。

Programming Robots With ROS
P.366のrostestの説明。

 あとはオフィシャルのwikiを参考にしました。
 http://wiki.ros.org/rostest

ディレクトリ構成とかはよくわからなかったので適当に配置しました。

事前準備

- testディレクトリを作成

CMakeLists.txtを修正した気がしたのですが、修正しなくてよかったみたいです。

テストに使用するトピックはrospy_tutorialのtalkerとlistenerを使用してます。(本で使用している条件そのまま)

launchファイルの作成

launchファイルを以下に書き換えます。
test用ということで、testディレクトリ以下に配置しました。launchでもいいのかもですがなんとなく。

listener_test.test
<launch>
    <node name="talker" pkg="rospy_tutorials" type="talker" />
    <node name="listener" pkg="rospy_tutorials" type="listener" />
    <test test-name="test_talker" pkg="test_sample" type="test_talker.py" />
</launch>


テストコードの作成

サンプルのまんま、test_talker.pyを作成しました。

chatterトピックをsubscribeし、"hello world"があったらsuccessとするテストコード。

テストの実行

以下のコマンドをコマンドラインで実行すると、結果が表示されました。

$ rostest test/lister_test.test

ちゃんと条件を変えたらRESULT:FAILにもなったんで、これを元に今後テストを足していこうと思います。変なとこでつまったんですが便利ですね~。


今回使用したソースコードはこちらに置きました。
https://github.com/zmsn/ROS


test_sampleというディレクトリにまんま置いてあります。