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の使い方をまとめてみた。わりと楽ですね。

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