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より楽しそうに感じました。


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