ご協力お願いします

1,500 views
Skip to first unread message

山本マサ

unread,
Sep 27, 2013, 10:42:13 AM9/27/13
to ros-jap...@googlegroups.com
こんにちは。

初めてグループに参加させてもらった山本というものです。

今、僕達は学校の卒業研究でROSを使用したシステムを作ろうとしており、ROSについて勉強中のところ、
OTLこと小倉さんのブログを拝見し、このグループに参加させていただきました。

さて、本題なのですが、今僕達の研究でROSが滞っています。
というのも、僕はまだROSに触れて2か月程度であり、公式のチュートリアルや小倉さんのブログを
参考にさせてもらっているのですが、いまだROSに使い方がうまくわかりません。
そこで皆さんの知恵をお貸ししていただきたく、こうして投稿させていただきました。

僕たちの研究では、tfとレーザスキャナ(UTM-30LX)を使ってロボットを誘導しようとしています。
tfのチュートリアルのような、carrotをturtleが追尾する、といったように目標地点までロボットを
誘導したいのですが、スキャナからのトピックでturtleのようなフレ―ムを作成するにはどのように
すればよいでしょうか。
機体には直径2~3センチの棒を立てており、この棒の位置で、ロボットの位置をレーザスキャナで認識し、
フレ―ムを作成してtfの座標を取得したいです。
ちなみに小倉さんのブログでは、tfまでの内容を理解しています。

私事で大変申し訳ないのですが、皆様のご助力をお願いします。

Takashi Ogura

unread,
Sep 27, 2013, 9:18:45 PM9/27/13
to ros-jap...@googlegroups.com
こんにちは。

質問ありがとうございます。

もうすこし具体的な情報があるとたすかります。

やりたいことは
「部屋に固定されたレーザーでロボット位置を認識する」
ということであっていますでしょうか?

レーザーはhokuyo_nodeか何かを使っているのでしょうか?

レーザーで棒を認識する部分はできていますか?
もしこの認識を簡単にやりたい、という話であれば、
が私の知る限り一番近いノードになると思います。
これはPointCloudをsubscribeしているので、
↓あたりを読んで、LaserをPointCloudに変換して、
follower.cppのコードを参考にロボット位置の抽出プログラムを書いてみるのがよいかと。

そこが出来ているなら、
tf::TransformBroadcasterを使えば出来そうですね。

他に何かご存知の方いればお助け願います。


2013/9/27 山本マサ <yamma...@yahoo.co.jp>

--
このメールは Google グループのグループ「ROS JAPAN User's Group」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、ros-japan-use...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
/*************************
Takashi Ogura (小倉 崇)

t.o...@gmail.com
http://youtube.com/ogutti
twitter: @OTL
*************************/

山本マサ

unread,
Sep 28, 2013, 10:12:43 AM9/28/13
to ros-jap...@googlegroups.com
返信ありがとうございます。
学校では資料や教えてくれる人がいなかったので助かります。

研究の具体的な内容ですが、僕たちは3機の飛行ロボットを陣形を保ったまま飛ばそうとしています。
陣形は正三角形で、後方の1機にレーザスキャナを取り付け、前方の2機には棒を立てて、
取得した位置情報からフィードバックし陣形を維持します。
レーザーのノードはhokuyo_nodeを使う予定です。

少々画質が悪いかもしれませんが、添付ファイルにやりたいことのイメージ図を載せておきました。
tfとrvizを参考に書いてみたのですが、こんな感じにロボットの位置情報をスキャナで読み取って
robot1,2フレ―ムを作成したいです。turtlesimのようにx,y座標で取得したいのですが可能でしょうか。

参考のページやサンプルコードを記載していただき、ありがとうございます。
しかし、お恥ずかしながら僕自身の知識不足のあり、コードの解読にも一苦労しております。
(C言語は以前にもかじっていたのですが、C++は今回が初めてです)
ROSを使えるようになるには、ヘッダーファイルの中身を見て、クラスやオブジェクトをすべて見て、
理解しておく必要があるのでしょうか。
おすすめのやり方などがあれば、ご意見お願いします。
20130928140005.jpg

Takashi Ogura

unread,
Sep 29, 2013, 6:43:22 PM9/29/13
to ros-jap...@googlegroups.com
ROSは、「部品を組み合わせればなんでも出来る」というものではありません。
「すでに誰かがやったことあるものは組み合わせて、誰もやったことない付加価値の高い研究に集中しよう」
というツールです。

で、山本さんのレーザーでロボットを検出する部分は(もしかしたらあるかもしれませんが)世界で誰もやってない
部分にあたるので、そこは自分で書かないといけません。
(すでにそういう部品がありそうか、質問するのはよいと思います。)

また、ROSのモジュールを自分で書く上ではPythonかC++の基本的な知識は必須です。

なので、がんばって、既存にない部分は書きましょう。
やろうとしていることは正しいと思います。

で、ROSの部分で分からないところがあれば再度質問ください。
C++やロボティクス、認識、数学の質問までここでやるわけにはいかないので。



2013/9/28 山本マサ <yamma...@yahoo.co.jp>

--
このメールは Google グループのグループ「ROS JAPAN User's Group」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、ros-japan-use...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

山本マサ

unread,
Oct 2, 2013, 10:25:53 AM10/2/13
to ros-jap...@googlegroups.com
返信が遅れてしまい申し訳ありません。
やはりc++については地道に理解するしかありませんね...

小倉さんから紹介して頂いたサンプルコードや意見も参考に、自分なりに
ROSのチュートリアルを調べてみました。いくつか使えそうなコードがあったので
組み合わせて何とか完成させることができそうです。
研究中にまたいくつか不明点が出てくると思うので、その際は
またご質問させていただきます。

