2010年12月14日火曜日

ni (OpenNIのrosスタック)を試す。

OpenNIはKinectを利用する認識・デバイス操作ライブラリです。

ROSからOpenNIを利用するには以下を参考にインストールしましょう。
Ubuntu 10.04, cturtleを前提とします。

http://www.ros.org/wiki/ni


$ echo "- git: {local-name: ni, uri: 'https://github.com/ros-pkg-git/ni.git', version: master}" > /tmp/ni.ri
$ rosinstall ~/ni /opt/ros/cturtle /tmp/ni.ri
$ source ~/ni/setup.sh
$ rosmake ni --rosdep-install
$ sudo cp `rospack find ps_engine`/install/55-primesense-usb.rules /etc/udev/rules.d/


そしてリブートしましょう。


これでインストール終了。


試すには
$ roslaunch openni_camera openni_kinect.launch
$ rosrun rviz rviz
して、
Fixed FrameとTarget Frameを/openni_depthにして、
Point Cloud2として、
/camera/depth/points2を指定すると
rviz上で3D色付きイメージが見れます。ぐりぐり動かせます。

人物抽出サンプルを実行するには


export XN_SENSOR_VENDOR_ID=0x045E 
export XN_SENSOR_PRODUCT_ID=0x02AE
export XN_HOST_PROTOCOL_ALGORITHM_REGISTRATION=0x40
rosrun openni Sample-NiUserTracker

とします。
http://www.ros.org/wiki/nite
のドキュメントには64bitのみ対応と書いてありますが、
すでにソースはちゃんと対応してあるので、x86(32bit)でも普通に実行できます。

動画はgtk-recordmydesktopですべてのフレームをキャプチャするオプションをONにしてとりました。
エンコードは
$ mencoder out.ogv -oac mp3lame -ovc lavc -lavcopts vcodec=mpeg4 -o output.mp4
という感じ。

2010年12月4日土曜日

pcl(unstable)のインストール

pcl (point cloud library)をインストールします。
http://www.ros.org/wiki/pcl

pclは3Dのレーザーデータから物体認識するためのライブラリ(たぶん)です。
これまでそんな3Dセンサ持っていないので関係ないと思っていましたが、
Kinectのおかげでpclが使えそうな雰囲気がしてきたのでとりえあず触ってみたいと思います。

私の環境ではROSはcturtleを利用していますが、いろんなところで
cturtleのpclは古すぎて、APIも変わっているしオススメしない、という雰囲気を感じるので
なるべく新しいものを入れたいと思います。

pclを使っている@garaemonさんに聞いたところによると「まじunstableおすすめ」ということでしたので、
いれてみます。

以下のような記述をpcl.rosintallとして保存して、
$ rosinstall ros pcl.rosinstall
でソースを入手しました。


- svn:
    uri: https://code.ros.org/svn/ros-pkg/stacks/perception_pcl/tags/unstable
    local-name: perception_pcl
- svn:
    uri: https://code.ros.org/svn/ros-pkg/stacks/perception_pcl_addons/tags/unstable
    local-name: perception_pcl_addons

ROS全部makeするのめんどくさかったので、ROS本体はcturtleのまま、
pclだけunstable版でやってみます。

環境変数ROS_PACKAGES_PATHのcturtleのほうより先に、このunstable版がくるようにして、
$ roscd pcl_tutorial
$ rosmake --rosdep-install
としてみました。

試しに
$ roscd pcl_tutorial
$ cd data
$ ../bin/tutorial_narf_keypoint_extraction ./office_scene.pcd
としてみると、以下のようにnarf特徴点の抽出と表示ができたようです。


早くKinectのデータで試してみたいですね。
Tutorialがあるので必要ありそうなところだけやってみたいと思います。

2010年11月22日月曜日

joint_state_publisher

URDFのチュートリアルが追加されました。
http://www.ros.org/wiki/urdf/Tutorials

2. Learning URDF Step by Step

