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に保存、までやってくれます。

    楽です。