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

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