モデルの自動操縦について - #21 by RELUoA_Hiroto - Japanese (日本語) - Choreonoid Discourse

# モデルの自動操縦について

Japanese (日本語)

RELUoA_Hiroto
December 2, 2021, 9:13am

1

こんばんは。
いつもお世話になっております。
研究の一環で、choreonoidを使用させて頂いております。

ロボットに予め動作命令を与えておき、その命令どうりにロボットを自動操作したいと考えています。
これを実現させるには、どのような方法がございますでしょうか。
プラグインを使用すればよろしいでしょうか。

また、私はROS版choreonoidを使用しています。
ご存知の通り、これはソースコードから自前でインストールしたものではありません。
この場合、プラグインを作成してコンパイルするには、どのような順序をたどればよろしいのでしょうか。HelloWorldPluginの説明を読みましたが、よくわかりません。
現在、HelloWorldPluginのコンパイルがうまく行かずに困っている状況です。
エラーの写真を添付いたします。

お手数をおかけいたしますが、対応よろしくお願いします。

Screenshot from 2021-12-02 17-21-091848×1053 168 KB

Yuki_Onishi
December 2, 2021, 9:24am

2

下記ページ，catkin config --cmake-argsの引数に-DBUILD_HAIRO_WORLD_PLUGIN=ONを追加してからcatkin buildを実行してください．
https://choreonoid.org/ja/manuals/latest/ros/build-choreonoid.html#cmake

suzuki.kenta38
December 2, 2021, 11:33pm

3

鈴木＠JAEAです。

HelloWorldPluginが格納されているchoreonoid/sample/tutorial以下は、ビルドの対象に入っていないので、ビルドに含めたい場合は、「HelloWorldPlugin」をディレクトリごとchoreonoid/ext以下に移動してから、catkin buildしてください。

なお、HelloWorldPlugin自体はビルドオプションが設定されていないので、 catkin config --cmake-args の引数でプラグインを指定する必要ありません。

もし、ビルドされたいプラグインが「HelloWorldPlugin」ではなく、我々が開発している「HAIROWorldPlugin」の場合は、Onishi様ご提示の手順でビルドできます。

RELUoA_Hiroto
December 3, 2021, 5:01am

4

@suzuki.kenta38 @Yuki_Onishi
返信ありがとうございます。
ディレクトリを移動させることで、catkin buildはうまくいきました。

ROS版のchoreonoidの場合、make並びにmake installは必要なのでしょうか。
ちなみに、makeとmake installをすると、エラーが出てしまいます。
写真はtutorial以下のディレクトリになっていますが、先程choreonoid/ext/HelloWorldPluginでやってみても同じ結果になってしまいました。

Screenshot from 2021-12-02 17-21-091848×1053 168 KB

Yuki_Onishi
December 4, 2021, 6:20pm

5

すみません，プラグインの名前を見間違えておりました．
鈴木様，補足ありがとうございます．

ROS版のchoreonoidの場合、make並びにmake installは必要なのでしょうか。

catkin buildが両者を実行していることとおよそ等価ですので，不要です．
ただし，厳密には異なるため，「Choreonoid本体とまとめてビルドする」方法をご利用いただければと思います．

Yuki_Onishi
December 4, 2021, 6:23pm

6

ロボットに予め動作命令を与えておき、その命令どうりにロボットを自動操作したいと考えています。
これを実現させるには、どのような方法がございますでしょうか。
プラグインを使用すればよろしいでしょうか。

元の質問への回答ですが，予め動作命令を与えるだけであればSimpleControllerを用いる実装が簡潔かと思われます．

本当に上記のみなら追加のプラグインもROSとの連携機能も不要と思いますが，ROS版を使っているということは何か他にもやりたいことがあるのではないでしょうか？

nakaoka
December 8, 2021, 3:01pm

9

「ROS版Tankチュートリアル」というチュートリアルが以下にありますので、まずこちらを試されてはいかがでしょうか。

https://choreonoid.org/ja/documents/latest/ros/tank-tutorial/index.html

更に基本となるチュートリアルとして「Tankチュートリアル」もありますので、そちらもご参照ください。

https://choreonoid.org/ja/documents/latest/simulation/tank-tutorial/index.html

これらのチュートリアルでSimpleControllerのビルドの仕方も説明しています。

RELUoA_Hiroto
December 11, 2021, 9:20am

10

@Yuki_Onishi @suzuki.kenta38 @nakaoka
回答ありがとうございます。

SimpleControllerの実装はできるようになったのですが、研究の都合上プラグインを使う必要性が出てきてしまいました。
オリジナルのプラグインをchoreonoidソースファイルのextディレクトリ以下に入れたのですが、以下のバイナリの設定はどうやればいいのでしょうか。

