2011年7月13日水曜日

ARDroneとルンバを同時にPS3のコントローラで動かす

AR.Droneとルンバを1つのPS3のジョイパッドから同時にうごかしてみました。
ROSのPub/Subを利用した楽しい例だと思います。


前回紹介したardrone_brownノードと、昔作ったルンバ用のプログラムを組み合わせたら簡単にできました。
ルンバの掃除開始と同期してヘリが飛び立ったら面白いと思い、掃除機のモータ指令メッセージ(Bool型)をardroneのEmpty型へ変換して送信するノードを作りました。
これによりルンバへの速度指令と、掃除開始(離陸)、終了(着陸)が同時にAR.Droneに送られるようになります。

ノードとトピックは↓のような感じ。


メッセージ変換のコードは↓のような感じです。

#!/usr/bin/env python
import roslib
roslib.load_manifest('otl_msgconverter')
import rospy
from std_msgs.msg import Bool
from std_msgs.msg import Empty
class BoolMsg2EmpyMsg():
    """ convert bool msg to empy msg
    """
    def __init__(self, bool_topic, true_topic, false_topic):
        self._bool_topic = bool_topic
        self._true_topic = true_topic
        self._false_topic = false_topic
    def callback(self, bool_value):
        msg = Empty()
        if (bool_value.data):
            self._true_pub.publish(msg)
        else:
            self._false_pub.publish(msg)
    def init(self):
        self._true_pub = rospy.Publisher(self._true_topic, Empty)
        self._false_pub = rospy.Publisher(self._false_topic, Empty)
        self._sub = rospy.Subscriber(self._bool_topic, Bool, self.callback)
if __name__=='__main__':
    rospy.init_node('otl_bool2empty')
    obj = BoolMsg2EmpyMsg('input', 'true', 'false')
    obj.init()
    rospy.spin()
ヘリは迫力があっていいですね。
着陸も成功させたかった!

ARDroneをROSで動かす

ARDroneというヘリがあります。
3万弱でカメラ2つついていて、iPhoneで動かせちゃうすごいヘリです。
しかもSDKがついていてPCやiPhone, Android等で自由にプログラミングできます。

これがROSから簡単に使えるようになっているので紹介します。

http://code.google.com/p/brown-ros-pkg/wiki/ardrone_brown

前回紹介したbrown-ros-pkgです。
ただしまだaptでは入れられないのでソースからです。

【インストール】
$ svn checkout http://brown-ros-pkg.googlecode.com/svn/trunk/experimental/ardrone_brown
$ cd ardrone_brown
$ ./build_sdk.sh
$ rosmake
$ cmake .
$ make
(Makefileのcommit忘れかな?)

【実行】
$ rosrun ardrone_brown ardrone_driver

【離陸】

$ rostopic pub /ardrone/takeoff std_msgs/Empty

【着陸】

$ rostopic pub /ardrone/land std_msgs/Empty

あとは/cmd_velに速度を入力すれば思い通りに動きます。

【カメラ画像の表示】もできますよ。
$ rosrun image_view image_view image:=/ardrone/image_raw


ドキュメントにないけど、
$ rostopic pub /ardrone/togglecam std_msgs/Empty
すると、フロントカメラと、下向きかめらとフロントの合成、との切り替えができます。

という感じでいつものROSっぽく動かすことができます。

2011年7月11日月曜日

ROSリポジトリドメイン変更

Kenさんからメーリスに以下のようなメールがきていました。

要するに、Ubuntuユーザはaptラインにcode.ros.orgの代わりにpakcages.ros.org/ros/ubuntuを使ってね。ということ見たいです。
今はcode.ros.orgも使えるけど、
diamondbackの次のリリース(Electric)からはもう使えないからね。
ってことみたいです。

要チェックです。

For Diamondback, we switched our main debian package source to be
http://packages.ros.org/ros/ubuntu .  We made this shift due to load
issues.  We have been mirroring the old code.ros.org source, but this
mirroring is not in place for the upcoming Electric release.

In order to ensure that you will be able to receive the Electric
update properly, we recommend that you go ahead and migrate your
/etc/apt/sources.list.d/ros-latest.list file to use:

http://packages.ros.org/ros/ubuntu

instead of:

http://code.ros.org/packages/ros/ubuntu

2011年7月10日日曜日

brown-ros-pkgがapt-getできる

ブラウン大学のROSのリポジトリがbrown-ros-pkgです。
willow管理のリポジトリ以外はapt-getじゃなくてソースを持ってきてインストールするもの、
と思っていましたが、brown-ros-pkgはいくつかちゃんとリリースされて、
apt-getで入るようになっているんですね。

リリースされているのは

  • brown_drivers
  • brown_perception
  • brown_remotelab