貴重なご意見ありがとうございました。

Takashi Ogura

unread,
Oct 2, 2013, 10:58:00 AM10/2/13
to ros-jap...@googlegroups.com
がんばってください~!

ロボット一般について相談する場所があるといいんですけどね。
このメーリスでもいいかもですが。。。。

2chもロボットの人はあまりやってないし、なかなか気軽に相談出来る場所がないですね。




2013/10/2 山本マサ <yamma...@yahoo.co.jp>

--
このメールは Google グループのグループ「ROS JAPAN User's Group」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、ros-japan-use...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

山本マサ

unread,
Oct 16, 2013, 5:09:24 AM10/16/13
to ros-jap...@googlegroups.com
お久しぶりです。
研究や文化祭が重なり返信が送れてしまいました。
確かに工学系の人たちの話し合い等の場はあまり聞きませんね。
まだ高専生なのでそういった事情にはあまり詳しくありませんが…
再びで申し訳ありませんが、ROSについて質問があります。

あれからレーザスキャナの/scanトピックを読み取ってメッセージを配信するプログラムを書いてみました。
ROSチュートリアルの始めのサンプルにあるlistener.cppを参考に、コールバック関数内にメッセージを配信する
コードを入れてみたのですが、実行させて見たところトピックが配信されていませんでした。
実際に書いたプログラムを載せると長くなるので、似たような動作をするプログラムを書いてみました。

#include "ros/ros.h"
#include "std_msgs/Float64.h"
#include "std_msgs/String.h"
#include <sensor_msgs/LaserScan.h>

#include <sstream>
int count= 0;
void scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan_msg)
{
    printf("ok\n");
    ros::NodeHandle n;
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
    std_msgs::String msg;
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();
    chatter_pub.publish(msg);
    ros::spinOnce();

}
int main(int argc, char** argv)
{
    ros::init(argc, argv, "sample2");   
    ros::NodeHandle n;               
    ros::Subscriber scan_sub = n.subscribe("scan", 1000, scanCallback);
    ros::spin();
}

/scanトピックが更新される度にメッセージが配信されるはずなんですが、実行してみても
メッセージが配信されません。コールバック関数内のprintfは実行されているので、その後の
配信設定が間違っていると思うのですが…
試しにコールバック内のros::spinOnce()をros::spin()に変えてみたところ、
メッセージは配信されるようになったのですが、時間が立つと Segmentation fault と
出され、コアダンプしてしまいます。
コールバック関数内でトピックを配信するにはどうしたらいいでしょうか?

Isaac Isao Saito

unread,
Oct 17, 2013, 6:02:57 AM10/17/13
to ros-jap...@googlegroups.com
山本さん,

コードを実行してませんし色々間違っていたらすみませんが,

spinOnce() は single thread 用です [1].ということで (正確な挙動は知りませんが),scanCallback
の最後に spinOnce() を呼ぶと次の scanCallback がすぐに開始され,前の scanCallback
を上書きのような形になることがあるのかな?と思いました.試しに printf を spinOnce
の直前にしたらこれも実行されたりされなかったりしませんか?

あとそもそも spin*() は callback を起動するためのものなので,送られているコード例の callback の中では不要な気がします.

spin() を二箇所で呼ぶのは上記理由により明らかにまずそうですね.

解法の案としては,spin* を callback で呼ばないことと,(プロセスを複数に分ける必要が特に無ければ) [2] のように
NodeHandle を共有してはどうでしょう.

[1] http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning#Single-threaded_Spinning
[2] http://answers.ros.org/question/45867/publisher-and-subscriber-in-single-node/?answer=45891#post-id-45891

--
Isao Isaac Saito


2013/10/16 山本マサ <yamma...@yahoo.co.jp>:

垣内

unread,
Oct 17, 2013, 7:12:45 AM10/17/13
to ros-jap...@googlegroups.com, 13...@lateeye.net
そもそもの原因としては、
コールバック関数の中でchatter_pubを作っていることが原因ですね。
二つ問題があって、
publisherを作った直後にpublishしようとしてもpublishされないことがあります。
subscriberとつながっていることを確認してから送る必要があります。
(通常は一秒未満のwaitなどで代用していたりします)

もうひとつは、
callback関数を抜けるとpublisherオブジェクトが回収されてしまうことです。
publishが終わる前にpublisherオブジェクトが回収されるとpublishされないことになります。


解決策としては、publisherオブジェクトをグローバル変数にして、
main関数内のspinの前でadvertiseすればいいと思います。

このとき issacさんがおっしゃるように、callback関数内のspinonceは不要です。

2013年10月17日木曜日 19時02分57秒 UTC+9 Isaac Isao Saito:
> このグループから退会し、メールの受信を停止するには、ros-japan-users+unsubscribe@googlegroups.com

山本マサ

unread,
Oct 18, 2013, 3:52:06 AM10/18/13
to ros-jap...@googlegroups.com, 13...@lateeye.net
皆さん、ご指摘ありがとうございます。

いただいたアドバイスを元にプログラムを修正したところ、うまく動作することができました。
やはりコールバック関数内にros::spin()を入れていたのが原因のようです。
チュートリアルを見てもspinとspinOnceの使い方の違いがいまいち分からなかったので
とても助かりました。
publisherに関しても、垣内さんのおっしゃった通り、グローバル変数を用意して修正し、
コアダンプすること無く配信する事が出来ました。

皆さんのおかげで問題を解決する事が出来ました。
ご協力ありがとうございました。
Reply all
Reply to author
Forward
0 new messages