というやつです。


    そこでなかなか便利なツールを見つけたので紹介します。
    joint_state_publisherです。

    http://www.ros.org/wiki/joint_state_publisher

    wu-ros-pkgからインストールしてください。


    URDFでロボットファイルを作るときに、GUIで
    任意のロボット関節角度をPublishしてくれます。


    ↓みたいな感じです。
    便利。

    2010年11月21日日曜日

    KinectをROSで使ってみる

    Kinect10分くらい前に1日遅れでやっと届きました。
    Amazon遅すぎです。。。

    でも入手10分でデプスイメージまで取れました。
    世界のハッカーありがとう。


    黒いところは問題ない様子。透明部分は当然ながら取れない。

    近すぎると距離が取れない(白く抜けてしまっている)

    模様がなくても取れるのがステレオカメラとの違い。

    遠いところ(扉の奥)は見えない(白く抜けている)

    やっぱり直射日光には弱い。



    全体的にのっぺりしたところが得意みたいです。

    全体的にイイです。
    想定した通りのイメージ。

    障害物回避に使うには、近距離が見えなすぎるので実用的ではないきがしてきました。
    どうしましょう。

    以下インストールから実行方法。

    基本的に以下の通りにやりました。
    http://www.ros.org/wiki/kinect


    1. rosintallスクリプトとgitのインストール
      sudo apt-get install python-setuptools
      sudo easy_install -U rosinstall
      sudo apt-get install git-core
    2. rosintallファイルを入手
      wget http://github.com/ros-pkg-git/kinect/raw/master/kinect.rosinstall --no-check-certificate
    3. ROS-kinect stackの入手
      rosinstall ~/kinect-devel /opt/ros/cturtle kinect.rosinstall
    4. libfreenectをgitで入手
      cd ~/kinect-devel/kinect
      git submodule update --init --recursive
    5. ビルド
      . ~/kinect-devel/setup.sh
      rosmake kinect --rosdep-install

    ただし、このままでは動かないので
    $ sudo chmod -R 777  /dev/bus/usb/
    しました。

    実行方法は
    $ roscore
    $ roscd kinect_camera
    $ bin/kinect_node
    して、
    もうひとつのターミナルで
    $ rosrun image_view image_view image:=/camera/depth/image_raw
    で、デプスイメージの表示

    $ rosrun image_view image_view image:=/camera/rgb/image_raw
    でカメラ画像の表示です。

    これからPCLも試してみます。

    2010年11月19日金曜日

    rosmsg users

    いつのまにかros-kinectメーリングリストまでできてますね。
    興味のある人はSubscribeしておいたほうがいいのでは。

    ROSメーリスを読んでいて見つけた小ネタですが、
    あるメッセージタイプを利用しているファイルを全部見つけてくれるコマンドが
    rosmsgにあったんですね。

    geometry_msgs/Twistを利用しているファイルを見つけたいときは

    $ rosmsg users geometry_msgs/Twist

    とするとstacksからすべて列挙してくれます。
    便利。

    2010年11月12日金曜日

    ROS Kinect node

    Kinectはご存知ですか?
    http://www.xbox.com/ja-JP/kinect
    XBOX360のWiiに対抗?したコントローラー?で、
    カメラで人の形状を認識して、ジェスチャなどで遊ぶことができます。

    で、それに使われているのがPrime Sense
    http://www.primesense.com/
    というセンサで、3次元形状が単眼カメラ+プロジェクタで取得できるというものです。

    Kinectも同じように3次元形状を取得できるはずですが、
    XBOX360の発売元のMicrosoftはそれをしてほしくない
    (ゲームのコントローラだから安く売れる、つまりゲームソフトで元を取る)
    ので、APIなどは公開されていません。

    それをハックした人がいました。
    (ハックには懸賞金$3000($1000から徐々にあがりました)がかけられていました。)

    で、さらにそれをROSで使いやすいようにした人がいます。
    ↓はそのビデオ。3次元形状がとれてますね。Viewerはrvizのようです。



    最近はこの話題でもちきりです。僕の中では。
    何がスゴイって、安いんです。12000円で買えるんです。
    普通のレーザーだって40万とか、3Dだと100万円でも安いほう?
    ですから、この値段は本当に驚異的です。
    さすがに精度はでないと思うので、用途は限定的になるかと思いますが、
    非常に想像力を掻き立てられます!

    早速Kinect予約しました。日本では11/20発売です。
    XBOX360は持ってません!

    届いたらこれを使ってPCLやらいろいろ認識系ソフトを試してみたいと思います。
    それまでにキャリブレーションとかできるようになっていることに期待。

    2010年11月10日水曜日

    ROSのwikiにページできてた

    今日気づいたのですが、いつのまにかROSのwikiにotl-ros-pkgのページが自動で生成されていました。

    http://www.ros.org/wiki/otl-ros-pkg


    本名ダダ漏れになっていますが、どうしよう。。。。

    とりあえず、せっかくなのでこの前@nao_sodyさんに作ってもらったロゴを付けておきました。



    2010年11月7日日曜日

    OTLマーカー

    こんにちは。

    OTLのARマーカーが出来ました。
    デザインは某デザイン工房にてお願いしました。
    うーん、これはいいな。
    ちゃんと認識もできました。


    mk_pattというコマンドでパターンファイル(ARToolKitが認識するために必要なデータファイル)を作るのですが、これがROSのものだと動きません。(ARToolKitがVideo4Linux2未対応なため)
    そこで結局以前いれたVideo4Linux2対応版(aistのパッチを当てたもの)を利用してパターンファイルを作りました。

    2010年11月6日土曜日

    camera_calibration(USBカメラのキャリブレーション)

    今日はカメラのキャリブレーションをやります。

    http://www.ros.org/wiki/camera_calibration/Tutorials/MonocularCalibration


    1.チェックボードの印刷
    研究等でカメラをやる人にはおなじみなのですが、F1のチェッカーフラッグのような
    画像を見せてカメラのキャリブレーションをします。

    このチュートリアルにある↓のファイルを印刷してもいいですし、
    他のチェッカーでもサイズが分かっていればいいと思います。
    そしてこれはそのままだと大きすぎて印刷大変でしょうから、僕はA4サイズでやりました。

    チェックボードもPTAMで印刷したものがあったので、それでやっちゃいました。



    2.キャリブレーションの実行

    まず以下のようにして、camera_calibrationが使えるようにしましょう。
    $ rosmake camera_calibration --rosdep-install

    そしたら、チェッカーボードのサイズにあわせて以下のようにしてキャリブレーションプログラムを走らせます。
    $ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw

    私はPTAMのcalib_pattern.pdfを使ったので、
    $ rosrun camera_calibration cameracalibrator.py --size 11x7 --square 0.02 image:=/usb_cam/image_raw
    でやりました。

    原文にあるように最後にcamera:=/usb_camなどを付けると/usb_cam/set_camera_infoサービスを呼ぼうとするので失敗するので付けないでください。


    すると↑のような画面が表示されるので、
    グリグリと、いろんな方向からこのチェッカーボードをカメラで見せてください。
    しばらくやっているとCALIBRATEボタンが有効になるので、これをクリックー>SAVEボタンをクリックしてください。

    3.データの確認
    すると
    /tmp/calibrationdata.tar.gz
    にキャリブレーションに使った画像ファイルとデータが保存されます。

    $ tar zxvf /tmp/calibrationdata.tar.gz
    すると、
    left-0000.png
    left-0001.png
    left-0002.png
    left-0003.png
    left-0004.png
    left-0005.png
    left-0006.png
    left-0007.png
    left-0008.png
    left-0009.png
    left-0010.png
    left-0011.png
    left-0012.png
    left-0013.png
    left-0014.png
    left-0015.png
    left-0016.png
    left-0017.png
    left-0018.png
    left-0019.png
    left-0020.png
    left-0021.png
    left-0022.png
    left-0023.png
    left-0024.png
    left-0025.png
    left-0026.png
    left-0027.png
    left-0028.png
    ost.txt

    と、いろいろ出てきます。
    重要なのは最後のost.txtです。

    このファイルの中身は以下のようになっています。

    # oST version 5.0 parameters


    [image]

    width
    640

    height
    480

    [narrow_stereo/left]

    camera matrix
    849.555669 0.000000 310.565257
    0.000000 850.171143 237.409081
    0.000000 0.000000 1.000000

    distortion
    0.270500 -1.345412 -0.000040 -0.001902 0.0000

    rectification
    1.000000 0.000000 0.000000
    0.000000 1.000000 0.000000
    0.000000 0.000000 1.000000

    projection
    849.555669 0.000000 310.565257 0.000000
    0.000000 850.171143 237.409081 0.000000
    0.000000 0.000000 1.000000 0.000000

    これがカメラのパラメータになります。


    以上でキャリブレーションは終わりです。
    前回の続きで、ar_poseにこの結果を利用してみます。

    ar_poseの実行

    $ roscd ar_pose
    $ cd launch
    して、
    以下をar_pose_single.launchのパラメータを書き換えます。

    D: ost.txtのdistortion
    K: ost.txtのcamera matrix
    R: ost.txtのrectification
    P: ost.txtのprojection

    になるようにします。


    <launch>
      <param name="use_sim_time" value="false"/>
      
      <node pkg="rviz" type="rviz" name="rviz" 
            args="-d $(find ar_pose)/demo/demo_single.vcg"/>
      
      <node pkg="tf" type="static_transform_publisher" name="world_to_cam" 
            args="1 1 0.3 0 0 0 world ar_marker 10" />
      
      <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" respawn="false" output="log">
        <param name="video_device" type="string" value="/dev/video0"/>
        <param name="camera_frame_id" type="string" value="usb_cam"/>
        <param name="io_method" type="string" value="mmap"/>
        <param name="image_width" type="int" value="640"/>
        <param name="image_height" type="int" value="480"/>
        <param name="pixel_format" type="string" value="yuyv"/>
        <rosparam param="D">[0.270500, -1.345412, -0.000040, -0.001902, 0.0000]</rosparam>
        <rosparam param="K">[849.555669, 0.000000, 310.565257, 0.000000, 850.171143, 237.409081, 0.000000, 0.000000, 1.000000]</rosparam>
        <rosparam param="R">[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]</rosparam>
        <rosparam param="P">[849.555669, 0.000000, 310.565257, 0.000000, 0.000000, 850.171143, 237.409081, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000]</rosparam>
      </node>
      
      <node name="ar_pose" pkg="ar_pose" type="ar_single" respawn="false" output="screen">
        <param name="marker_pattern" type="string" value="data/patt.hiro"/>
        <param name="marker_width" type="double" value="80.0"/>
        <param name="marker_center_x" type="double" value="0.0"/>
        <param name="marker_center_y" type="double" value="0.0"/>
        <param name="marker_frame" type="string" value="ar_marker"/>
        <param name="threshold" type="int" value="100"/>
        <param name="use_history" type="bool" value="true"/>
      </node>
    </launch>


    $ roslaunch ar_pose_single.launch
    すると、USBカメラ位置がrviz上でマーカーからの相対で表示されます。
    少しは精度よくなったのかな?


    以上です。

    ar_pose (ARToolKitのマーカー認識 in ROS)パッケージを使ってみる

    ar_poseパッケージはARToolKitの機能のうち、マーカーの位置姿勢を認識する機能だけを取り出して、TFメッセージを書き出すようにしたCCNY(City University of New York)のパッケージです。

    前回はインストールまでやりました。

    前回の記事でusb_camパッケージはcamera_infoトピックを発行しないのでどうしよう?
    ということを書きましたが、これは古いusb_camパッケージを使っていたからで、
    最新のboschのusb_camパッケージではちゃんと対応していました。

    http://www.ros.org/wiki/bosch-ros-pkg#bosch_drivers

    $ svn export http://bosch-ros-pkg.svn.sourceforge.net/svnroot/bosch-ros-pkg/trunk/stacks/bosch_drivers

    のようにしてソフトをダウンロードし、
    $ rosmake usb_cam
    とすればOKですね。

    ar_pose/launch/ar_pose_single.launch
    を覗いてみたら、ちゃんとこのusb_camパッケージを使っていましたので、
    USBカメラで簡単に試せるようになっています。

    1.USBカメラの動作確認

    まずはカメラをPCに差してusb_camノードを立ち上げます。
    以下のようなusb.launchを用意して、

    <launch>
      <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
        <param name="video_device" value="/dev/video0" />
        <param name="image_width" value="640" />
        <param name="image_height" value="480" />
        <param name="pixel_format" value="yuyv" />
        <param name="camera_frame_id" value="usb_cam" />
        <param name="io_method" value="mmap" />
      </node>
    </launch>


    $ roslaunch usb.launch
    するとキャプチャ開始されると思います。

    $ rosrun image_view image_view image:=/usb_cam/image_raw
    とすると表示されます。されなければ、上記usb.launchの各種設定を見直してください。
    確認が終わったらimage_viewは落しちゃっていいです。

    動作確認が終わったらusb.launchのほうも一旦落としてください。



    2.パターンの印刷
    ではまず、
    $ roscd artoolkit
    して、
    build/artoolkit-svn/patterns/pattHiro.pdf
    を印刷してください。
    ↓です。


    3.ar_poseの実行

    $ roscd ar_pose
    launch/ar_pose_single.launch
    のusb_camノードの必要なパラメータ(pixel_formatなど)だけ書き換えて、
    $ roslaunch ar_pose ar_pose_single.launch
    してみましょう。

    ほら、簡単でしょう?



    ちなみに私の環境ではar_pose_single.launchは以下のような感じです。



    <launch>
      <param name="use_sim_time" value="false"/>

            <node pkg="rviz" type="rviz" name="rviz"
              args="-d $(find ar_pose)/launch/live_single.vcg"/>
                      
       <node pkg="tf" type="static_transform_publisher" name="world_to_cam"
         args="1 1 0.3 0 0 0 world ar_marker 10" />

            <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" respawn="false" output="log">
                    <param name="video_device" type="string" value="/dev/video0"/>
                    <param name="camera_frame_id" type="string" value="usb_cam"/>
                    <param name="io_method" type="string" value="mmap"/>
                    <param name="image_width" type="int" value="640"/>
                    <param name="image_height" type="int" value="480"/>
                    <param name="pixel_format" type="string" value="yuyv"/>
                    <rosparam param="D">[0.025751483065329935, -0.10530741936574876,-0.0024821434601277623, -0.0031632353637182972, 0.0000]</rosparam>
                    <rosparam param="K">[558.70655574536931, 0.0, 316.68428342491319, 0.0, 553.44501004322387, 238.23867473419315, 0.0, 0.0, 1.0]</rosparam>
                    <rosparam param="R">[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]</rosparam>
                    <rosparam param="P">[558.70655574536931, 0.0, 316.68428342491319, 0.0, 0.0, 553.44501004322387, 238.23867473419315, 0.0, 0.0, 0.0, 1.0, 0.0]</rosparam>
       </node>
          
            <node name="ar_pose" pkg="ar_pose" type="ar_single" respawn="false" output="screen">
                    <param name="marker_pattern" type="string" value="data/patt.hiro"/>
                    <param name="marker_width" type="double" value="80.0"/>
                    <param name="marker_center_x" type="double" value="0.0"/>
                    <param name="marker_center_y" type="double" value="0.0"/>
                    <param name="threshold" type="int" value="100"/>
                    <param name="use_history" type="bool" value="true"/>
            </node>
    </launch>


    以上です。あとはTFになっているんで、焼くなり煮るなりなんとでも。。。
    カメラパラメータが適当なので、それなりに表示はされていますが、位置はずれていると思います。

    次回はキャリブレーションをやってみます。

    2010年11月4日木曜日

    ARToolKitをccny_visionを使ってインストール

    以前ARToolKitをインストールして、試すところまではやりましたが
    ROSとつなげる前に挫折しました。

    そしたらすでにやってくれている人がいましたので、こちらを利用してみます。

    http://www.ros.org/wiki/ccny_vision

    まず以下のようにしてコードをコピーします。


    $ cd ~/ros/stacks
    $ git clone http://robotics.ccny.cuny.edu/git/ccny-ros-pkg.git

    で、次にccny_visionスタックをmakeします。

    $ cd ~/ros/stacks/ccny-ros-pkg
    $ rosmake ccny_vision --rosdep-install


    rosmakeに--rosdep-installを付けると必要なソフトを自動でインストールまでやってくれます。

    とりあえずこれでインストールは終了です。
    すごく簡単ですね。

    実際に使うにはカメラのキャリブレーションをしないといけないです。
    ARToolKitのキャリブレーションではなくROSのカメラパラメータ(camera_infoトピック)が必要で、
    usb_camノードはこのcamera_infoトピックがありません。
    さあ、どうしましょう。

    OpenCVのカメラキャリブレーションを使ってできそうな気がするので
    また時間ができたらトライしてみたいと思います。

    http://www.ros.org/wiki/camera_calibration

    rosbuild Tipsその1(rosbuild_add_gtest)

    ROSで単体テストをgtestで書いた場合、CMakeLists.txtに以下のように書くと

    rosbuild_add_gtest(test/test_matrix test/test_matrix.cpp)

    $ make test
    としたときだけmakeされ、さらに実行、結果をxmlに保存、までやってくれます。

    楽です。

    2010年10月28日木曜日

    rvizを使う

    今回はrvizを使ってみます。
    今までにも何度かrvizはでてきました。
    主に自律移動の可視化(センサ情報、自己位置など)に利用してきました。

    今回は自分のオリジナルデータを表示する方法をやります。

    以下のチュートリアルをやります。
    http://www.ros.org/wiki/rviz/Tutorials/Markers:%20Basic%20Shapes

    visualization_msgs/Marker というメッセージを利用して表示する方法です。

    規定のshapeから選択して表示する方法になります。
    以下のような矢印、キューブ、線などから選択することになります。




    以下では1つのオブジェクトを表示して、それが1秒毎に形状の種類を変化させるサンプルをつくります。

    それではいつも通りパッケージを作りましょう。


    $ roscreate-pkg using_markers roscpp visualization_msgs

    で、いつものように以下のコードをsrc/basic_shapes.cppとして保存してください。

    #include <ros/ros.h>
    #include <visualization_msgs/Marker.h>
    
    int main( int argc, char** argv )
    {
      ros::init(argc, argv, "basic_shapes");
      ros::NodeHandle n;
      ros::Rate r(1);
      ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>("visualization_marker", 1);
    
      // Set our initial shape type to be a cube
      uint32_t shape = visualization_msgs::Marker::CUBE;
    
      while (ros::ok())
      {
        visualization_msgs::Marker marker;
        // Set the frame ID and timestamp.  See the TF tutorials for information on these.
        marker.header.frame_id = "/my_frame";
        marker.header.stamp = ros::Time::now();
    
        // Set the namespace and id for this marker.  This serves to create a unique ID
        // Any marker sent with the same namespace and id will overwrite the old one
        marker.ns = "basic_shapes";
        marker.id = 0;
    
        // Set the marker type.  Initially this is CUBE, and cycles between that and SPHERE, ARROW, and CYLINDER
        marker.type = shape;
    
        // Set the marker action.  Options are ADD and DELETE
        marker.action = visualization_msgs::Marker::ADD;
    
        // Set the pose of the marker.  This is a full 6DOF pose relative to the frame/time specified in the header
        marker.pose.position.x = 0;
        marker.pose.position.y = 0;
        marker.pose.position.z = 0;
        marker.pose.orientation.x = 0.0;
        marker.pose.orientation.y = 0.0;
        marker.pose.orientation.z = 0.0;
        marker.pose.orientation.w = 1.0;
    
        // Set the scale of the marker -- 1x1x1 here means 1m on a side
        marker.scale.x = 1.0;
        marker.scale.y = 1.0;
        marker.scale.z = 1.0;
    
        // Set the color -- be sure to set alpha to something non-zero!
        marker.color.r = 0.0f;
        marker.color.g = 1.0f;
        marker.color.b = 0.0f;
        marker.color.a = 1.0;
    
        marker.lifetime = ros::Duration();
    
        // Publish the marker
        marker_pub.publish(marker);
    
        // Cycle between different shapes
        switch (shape)
        {
        case visualization_msgs::Marker::CUBE:
          shape = visualization_msgs::Marker::SPHERE;
          break;
        case visualization_msgs::Marker::SPHERE:
          shape = visualization_msgs::Marker::ARROW;
          break;
        case visualization_msgs::Marker::ARROW:
          shape = visualization_msgs::Marker::CYLINDER;
          break;
        case visualization_msgs::Marker::CYLINDER:
          shape = visualization_msgs::Marker::CUBE;
          break;
        }
    
        r.sleep();
      }
    }


    ざっと、上から眺めていくと大体わかると思いますが、

      uint32_t shape = visualization_msgs::Marker::CUBE;
    
    marker.action = visualization_msgs::Marker::ADD;

    のところでメッセージの定数が利用されていますね。
    これまであまり使ってきませんでした。

    http://www.ros.org/wiki/msg
    の2.2にあるように.msgファイルで

    constanttype1 CONSTANTNAME1=constantvalue1
    constanttype2 CONSTANTNAME2=constantvalue2

    のようにすると定数が使えます。

    あとは気になったのは↓でした。

        marker.lifetime = ros::Duration();

    lifetimeを設定すると自動でその時間経過すると削除されるようです。
    ros::Duration() (つまり0秒)にすると自動で削除されません。

    あとはここまで勉強してきた人ならさらっと理解できると思います。

    そしたらCMakeList.txtに以下を追記して、


    rosbuild_add_executable(basic_shapes src/basic_shapes.cpp)


    $ rosmake
    で依存関係を考慮してmakeしましょう。

    そうしたら
    $ roscore
    $ rosrun rviz rviz
    でrvizを立ち上げます。

    .Global Optionsの
    Fixed FrameとTarget Frameを/my_frameにして、
    Addボタンを押してMarkerを追加します。

    すると、Marker Topic はvisualization_marker
    になっているので、このサンプルと同じです。

    なのでこれだけで表示されます。

    という感じで次々変わっていきます。

    点群や、線などもpointsを使えば書けそうです。

    2010年10月27日水曜日

    cturtle in ubuntu10.04にアップデート

    おひさしぶりです。
    イベントがあったのでしばらくThinkpadのUbuntuをUpdateしないでいたのですが、
    落ち着いたのでアップデートしました。

    Ubuntu9.04 -> 9.10 -> 10.04と、普通にアップデートできました。
    Debian3.0くらいのころはdist-upgradeなんてできる気が全くしませんでしたが、
    最近のLinuxは簡単にできるんですね。

    Thinkpadではグラボの関係なのかrvizがバグって(グリッドの線が消えない)いましたが、
    10.04にしたらちゃんと使えそうです。

    ROSもcturtleを入れました。

    そして、今作っているパッケージをmakeしてみたのですが、


    $ make
    mkdir -p bin
    cd build && cmake -Wdev -DCMAKE_TOOLCHAIN_FILE=`rospack find rosbuild`/rostoolchain.cmake  ..
    [rosbuild] Building package egeometry
    [rosbuild] Cached build flags older than manifests; calling rospack to get flags
    Failed to invoke /opt/ros/cturtle/ros/bin/rospack cflags-only-I;--deps-only egeometry
    [rospack] warning: got non-zero exit status from executing backquote expression "ret="`echo 'ERROR: It is invalid to depend on the gtest package'; false`" && echo $ret" in [/opt/ros/cturtle/ros/3rdparty/gtest/manifest.xml]
    [rospack] error in backquote expansion for egeometry


    CMake Error at /opt/ros/cturtle/ros/core/rosbuild/public.cmake:113 (message):
     

      Failed to invoke rospack to get compile flags for package 'egeometry'.
      Look above for errors from rospack itself.  Aborting.  Please fix the
      broken dependency!

    Call Stack (most recent call first):
      /opt/ros/cturtle/ros/core/rosbuild/public.cmake:202 (rosbuild_invoke_rospack)
      CMakeLists.txt:12 (rosbuild_init)


    -- Configuring incomplete, errors occurred!
    make: *** [all] エラー 1

    となりコンパイルできません。

    なんのエラーだか分かりませんでしたが、よく調べたらgtestへの依存はmanifestに書かないようになったみたいです。

    今までmanifest.xmlにgtestを利用するために
      <depend package="gtest"/>
    と書いていましたが、cturtleでは不要になったようで、
    これがあるとエラーになるようになったようです。

    ご注意あれ。

    2010年9月19日日曜日

    お茶注ぎロボット完成〜。

    前回紹介したお茶注ぎロボットが(一応)完成したのでとりあえず動画だけ
    紹介しておきます。

    本当はもっといろいろやりたかったですが、もう時間がないのでここまでです。

    次回以降中身を少し紹介します。



    2010年9月16日木曜日

    作成中のお茶くみロボットのソフト構成

    現在製作中のお茶くみロボットのノード構成の設計を以下に示します。
    やっつけなので、メッセージはstd_msgsを連発してしまいます。
    まあ、こまられなければそれがいいんでしょうけどちょっと寂しいですね。
    これまでにやってきた既存資産とオープンソースの力をいかしまくって、ROSの多対多の通信を活用して、
    さらっと結合できる。
    予定です。

    多分世界一高機能なお茶くみロボットになるでしょう。


    作ったロボットはMOM01で展示するので、万一興味をもたれた方は見にきてくださいね〜。

    2010年9月10日金曜日

    twitterへの書き込みをするROSノードを作成(OAuth対応)

    TwitterがBasic認証締め出しために、Twitter APIを利用するために
    OAuthという方法を使用しなければいけなくなりました。

    なので、以前書いた記事
    http://ros-robot.blogspot.com/2010/01/twitterros.html
    が役に立たなくなってしまいました。

    Twitter APIを再び使いたくなったので、またROSノードを作って見ました。

    相変わらずへなちょこな私なので既存のライブラリを使わせていただきました。

    Pythonだけあれば使える以下のライブラリが良さげでした。

    http://www.techno-st.net/wiki/Python-twoauth

    OAuthを利用するプログラムを書くためには、まず
    http://dev.twitter.com/apps/でソフトを登録します。
    そこでconsumer keyとconsumer secretを取得します。
    そしてユーザにaccess_tokenとPINを取得してもらいます。
    この4つの情報をつかってAPIを利用します。

    なのでノードは以下のようになります。
    パスワードを直接書かなくてよいので安全にはなったでしょうか。
    面倒くさいですが。



    #!/usr/bin/env python                                                                    

    import twoauth
    import roslib; roslib.load_manifest('rostwitter')
    import rospy
    from std_msgs.msg import String

    # 以下をあらかじめ取得しておく必要がある。
    consumer_key = 'HOHGOEHOGHEOHGOE'
    consumer_secret = 'HOGEOGHOEHO'
    access_token = 'HOGEOHGOEHOG'
    access_token_secret = 'HOGEOGOEHOGHOE'

    def twit(data):
        rospy.loginfo(rospy.get_name()+"I heard %s",data.data)
        twitter.status_update(data.data)

    def listener():
        rospy.init_node('rostwit_server', anonymous=True)
        rospy.Subscriber("twit", String, twit)
        rospy.spin()

    if __name__ == '__main__':
        twitter = twoauth.api(consumer_key, consumer_secret, access_token, access_token_secret)
        listener()

    書き込みは
    $ rostopic pub /twit std_msgs/String 'Tweet by ROS node test'
    でやりました。


    via lv1と書かれています。
    lv1というのが登録したソフトの名称になります。

    2010年8月31日火曜日

    日本語をしゃべるROSノード

    ロボットに日本語をしゃべらせたかったので、
    日本語をしゃべるROSノードを作りました。Ubuntuでのみ動作します。




    jtalk_nodeです。
    ソースは最後に張っておきます。

    (もし使いたい人がいれば、
    http://code.google.com/p/otl-ros-pkg/source/checkout
    の指示にしたがいsubversionからcheckoutしてください。)

    /talkトピックをSubscribeして、もらった文字列(ローマ字)を発音します。
    ~talk_speedをパラメータに取ってしゃべる速度を変えることができます。

    インストールには、

    $ rosdep install jtalk_node
    $ rosmake jtalk_node
    としてください。

    主にライブラリAquesTalk2のインストールの自動化ところに苦労しました。
    jtalk_nodeはNew BSDライセンスですが、

    AquesTalk2のライセンス
    「本ソフトは、非営利の個人利用に限り無償で使用できます。それ以外のご利用の場合はライセンスの購入が必要です。 法人での使用は、使用が個人であってもライセンスの購入が必要です。 」
    となっているので注意してください。

    以下ソース



    /// talk japanese node

    #include <stdio.h>
    #include "AquesTalk2.h"
    #include <ros/ros.h>
    #include <std_msgs/String.h>

    // talk speed
    static int s_talk_speed = 100;

    /// call back for /talk
    void CommandCB(const std_msgs::String::ConstPtr& talk)
    {
      int   data_size;
      FILE *play_fd;

      // make wav data usign AquesTalk2
      unsigned char *wav_buff = AquesTalk2_Synthe_Roman(talk->data.c_str(), s_talk_speed, &data_size, NULL);

      if(wav_buff==0){
        ROS_ERROR("AquesTalk2_Synthe_Roman failed");
      }
      else
      {
        play_fd = popen("play -t wav -", "w");
      
        if (play_fd < 0)
        {
            ROS_ERROR("popen fail");
        }
        else
        {
          // write to play command stdin
          fwrite(wav_buff, 1, data_size, play_fd);
          // free the data buff
          AquesTalk2_FreeWave(wav_buff);
          pclose(play_fd);
        }
      }
    }

    int main(int argc, char **argv)
    {
      ros::init(argc, argv, "talk_node");
      ros::NodeHandle local_node("~");
      local_node.param<int>("talk_speed", s_talk_speed, 100);

      ros::NodeHandle node;
      ros::Subscriber sub = node.subscribe("talk", 10, &CommandCB);
      ros::spin();
      return 0;
    }

    2010年8月28日土曜日

    EusLispを試す

    ごぶさたです。

    今日はEusLispを試してみたので、どんな感じかデモを紹介します。
    (環境はUbuntu 10.04です。(OSX上のVirtualBox内の、です))
    EusLispっていうのは産総研(当時は電総研)で作られたロボット用言語です。

    日本で唯一PR2がある東大のJSK (情報システム工学研究室: Jouhou System Kougaku)が使っている言語で、ROSに対応(roseus)しています。

    以前からもEusLispは入手可能でしたが、インストールが取っ付きにくく、なかなか一般の人に知られることは少なかったです。

    また、EusLispは「戦争には使ってはいけない」という特殊なライセンスだったのですが、ROSのブログによるとBSDライセンスになったそうで、もっと自由に使うことができそうです。(EusLispのページなどにはライセンスについて記述がない?(古いライセンスのまま?)ライセンスについて分かる人教えてください。)

    1)インストール
    以下のページを参考にインストールします。
    非常に簡単です。

    http://sourceforge.net/apps/mediawiki/jskeus/index.php?title=Main_Page

    ~/src以下にインストールするとすると、

    $ sudo apt-get install subversion gcc g++ libjpeg62-dev libxext-dev libx11-dev libgl1-mesa-dev libglu1-mesa-dev libpq-dev libpng12-dev
    $ cd ~/src
    $ svn co -N https://jskeus.svn.sourceforge.net/svnroot/jskeus/trunk jskeus
    $ cd jskeus
    $ make

    そして、.bashrcに、
    source ~/src/jskeus/bashrc.eus
    を追加します。

    以上でインストールは完了です。

    2)デモ

    $ cd ~/src/jskeus/irteus
    $ irteusgl demo.l
    としてインタプリタを起動します。

    $ (test1)
    とすると、ヒューマノイドモデルが表示され、手先をのばしていくアニメーションが表示されます。足を固定して全身のIKをときながら顔を手先に向けるモーションです。
    インタプリタ上でリターンを押すと止まります。

    $ (test2)
    ほうきを地面にそって動かすモーションです。
    これもリターンで終了します。

    $ (test3)
    今度はハンドですね。把持物体とリンクの距離を計算しながらなじむようにグラスピングしているようです。

    $ (test4)

    最後はクランクをまわします。
    全身で重心位置を制御しながらクランクまわしです。

    サンプルもかなり面白いですね。個人的にはOpenRAVEより楽しそうに感じました。


    結構これだけでもいろいろできそうですね。
    ドキュメント/コメントが致命的になさ過ぎなのが残念です。

    2010年8月11日水曜日

    cturtleのgazeboを試す。

    さっそくcturtleのPR2のシミュレーションを試してみます。

    $ roslaunch pr2_gazebo pr2_empty_world.launch



    おー、テクスチャが張られて、色も実物っぽいです。
    かっちょいい!
    見た目重要ですね。

    $ rosrun  image_view image_view image:=/narrow_stereo_textured/left/image_color
    などとするとカメラ画像も取れていることが分かります。

    では、新機能を使って、遊んでみます。
    まず、BOXを手先にぶつけてみます。


    あれ?
    衝突しないですね。
    BOX以外のシリンダ、球ではちゃんと衝突しました。
    ↓あられもないPR2の姿。


    パラメータを見る限りシリンダもBOXも同じ設定なので、衝突しないのはバグでしょうか?
    ちょっと分かりません。

    2010年8月10日火曜日

    cturtleのインストール

    Ubuntuにcturtleをインストールします。

    以下のリンクにしたがいます。

    http://www.ros.org/wiki/cturtle/Installation/Ubuntu

    私はすでにaptでrosをインストールしていたので、

    $ sudo apt-get update
    $ sudo apt-get install ros-cturtle-pr2
    した後に、
    .bashrcの以下のように編集しました。

    #source /opt/ros/boxturtle/setup.sh
    source /opt/ros/cturtle/setup.sh

    以下のようにして動作確認してみましょう。
    $ source .bashrc
    $ roslaunch gazebo_worlds empty_world.launch

    おっと、以下のようなエラーが出てしまいました。


    Traceback (most recent call last):
      File "/opt/ros/cturtle/ros/bin/roscore", line 34, in <module>
        from ros import roslaunch
      File "/opt/ros/boxturtle/ros/core/roslib/src/ros/__init__.py", line 63, in __getattr__
        return __import__(name)
      File "/opt/ros/cturtle/ros/tools/roslaunch/src/roslaunch/__init__.py", line 43, in <module>
        from roslaunch.config import ROSLaunchConfig
      File "/opt/ros/cturtle/ros/tools/roslaunch/src/roslaunch/config.py", line 49, in <module>
        import roslaunch.loader
      File "/opt/ros/cturtle/ros/tools/roslaunch/src/roslaunch/loader.py", line 45, in <module>
        from roslib.names import make_global_ns, ns_join, PRIV_NAME, load_mappings, is_legal_name, canonicalize_name
    ImportError: cannot import name canonicalize_name

    $ roscore
    としても同じエラーです。

    $PYTHONPATHがboxturtle側が優先されていました。
    一旦ターミナルを落として、新しいshellでもう一度トライしたらできました。


    cturtleの目玉はgazeboだと思っていますが、
    だいぶドキュメント等も進化していますね。
    モデルを作成して、worldファイルに保存できるみたいです。

    時間ができたら、少しトライしてみます。