"SSL-Vision"のインストール
RoboCup SSLの画像処理サーバである、SSL-Visionをインストールします。
以下のページを参考にインストールを進めていきます
まずは必要なものをインストール。
sudo apt-get install subversion g++ libqt4-dev libeigen2-dev protobuf-compiler libprotobuf-dev libdc1394-22 libdc1394-22-dev cmake libjpeg-dev libpng12-dev
インストールが終わったら、本体をダウンロードします。
cd ~/Document/SSL_develop/
svn checkout http://ssl-vision.googlecode.com/svn/trunk/ ssl-vision-read-only
ダウンロードできたら、make
しましょう。
cd ssl-vision-read-only
make
これにてインストール完了。
起動は、bin/vision で。
インストールはできたんですが、このPCにはカメラが繋げないので、あんまり意味はないです…
RoboCup SSL Simulator "grSim"のインストール
これからRoboCupSSLロボットの開発を始めます。
自分はAI担当になったので、がんばってAI開発します。
まずは、開発環境づくりからというわけで、 オープンソースのシミュレータ"grSim"のインストールを行います。
なお、環境は Ubuntu 14.04LTS です。
github上の INSTALL.md を参考にして、インストールを行います。
sudo apt-get install build-essential cmake libqt4-dev libgl1-mesa-dev libglu1-mesa-dev libprotobuf-dev libode-dev #[In a temporary directory] cd /tmp wget http://vartypes.googlecode.com/files/vartypes-0.7.tar.gz tar xfz vartypes-0.7.tar.gz cd vartypes-0.7 mkdir build && cd build cmake .. make sudo make install #Download grSim repository cd ~/Document mkdir SSL_develop cd SSL_develop git clone https://github.com/mani-monaj/grSim.git #[In grSim folder] cd grSim mkdir build cd build cmake .. make
たぶん、最後のgrSimのmakeでコケます。 google protocol buffer(以下protobuf)が無い!って怒られます。
dpkg -L libprotobuf-dev
をしてみたところ、ROSのインストール時にprotobufがすでにインストールされているみたい。ですが、どうやらおかしなパスに入っている模様。
面倒なので、別のところに新しくprotobufを入れます。 ROSのインストール時に入ったものはROSから使われているみたいなので、それは置いておいて新しく入れます。 競合しそうで怖いですが…
protobufの導入は、以下のサイトを参考に。
Protocol Buffersの使い方まとめ - hrendohの日記
まずは、以下のページからprotobufをダウンロード。今回はVer 2.5.0を選択。 Downloads - protobuf - Protocol Buffers - Google's data interchange format - Google Project Hosting
ダウンロードして解凍したら、以下のコマンドを実行します。
cd protobuf-2.5.0 ./configure make make check sudo make install
全部のコマンドが問題なく通ったら、うまくインストールできているか確認します。
/usr/local/bin/protoc --version
libprotoc 2.5.0
と出ればインストール成功。
さて、grSimのmakeに再チャレンジ。
cd ~/Document/SSL_develop/grSim/build
make
うまくいきましたー!
最後に、grSim/bin/grSimを実行して、ほんとに動くかどうかテスト。
動いたっ!
座標変換パッケージ "tf"の使い方
ROSの座標変換ライブラリ、tfについて勉強しています。ひとまずtutorial(Python)をひと通り終えました。
今までのところでわかったことを記述しておきます。
tfでは、様々な座標軸を定義することで、定義された座標軸から見た別の座標軸の位置を簡単に求めることができます。 どのくらい簡単かというと、ベースとなる座標系と、その座標系上で表したい別の座標軸、この2つの座標系の名前を指定するだけです。三角関数とか同次変換行列とか使う必要ありません。シンジラレナーイ
利用の流れとしては、 座標系の登録(Broadcaster) -> 座標系の変換(Listener) という順になります。
座標系の登録(Broadcaster)
座標変換を行うために、まずは座標系の登録を行います。 参考のソースコードをチュートリアルページから引っ張ってきました。
ja/tf/Tutorials/Writing a tf broadcaster (Python) - ROS Wiki
#!/usr/bin/env python import roslib roslib.load_manifest('learning_tf') import rospy import tf import turtlesim.msg def handle_turtle_pose(msg, turtlename): br = tf.TransformBroadcaster() br.sendTransform((msg.x, msg.y, 0), tf.transformations.quaternion_from_euler(0, 0, msg.theta), rospy.Time.now(), turtlename, "world") if __name__ == '__main__': rospy.init_node('turtle_tf_broadcaster') turtlename = rospy.get_param('~turtle') rospy.Subscriber('/%s/pose' % turtlename, turtlesim.msg.Pose, handle_turtle_pose, turtlename) rospy.spin()
この例は、以下のような流れで座標登録を行っています。
turtle*/pose
トピックをSubscribeし、"world"座標系から見た"turtle*"の座標(Pose型)を取得- 座標系をtfへ登録
turtle*/pose
トピックが更新される度、座標系を更新登録
実際に2の座標系登録を行っているのは、以下の部分になります。
br.sendTransform((msg.x, msg.y, 0), tf.transformations.quaternion_from_euler(0, 0, msg.theta), rospy.Time.now(), turtlename, "world")
TransformBroadcaster.sendTransform()を用いて座標の登録を行います。
tf (Python) — tf 0.1.0 documentation #TransformBroadcaster.sendTransform
sendTransform()メソッドは、5つの引数を取ります。
- 第1引数は、ベースとなる座標系から見た、登録対象の直交座標です。x,y,zをまとめたタプルとして与えます。
- 第2引数は、ベースとなる座標系から見た、登録対象の回転です。これは、クオータニオンで与えます。クオータニオンについてはよく理解していませんが、
quaterninon_from_euler()
で、オイラー角からクオータニオンへの変換が行えるようです。こちらも、タプルとして与えます。 - 第3引数は、タイムスタンプです。基本的には現在時刻を与えます。(tfは、内部で座標の時間推移を保存しているようです。)
- 第4引数は、登録したい座標系の、任意の名前を指定します。
- 第5引数は、ベースとなる座標系の名前を指定します。
座標系の変換(Listener)
登録した座標系を用いて、2つの座標系間での変換を行います。 同じように、参考のソースコードをチュートリアルページから引っ張ってきました。
ja/tf/Tutorials/Writing a tf listener (Python) - ROS Wiki
#!/usr/bin/env python import roslib roslib.load_manifest('learning_tf') import rospy import math import tf import geometry_msgs.msg import turtlesim.srv if __name__ == '__main__': rospy.init_node('tf_turtle') listener = tf.TransformListener() rospy.wait_for_service('spawn') spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn) spawner(4, 2, 0, 'turtle2') turtle_vel = rospy.Publisher('turtle2/cmd_vel', geometry_msgs.msg.Twist) rate = rospy.Rate(10.0) while not rospy.is_shutdown(): try: (trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0)) except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException): continue angular = 4 * math.atan2(trans[1], trans[0]) linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2) cmd = geometry_msgs.msg.Twist() cmd.linear.x = linear cmd.angular.z = angular turtle_vel.publish(cmd) rate.sleep()
座標変換を行っているのは、以下の部分です。
try: (trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0)) except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException): continue
例外構文がありますが、これは座標変換が失敗したときにその後の処理をしないようにするためのものです。 座標変換自体は、
(trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0))
この一行です。lookupTransform()メソッドを用います。
tf (Python) — tf 0.1.0 documentation #Transformer.lookuptransform
lookupTransform()メソッドは、3つの引数を取ります。
- 第1引数は、変換のベースとなる座標系の名前を指定します。
- 第2引数は、変換したい対象の座標系の名前を指定します。
- 第3引数は、変換したい時間を指定します。基本的には、
rospy.Time(0)
で良いようですが、過去のデータを元に座標変換したいときはきちんと指定しないとまずいみたいです。
また、戻り値として、変換した座標データが戻ってきます。直交座標をまとめたタプル(x, y, z)と、回転をまとめたタプル(x, y, z, w)(クオータニオン)が戻ってきます。
例外は、例にあげた3つが返ってくるようです。詳しくはドキュメントを見てください。
気になったこと
座標系が登録されてから、実際にそれが座標変換に使えるようになるまで、数msの時間がかかるようです。 座標変換に使えるようになるまで待機するメソッドもあるのですが、そもそも数msの遅延があるのが若干不安です…
とりあえず、今わかっている情報はこんなところです。
チュートリアルをひと通りやった感じだと、かなーり便利そう。 今後わかった情報があれば随時更新していこうと思います。
Ubuntu14.04にフリーDJソフト「Mixxx」をインストール
今回は技術的な内容とはちょっと離れます。
僕は趣味でDJをやっています。PCを使ってDJをするPCDJです。
今回は、Linux用にも配布されているフリーの高機能DJソフト「Mixxx」を、Ubuntu14.04にインストールしてみたいと思います。
Ubuntuへの導入手順は、以下のページの下の方にあります。
Mixxx - Download the Best Free MP3 DJ Mixing Software
Download Mixxx 1.11.0 for Ubuntu 10.04 (Lucid) through 13.04 (Raring):
14.04はサポートされていないようですが、うまく行くでしょうか… とりあえず、下記を実行。
sudo add-apt-repository ppa:mixxx/mixxx sudo apt-get update sudo apt-get install mixxx libportaudio2
リポジトリの登録の際に、信用できる鍵がありません?的なエラーが出ましたが、特に問題なく終わったようです。
起動してみます。
起動しました!
一旦終了して、DJコントローラ(Numark Mix Track Pro)を接続してみます。 そしてもう一度起動して、設定画面を開くと… (設定画面は、「オプション」->「設定」からいけます)
認識されましたー!やった!
というわけで、「Mixxx」のインストールに成功しました。
ソフトの使い方については、下記のページが参考になると思います。
気が向いたら自分も使い方についての記事を書くかもしれません。
それでは!
座標変換パッケージ "tf"のお勉強
僕がROSを使おうと思った理由の一つに、このパッケージの存在があります。 詳しい使い方はまだわかりませんが、とにかく「あの」面倒くさい座標変換が楽チンにできるそうです。 これからサッカーロボットを開発する予定なんですが、サッカーロボットも座標変換使う機会がかなり多いので、使えると重宝しそうです。
というわけで、何はともあれチュートリアルから。
ひとまず、「tfの導入」と、「tfのbroadcasterを書く(Python)」をさらっとやってみましたが、まだ正体がつかめていません。
とりあえず分かったことは、tfにはbroadcasterというのと、listenerというのがあって、 この2つをうまく使うことで座標変換ができるらしい、ということ。
あと、tfでの座標変換も、ある程度の周期(60Hzぐらい?)で行われているということ。 これは、tfに座標変換をお願いする周期で変わってきそうな気がする。
日本語のブログで、tfについて解説してくださっているところが幾つかあるので、そのあたりも参考にしながらお勉強します。
とりあえずは、しばらく触って感覚を掴んでみるところからかな。
ROSのインストール
これからロボット開発を行うにあたって用いる、ROS(Robot Operating System)のインストールを行います。
ROSについては、詳しくはググってください。とりあえず、ロボットのソフトウェアを簡単かつ確実に作るためのミドルウェアです。 ROSには様々なディストリビューションがありますが、今回は最新の Indigo を用いたいと思います。
上記のページにしたがってインストールしていきます。 推奨される通りにインストールしますが、1カ所だけ変更点があります。
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc
これを、
echo "source /opt/ros/indigo/setup.zsh" >> ~/.zshrc source ~/.zshrc
こうする。 zshを使っているので、bashの部分をすべてzshと置き換えておきましょう。
rosversion -d
で "indigo"と表示され、
export | grep ROS
で、ROSの環境変数ぽいのがずらずら出てきていたらインストール成功です。
Ubuntu14.04 LTS を入れた直後にすること(1)
Ubuntu 14.04 LTS の個人的な初期設定についてまとめておきます。 もしかしたら続くかも。
フォルダの英語化
Ubuntuを日本語設定でインストールすると、ホームフォルダ内のフォルダ名が日本語になっています。 CUIでいろいろいじるときに非常に面倒なので、英語に設定します。
$ LANG=C xdg-user-dirs-gtk-update
zsh, oh-my-zsh, byobuのインストール
使いづらいbashとはすぐお別れしてしまいましょう。この記事を参考に。
$ sudo apt-get install zsh $ which zsh $ chsh
zshのインストールが終わったら、gitを入れて、oh-my-zshを入れましょう。
$ sudo apt-get install git $ wget --no-check-certificate http://install.ohmyz.sh -O - | sh
最後にbyobu。
$ sudo apt-get install byobu