プラグインのバイナリを共有ライブラリもしくはダイナミックライブラリとしてビルドすること
バイナリの名前は、Linuxであれば “libCnoidXXXPlugin.so” (XXXのところにプラグイン名を入れる）、Windowsであれば “CnoidXXXPlugin.dll” とすること
バイナリをChoreonoidのプラグインフォルダに格納すること。プラグインフォルダは、Choreonoidインストール先の “lib/choreonoid-x.x/” 以下になる（x.xはバージョン番号に対応)

また、プラグインのビルド、インストールもうまく行かず困っています。
catkin buildでビルドを行っても、プラグインディレクトリ(catkin_ws/build/choreonoid/lib/choreonoid-1.8)にバイナリファイルが生成されません。
何が原因だと思いますか。

nakaoka
December 11, 2021, 11:59am

11

ご質問の件については、公式マニュアルの「プラグイン開発ガイド」の説明に従ってプラグインを作成することで実現できるはずですので、まずはそちらをご参照いただければと思います。

https://choreonoid.org/ja/documents/latest/plugin-development/index.html

RELUoA_Hiroto
December 13, 2021, 10:12am

13

対応ありがとうございます。プラグインの方は無事にビルドすることができました。
すみません、choreonoidを使用していたときに、間違ってプラグインの自動読み取り機能を解除してしまって、その状態でchoreonoidを閉じてしまいました。
ですので、rosrun choreonoid_ros choreonoidを実行してもROS pluginが無いということで、起動できなくなってしまいました。
この場合、どうすれば良いですか？

RELUoA_Hiroto
December 13, 2021, 10:32am

14

重ね重ね本当に申し訳ございません。
もう一つだけ質問させてください。

現在、ボタンをクリックすることでロボットモデルを左右に動かすプラグインを作成しています。
ですが、segmentation_faultが出てしまい、プラグインの機能が実現できません。
ルートリンクからロボットモデルを入手しようとしているのですが、どうやらそこで問題が起きているようです。
なにか解決策などございますでしょうか。Processing: RampPlugin.cpp…

virtual bool initialize() override
{
auto items = RootItem::instance()->checkedItems<BodyItem>();
//ItemList<BodyItem> items = ItemTreeView::instance()->selectedItems<BodyItem>();
spider = items.find("AizuSpider");
auto bar = new ToolBar("Ramp");
auto button1 = bar->addButton("MoveLeft");
button1->sigClicked().connect([&](){ MoveButton(0.2); });
auto button2 = bar->addButton("MoveRight");
button2->sigClicked().connect([&](){ MoveButton(-0.2); });
bar->setVisibleByDefault(true);
addToolBar(bar);
return true;
}

void MoveButton(double dq)
{
auto spiderBody = spider->body();
auto spiderBodyRoot = spiderBody->rootLink();
Position t = spiderBodyRoot->position();
Vector3d p = t.translation();
Vector3d c(0.0, dq, 0.0);
p += c;
spiderBodyRoot->setTranslation(p);
spider->notifyKinematicStateChange(true);
}

GDBでCoreを読み込んだ結果がこちらです。

Screenshot from 2021-12-13 14-03-161920×1080 449 KB

testSloops.cnoid (11.8 KB)

Yuki_Onishi
December 13, 2021, 4:18pm

15

Choreonoidを単独で立ち上げて有効化してください．
単独立ち上げはROS環境であれば単にchoreonoidをターミナルで打つだけで出るはずです．

Yuki_Onishi
December 13, 2021, 4:31pm

16

デバッグモードでビルドしていますか？
基本的にデバッグモードでビルドしgdbをご利用ならば行単位で原因箇所の特定が可能ですので，まずはお手元で改めてご精査ください．

僭越ながら苦言を申し上げると，お忙しいためこちらでご質問されているとのことですが，回答者含めこの場でお忙しくない方は基本的にいらっしゃらないと思います．本コミュニティを有効に活用いただくのは結構ですが，せめて公式ドキュメントの目次を一通りご覧いただき，またGoogle検索等ご自身や研究室である程度のご検討をなされてから，こちらで質問いただくのがよろしいのではないかと存じます．

RELUoA_Hiroto
December 14, 2021, 12:15am

17

対応ありがとうございます。
なにか不明な点があったときは、必ずドキュメントを読んだりGoogle検索をかけてはいます。しかし、地に足がついていなかったことは事実です。
そして、この度は大変失礼な発言をしてしまったことに対して、お詫びいたします。
申し訳ございませんでした。
猛省しております。

今後はこのようなことがないように、きちんと私たちの方で検討を行ってから、ご質問させていただきます。

これからも何卒よろしくお願い申し上げます。