の3つのスタックで、
それぞれ、
  • irobot_create_2_1 (ルンバドライバ)
  • gscam (gstreamerべーすのカメラドライバ)
  • rosbridge/pr2_keyboard_teleoperator/teleop_twist_keyboard
がパッケージとして入っています。

インストールするには

$ sudo apt-get install ros-diamondback-brown-drivers
とか、
$ sudo apt-get install ros-diamondback-brown-remotelab
とかすると入ります。
楽チン。

brown-perceptionは何故か見つかりませんでした。

$ sudo apt-get install ros-diamondback-otl-drivers
とかできる日がいつかくるのか!

ムネアツです。

2011年7月6日水曜日

Ubuntu 11.04 natty narwhalでROSのapt

いつのまにかUbuntu11.04のROSパッケージがきていましたね。
これでソースからコンパイルしないですみます。
やっぱりバイナリは楽です。

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


/etc/apt/sources.list.d/ros-latest.list
に
deb http://packages.ros.org/ros/ubuntu natty main
と書いて

$ sudo apt-get update
$ sudo apt-get install ros-diamondback-desktop-full



でOKですね。
いつのまにやらドメインが変わっていますね。
.bashrcの編集も忘れずに。

2011年6月14日火曜日

プライベートなパッケージだけにroscdするotlcdを作ったよ

Minecraftがこのブログのトップにあると色々不安なので更新します。

私は一応趣味でrosのパッケージを作ってみています。
大体パッケージ名はotl_hogehogeという名前になっています。
rosはwikiのドキュメントとかがいきなりパッケージ名なので、これが他の人とかぶると困るからです。

普段、自分が作ったパッケージに移動(cd)するには

$ roscd otl_
と入力して、Tabを押してそこから目的のパッケージを探しています。

これをもっと簡単にするotlcdを作ります。

$ otlcd
と入力して、Tabを押すと
$ otlcd otl_
と展開されて、もう一度Tabを押すと候補("otl_"で始まるパッケージ)一覧が表示される、という状態にしたいです。


というわけでroscdを参考に、というか、ちょっとだけいじって作ってみました。
ソースは以下のような感じ。

function _otlcomplete_sub_dir {
    local arg opts rosvals
    COMPREPLY=()
    arg="${COMP_WORDS[COMP_CWORD]}"
    _ros_decode_path ${arg}
    if [[ -z ${rosvals[2]} ]]; then
        opts=`_ros_list_locations | grep ^${OTLCD_PREFIX}`        IFS=$'\n'
        COMPREPLY=($(compgen -W "${opts}" -S / -- ${rosvals[0]}))
        unset IFS
    else
        if [ -e ${rosvals[1]}${rosvals[2]} ]; then
          opts=`find -H ${rosvals[1]}${rosvals[2]} -maxdepth 1 -mindepth 1 -type d
 ! -regex ".*/[.].*" -print0 | tr '\000' '\n' | sed -e "s/.*\/\(.*\)/\1\//g"`
        else
          opts=''
        fi
        IFS=$'\n'
        COMPREPLY=($(compgen -P ${rosvals[0]}${rosvals[2]} -W "${opts}" -- ${rosvals[3]}))
        unset IFS
    fi
}
alias otlcd=roscd
complete -F "_otlcomplete_sub_dir" -o "nospace" "otlcd"
これをotl_bashパッケージにotlbashというファイル名で作りました。
赤いところをいじってあとはrosbashのコピペです。
(やっつけ感がすごくてすみませんがsubversionにいれておきました)


.bashrcでsetup.bashを読み込んだあとで以下の記述を追加すると使えます。

export OTLCD_PREFIX="otl_"
source `rospack find otl_bash`/otlbash
OTLCD_PREFIXに好きな文字列を入れられるので、もし私と同じようなprefixをパッケージ名に付けている人はいかがでしょうか?

2011年6月13日月曜日

Minecraft

こんばんわ。おひさしぶりです。

最近本当にネタがありませんので
私が最近はまっているゲームを紹介します。

マインクラフトです。
http://www.minecraft.net/
15ユーロくらいします。↓は公式PV。


FPS視点で、素材を集めて、道具を作り、またその道具で素材を集める。
集めた素材で家を作ったり、トロッコを走らせたりさせます。

ロボットとか作っちゃう男の子にはたまらないゲームです。
マルチプレイにも対応しており、複数人で協力して巨大建造物を作ったりもできます。


あとは、このゲームをプレイしている人の作る動画が面白い。


Classic版は無料なのでWeb上で試してみたらいかがでしょうか。
http://www.minecraft.net/play.jsp

もちろん私は買いました。
意外とまだ長時間やっていません。いったんやりだすと止まらないので自重しております。

以上完全に雑談でした。