tork-a / tork_moveit_tutorial

7 stars 8 forks source link

マルチスレッドorプロセスでの利用方法・注意事項 #31

Open d-nakamichi opened 5 years ago

d-nakamichi commented 5 years ago

MoveIt!を使用したアプリケーションを組む際、マルチスレッドでの実装が考えられますが、実装方法やその際のMoveIt!における注意点のリファレンスが少なく困っています。

ROSでドキュメントがある情報はspinくらいでしょうか。 http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning

こうした情報を載せたチュートリアルがあると良いかと思うのですがいかがでしょうか?

k-okada commented 5 years ago

あくまでも個人的な意見なので,違う話もあるとおもいますが,ROSではマルチスレッドは使わず,マルチプロセスで処理する,というのが素直じゃないか,と思っています.

難しい話をすると, http://wiki.ros.org/smach/Tutorials/Concurrent%20States みたいに使ってみる,というのも一つですが,

actionlibを使って,

send_goalA_no_wait()
send_goalB_no_wait()

wait_goalA() and wait_goalB()

みたいにはならないでしょうか?

d-nakamichi commented 5 years ago

個人的にも確かにマルチプロセスが素直かと思います。

先に手段の話をしてしまって申し訳ありませんでしたが、 背景として双腕ロボットのように制御対象が複数存在する場合、それぞれを協調or独立して制御するための、実装に関するドキュメントがあると役に立つのではないかという思いがあります。

MoveIt!を使用した場合、実現方法としては現状以下2つが考えられ、それぞれ不明点がある状況です。

  1. 複数アームを1グループとしてまとめて制御
    • 複数アームの同時動作は可能
    • 1アーム目が動作中に2アーム目を新たな目標点に移動するといった、複数アームに対して独立して動作指示する方法が分からない(方法は現状ない?)。
      • MoveIt!のAPIでは恐らくmove_groupが1つにつき1つのTrajectoryしか処理できない?
  2. MoveIt!のAPIを使用するのではなく、FollowJointTrajectoryのActionをそのまま利用する
    • 複数アームの同時動作&独立動作が可能
    • アームごとにスレッドorプロセスを立てられれば制御フロー・ソースコードが分かりやすくなる場合が多い
      • 本Issueで挙げたように、マルチスレッドorプロセスのROS/MoveIt!上の注意点が不明確
      • 1アーム目の動作状態に応じて2アーム目を動作させるとなった場合、それぞれのアームが別のアームの状態を取得する必要がある。このため、アーム間の情報共有が必要となるが、マルチスレッドorプロセスでの情報共有方法で、ROSやMoveIt!として利用できる仕組みがあるのであれば利用したい。

現状のMoveIt!でできること/できないことがドキュメント等でクリアになっていると、利用者としては利用しやすいものとなると思います。

k-okada commented 5 years ago

2番の場合は arm1 = MoveGroupCommander('left_arm'), arm2 = MoveGroupCommander('right_arm') として,それぞれを独立に動かすのだとおもいます. 以下はそのままでは動かないとおももいますが,一つのプロセスでかくとすると,

arm1.set_pose_target(point_1)
arm2.set_pose_target(point_2)
arm1.go(duration=rospy.Duration(3), wait=False) #
今,この時間を指定できないのがmoveitのマズイ所,要改善
arm2.go(duration=rospy.Duration(1), wait=False)
arm2.wait_for_result() # これもインターフェースがないかな....
arm2.set_pose_target(point_3)
arm2.go()
arm1.wait_for_result()

みたいな書き方になるんだとおもいます. 多分ですが,これは1アームのロボットでも, arm1.set_pose_target(point_1) arm1.go(wait=False) rospy.sleep(Duration(1.0)) set_io_enabled() # 何かのIOのスイッチを入れる? arm1.wait_for_result() みたいに動いている間に別の処理をしたい,となったときには,同じような,どうやって書いたら良いか?という疑問点がでてくるのではないあkと思うのですが,いかがでしょうか?

何れにせよ,ドキュメント,インターフェース,機能に反映させていきたいとおもいますので,なにかよい簡単な,サンプル,ユースケース,を, 上のような感じのコードに落とせそうなレベルの表記で教えていただけると幸いです.

-- ◉ Kei Okada

2019年4月16日(火) 17:09 Daisuke NAKAMICHI notifications@github.com:

個人的にも確かにマルチプロセスが素直かと思います。

先に手段の話をしてしまって申し訳ありませんでしたが、

背景として双腕ロボットのように制御対象が複数存在する場合、それぞれを協調or独立して制御するための、実装に関するドキュメントがあると役に立つのではないかという思いがあります。

MoveIt!を使用した場合、実現方法としては現状以下2つが考えられ、それぞれ不明点がある状況です。

  1. 複数アームを1グループとしてまとめて制御

    • 複数アームの同時動作は可能
    • 1アーム目が動作中に2アーム目を新たな目標点に移動するといった、複数アームに対して独立して動作指示する方法が分からない(方法は現状ない?)。

      • MoveIt!のAPIでは恐らくmove_groupが1つにつき1つのTrajectoryしか処理できない?
        1. MoveIt!のAPIを使用するのではなく、FollowJointTrajectoryのActionをそのまま利用する
    • 複数アームの同時動作&独立動作が可能
    • アームごとにスレッドorプロセスを立てられれば制御フロー・ソースコードが分かりやすくなる場合が多い
      • 本Issueで挙げたように、マルチスレッドorプロセスのROS/MoveIt!上の注意点が不明確
      • 1アーム目の動作状態に応じて2アーム目を動作させるとなった場合、それぞれのアームが別のアームの状態を取得する必要がある。このため、アーム間の情報共有が必要となるが、マルチスレッドorプロセスでの情報共有方法で、ROSやMoveIt!として利用できる仕組みがあるのであれば利用したい。

現状のMoveIt!でできること/できないことがドキュメント等でクリアになっていると、利用者としては利用しやすいものとなると思います。

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/tork-a/tork_moveit_tutorial/issues/31#issuecomment-483557096, or mute the thread https://github.com/notifications/unsubscribe-auth/AAeG3GViIrWBtbKalMZjqD2UI0mDbjGcks5vhYVLgaJpZM4cjpRZ .