nakaoka
December 14, 2021, 1:22am

18

RELUoA_Hiroto:

すみません、choreonoidを使用していたときに、間違ってプラグインの自動読み取り機能を解除してしまって、その状態でchoreonoidを閉じてしまいました。

これはメインメニューの「ファイル」ー「プラグイン」ー「起動時のプラグイン読み込み」のチェックのことですよね。すみません、こちらは主にデバッグ用に付けていた機能なのですが、チェックを外すとそれ以降プラグインが読み込めなくなるので、危険ですね。ChoreonoidをROSノードとして起動する場合ROSプラグインが読み込まれていないと起動しないようになっているので、そもそもChoreonoidが起動できなくなってしまうということですね。

こちらについてはこのような設定を入れてしまったのは良くなかったかと思います。申し訳ないです。この機能は最新版では除去しました。

この症状になってしまったときの対処方法ですが、設定はホームディレクトリの “.config/Choreonoid/Choreonoid-ROS.conf” というYAMLファイルに記録されています。（これは通常"Choreonoid.conf"ですが、ROS版の場合は"Choreonoid-ROS.conf"となります。

このファイルに

PluginManager:
startupPluginLoading: false

となっている箇所があるかと思います。ここのfalseをtrueにして保存してからChoreonoidを起動し直すと、プラグインが読み込めるようになっているかと思います。

nakaoka
December 14, 2021, 1:36am

19

RELUoA_Hiroto:

ルートリンクからロボットモデルを入手しようとしているのですが、どうやらそこで問題が起きているようです。

GDBの結果をみたかんじでは、

auto spiderBody = spider->body();

のところでspiderのオブジェクトが無効になっていて、そこで落ちているようにみえます。あくまで予想ですが、spiderがうまくfindできていなくて、nullptrになっているのではないでしょうか。

このコードではアイテムにチェックが入っていないなどして対象のアイテムがみつけられないと必ず落ちてしまうので危険ですね。spiderのメンバ関数を呼ぶ前に、nullptrでないかをチェックすることは必要かと思います。

アイテムにチェックが入っていて名前もあっているとしたら、このコードでもよいような気がしますが、それでも落ちているとしたらどこがまずいか、このコードを見ただけではまだわからないですね。すみません。

Yuki_Onishiさんがご指摘されているように、デバッグモードでビルドしてデバッガ上でこのコードをステップ実行してみると、何か分かるのではないかと思います。

ただROSノードとしてChoreonoidを起動する場合、デバッガ上での実行が若干ややこしくなります。基本的にはデバッガで実行中のプロセスにアタッチする機能を使うとよいです。まずChoreonoidノードをデバッガとは独立して起動して、別途デバッガも起動して、その状態でデバッガからChoreonoidのプロセスにアタッチします。あとは適当にブレークポイントなどを設定してデバッグします。

この方法について以前ある大学で講習したことがあって、その資料がありましたので、後ほどそれをアップします。

nakaoka
December 14, 2021, 1:43am

20

Yuki_Onishiさん、言いにくいことをご指摘いただきありがとうございます。確かにこのような場で質問する側が「忙しいから」と仰るのはあまりよくなかったかなと、私も思います。私もなるべく回答はしたいところなのですが、ここはあくまでボランティアですので、なかなか全てに迅速に回答することは難しいところがあり、ご理解いただければと思います。

もちろん情報交換・議論が活発になされるのは有り難いことですので、投稿自体は歓迎です。また利用者の方は質問をするだけではなく、もし回答可能な質問がありましたらぜひ回答をいただけると助かります。Choreonoidはオープンソースソフトウェアですので、そのような相互扶助ができれば一番よいかと思います。

そしてHirotoさん、恐縮ではありますが、もしよろしければ、以下のページを読んでみていただけますでしょうか。

「 技術系メーリングリストで質問するときのパターン・ランゲージ」
https://www.hyuki.com/writing/techask.html

これは割と有名なページで、オープンソースソフトウェアに関するやりとりでも参考になるもので、私も参考にしています。ここに書かれていること全てに従う必要はありませんが、受け入れられるところは参考にしていただければと思います。

RELUoA_Hiroto
December 14, 2021, 2:20am

21

ご連絡ありがとうございます。
そして、質問への対応や、ご指摘誠にありがとうございます。
頂いたフィードバックや資料をきちんと読み込み、研究をより良いものにしていく所存です。

これからもよろしくお願いいたします。

nakaoka
December 14, 2021, 2:27am

デバッグ方法に関する資料をアップします。よろしければ参考にしてください。

Choreonoid-デバッグ方法1.pdf (985.0 KB)
Choreonoid-デバッグ方法2.pdf (835.9 KB)