hsnuhayato / rtm-ros-robotics

Automatically exported from code.google.com/p/rtm-ros-robotics
0 stars 0 forks source link

hiroでhrpsys.launchをincludeしたlaunchファイルを作りたい #184

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
JSKの三宅です。
(参考URL https://code.google.com/p/rtm-ros-robotics/source/detail?r=4638)

以前上のURLのページで色々お聞きしたことについて少し分��
�ってきたので、
hrpsys.launchをincludeするhironx_startup.launchを作ってみました。

hrpsys.launchの中では、
>1. ModelLoaderのたちあげ
>2. rtcdの立ち上げ
>3. hrpsys.pyで、RTCのcreate, connectを行う
をやっていているそうですが、

おっしゃる通り、HIROでは1と2を体内でやってしまっている��
�で、
launchファイル内で再度ModelLoadeやrtcdを立ち上げてしまうと、
エラーが出ました。

なので、hrpsys.launchに、ModelLoaderとrtcdを立ち上げるフラグを
  <arg name="LAUNCH_RTCD" default="true" />
  <arg name="LAUNCH_MODELLOADER" default="true" />
として作り、hironx_ros_bridge.launch側ではこれをfalseにすること
で、
hrpsys.launchのみを立ち上げるようにしました。

一応動作確認はしていますが、この対策で大丈夫でしょう��
�?
ファイルとdiffを添付しておきますので、確認をお願い致し�
��す。

それとも、HIROだけに合わせるための冗長な変更はなるべく�
��なくするために、
ModelLoaderとrtcdを、ロボット側ではなく、ローカル側に持っ��
�くることを目指していくべきなのでしょうか?
また、そもそもそれは可能でしょうか?

Original issue reported on code.google.com by ke...@jsk.imi.i.u-tokyo.ac.jp on 29 Aug 2013 at 1:27

Attachments:

GoogleCodeExporter commented 9 years ago
$ /hironx.py RobotHardware0  /opt/jsk/etc/HIRONX/model/main_15dof.wrl -- 
-ORBInitRef NameService=corbaloc:iiop:hiro014:2809/NameService
とするのでどうでしょうか?
rtcd.shのなかでこれを時刻するようにするのが一番楽そうで�
��が,どうおもわれますか?

Original comment by kei.ok...@gmail.com on 29 Aug 2013 at 1:31

GoogleCodeExporter commented 9 years ago
ちょっとコマンドを修正して実行すると、以下のようにな��
�ます。

rtcd.shというのがどこを指すのかわからないので、もう少し�
��しく教えて頂けますか?
僕の知識では、HIRO体内のrtcd.shしか出て来ません。
起動時にcreateComps等を済ませてしまう、ということでしょう
か?

leus@parsnip:~/ros/groovy/rtm-ros-robotics/rtmros_hironx/hironx_ros_bridge/scrip
ts$ ./hironx.py RobotHardware0  /opt/jsk/etc/HIRONX/model/main_dof15.wrl -- 
-ORBInitRef NameService=corbaloc:iiop:hiro014:15005/NameService
[hrpsys.py]  waiting ModelLoader
[hrpsys.py]  start hrpsys
[hrpsys.py]  finding RTCManager and RobotHardware
[hrpsys.py]  wait for RTCmanager :  hiro014
[hrpsys.py]  wait for RobotHardware0  :  <rtm.RTcomponent instance at 
0x366db00> (timeout  0  < 10)
[hrpsys.py]  findComps -> RobotHardware :  <rtm.RTcomponent instance at 
0x366db00>
[hrpsys.py]  simulation_mode :  False
[hrpsys.py]    bodyinfo URL = file:///opt/jsk/etc/HIRONX/model/main_dof15.wrl
[hrpsys.py]  creating components
[hrpsys.py]    eval :  [self.seq, self.seq_svc] = 
self.createComp("SequencePlayer","seq")
RTC named " seq " already exists.
[hrpsys.py]  create Comp ->  SequencePlayer  :  <rtm.RTcomponent instance at 
0x366df80>
[hrpsys.py]  create CompSvc ->  SequencePlayer Service :  
<OpenHRP._objref_SequencePlayerService instance at 0x3675e18>
[hrpsys.py]    eval :  [self.sh, self.sh_svc] = 
self.createComp("StateHolder","sh")
RTC named " sh " already exists.
[hrpsys.py]  create Comp ->  StateHolder  :  <rtm.RTcomponent instance at 
0x366ddd0>
[hrpsys.py]  create CompSvc ->  StateHolder Service :  
<OpenHRP._objref_StateHolderService instance at 0x3688368>
[hrpsys.py]    eval :  [self.fk, self.fk_svc] = 
self.createComp("ForwardKinematics","fk")
RTC named " fk " already exists.
[hrpsys.py]  create Comp ->  ForwardKinematics  :  <rtm.RTcomponent instance at 
0x3682050>
[hrpsys.py]  create CompSvc ->  ForwardKinematics Service :  
<OpenHRP._objref_ForwardKinematicsService instance at 0x36812d8>
[hrpsys.py]    eval :  [self.el, self.el_svc] = 
self.createComp("SoftErrorLimiter","el")
RTC named " el " already exists.
[hrpsys.py]  create Comp ->  SoftErrorLimiter  :  <rtm.RTcomponent instance at 
0x36868c0>
[hrpsys.py]  create CompSvc ->  SoftErrorLimiter Service :  
<OpenHRP._objref_SoftErrorLimiterService instance at 0x36817e8>
[hrpsys.py]    eval :  [self.sc, self.sc_svc] = 
self.createComp("ServoController","sc")
RTC named " sc " already exists.
[hrpsys.py]  create Comp ->  ServoController  :  <rtm.RTcomponent instance at 
0x3676a28>
[hrpsys.py]  create CompSvc ->  ServoController Service :  
<OpenHRP._objref_ServoControllerService instance at 0x36727a0>
[hrpsys.py]    eval :  [self.log, self.log_svc] = 
self.createComp("DataLogger","log")
RTC named " log " already exists.
[hrpsys.py]  create Comp ->  DataLogger  :  <rtm.RTcomponent instance at 
0x3686a70>
[hrpsys.py]  create CompSvc ->  DataLogger Service :  
<OpenHRP._objref_DataLoggerService instance at 0x3681878>
[hrpsys.py]  connecting components
sh.qOut and el.qRef are already connected
el.q and RobotHardware0.qRef are already connected
RobotHardware0.servoState and el.servoStateIn are already connected
RobotHardware0.q and sh.currentQIn are already connected
seq.qRef and sh.qIn are already connected
seq.basePos and sh.basePosIn are already connected
seq.baseRpy and sh.baseRpyIn are already connected
seq.zmpRef and sh.zmpIn are already connected
sh.qOut and seq.qInit are already connected
sh.basePosOut and seq.basePosInit are already connected
sh.baseRpyOut and seq.baseRpyInit are already connected
RobotHardware0.q and fk.q are already connected
sh.qOut and fk.qRef are already connected
sh.basePosOut and fk.basePosRef are already connected
sh.baseRpyOut and fk.baseRpyRef are already connected
RobotHardware0.q and el.qCurrent are already connected
[hrpsys.py]  activating components
already serialized
already serialized
already serialized
already serialized
already serialized
already serialized
[hrpsys.py]    setupLogger :  q  arleady exists in DataLogger
[hrpsys.py]    setupLogger :  tau  arleady exists in DataLogger
[hrpsys.py]  sensor names for DataLogger
[hrpsys.py]    setupLogger :  qRef  arleady exists in DataLogger
[hrpsys.py]    setupLogger :  emergencySignal  arleady exists in DataLogger
[hrpsys.py]  setup logger done
[hrpsys.py]  initialized successfully

Original comment by ke...@jsk.imi.i.u-tokyo.ac.jp on 29 Aug 2013 at 1:39

GoogleCodeExporter commented 9 years ago
これを恐らく勘違いしていましたが、本来の目標は以下の��
�うか感じですか?

そもそもlaunchファイルをデスクトップ側で立ち上げているHI
ROが特殊で、普通はロボット側でlaunchを立ち上げるため、
昨日書いた、
>ModelLoaderとrtcdを、ロボット側ではなく、ローカル側に持っ�
��くることを目指していくべきなのでしょうか?
はむしろ逆で、hironx.pyを実機で立ち上がるようにする、と��
�うのが望ましい。

更にそこでrosが走って、launchファイルで全てを立ち上げる��
�、
環境の立ち上げ直しも簡単になって(現状はModelLoaderやrtcd��
�バグった時の解決方法がわかりにくい)、
いちいちOSを再起動しなくてよくなって嬉しい。

というのを、Isaacさんたちがやってくれている、ということ
でしょうか?

Original comment by ke...@jsk.imi.i.u-tokyo.ac.jp on 30 Aug 2013 at 2:54

GoogleCodeExporter commented 9 years ago
私の使っているロボットの場合、体内でhrpsys.launchを立ち上�
��、その中でrtcdやModelLoader,hrpsys.pyも立ち上がります。
rtcdはリアルタイムで動くことを想定されているので、体外�
��出すのは難しいはずです。

何かrtcd.shを使っている経緯があるとは思いますが、rtcdを立
ち上げる前に特殊な動作が必要になるならば、
rtcd.shの中は
release_iob
roslaunch hrpsys hrpsys.launch 引数 
<-ここでrtcdが立ち上がり、^Cを押されたらroslaunch側で終了し
てくれる
kill rtcd
などとしておいて、hironx_startup.launchから上げるようにする��
�うまくいくのではないかと思います。

roslaunchのかわりにrtmlaunchを使うようにすると、^Cで終了させ
たときにnameserverも含めOpenRTM環境全てが終了するので、
バグったときの対処はしやすいと思います。

原点はシミュレーションと実機のlaunchがなるべく同じにな��
�ているとやりやすい、つまり
実機で
roslaunch (実機向けパッケージ) hironx_startup.launch <- 
rtcdが起動、OpenRTMから動かせる状態になる
としてから手元で
roslaunch hironx_ros_bridge hironx_ros_bridge.launch <- 
hrpsys_ros_bridgeが起動、ROSからも動くようになる
とすると実機が動く環境になり、
手元で
hroslaunch hironx_ros_bridge hironx_startup.launch <- 
hrpsys_simulatorが起動、OpenRTMで動くようになる
roslaunch hironx_ros_bridge hironx_ros_bridge.launch < 
hrpsys_ros_bridgeが起動、ROSから動くようになる
とするとシミュレーションで動く環境になる、となってい��
�とわかりやすく今後のアップデート対応も楽になるという�
��だったのではないかと思います。
(OpenRTMの接続先が実機とシミュレーションで違うので、hironx
_ros_bridge.launch実行時の引数や環境変数は変える必要があり��
�うです)

Original comment by nakaokat on 30 Aug 2013 at 3:36

GoogleCodeExporter commented 9 years ago
中岡さん

わかりやすくまとめて頂いてありがとうございます。

>としてから手元で
>roslaunch hironx_ros_bridge hironx_ros_bridge.launch <- 
hrpsys_ros_bridgeが起動、
ROSからも動くようになる
が分かってなくて、これもロボットで上げるべきものだと��
�っていました。

また、
HIROでは現在、OS起動時に、
NameServer.sh, ModelLoader.sh, rtcd.sh
を立ち上げていて、
>roslaunchのかわりにrtmlaunchを使うようにすると、^Cで終了さ��
�たときにnameserverも>含めOpenRTM環境全てが終了するので、
という部分が、上手く機能してくれません。

OpenRTMの環境を完全にリセットしたいと思ったら、どうやる�
��が良いでしょうか?

1) 
しばらくは不便を我慢して現状で使っておき、qnx上でROSが��
�くのを待ってから、実機でrtmlaunchができるように頑張る。

2) 
リモートから上の3つを落として再起動する。(sshで入って�
��とすのはめんどくさいです)

2の方は、
A) 
どうやってリモートからプロセスの終了、再起動をするか
B) 
どのプロセスを落とすべきか(体内のプロセスを添付しま��
�た)
がよくわかっていません。

rtcdの(sshを使った)再起動だけは分かっていて、ssh 
hiro@hiro014としてから、
# slay -9 
rtcdとコマンドを打つと、裏で走ってるrtcd.shの中でループが
回っているので、
自動的に必要なプロセスを立ち上げしてくれます。という��
�を斎藤さんがやってくれました。

個人的には、しばらく現状のままで良いのですが、
最終的にはどうするべきなのか、大まかな流れだけでも知��
�ておきたいので、
わかる方はアドバイスをお願いします。

Original comment by ke...@jsk.imi.i.u-tokyo.ac.jp on 30 Aug 2013 at 4:43

Attachments:

GoogleCodeExporter commented 9 years ago
いや、
roslaunch hironx_ros_bridge hironx_ros_bridge.launch
については、体内でROSが動くならば体内で上げた方がcorbaの
速度的にも良いのですが、
QNXでROSが動いているのかわからないのと、rosbridgeが重く体��
�PCに処理能力が必要になるので、
hrp4などでは体外で上げていたと思います。
体外で上げる方法についてはhrp4ユーザが詳しいです。

> 
qnx上でROSが動くのを待ってから、実機でrtmlaunchができるよ��
�に頑張る。
現状QNXでROSは動いていないのでしょうか。
となると、hrpsys.launchを使ってroslaunchやrtmlaunchする作戦は使�
��ないので、
全てシェルスクリプトでやることになりますね。
hrpsys.launch相当のシェルスクリプトを用意しておくと良さそ�
��です。

> 2の方は、
> A) 
どうやってリモートからプロセスの終了、再起動をするか
> B) 
どのプロセスを落とすべきか(体内のプロセスを添付しま��
�た)
> がよくわかっていません。
unixコマンドレベルの話なのか、hiro特有の話なのかよくわか
りませんが、3つのスクリプトの中身を見て
中で起動しているプロセスが勝手に再起動されるように書��
�れているならrtcdと同じようにslayで落とせばよいのでは?
再起動されないのならば、別途スクリプトをsudoで上げるな�
��すれば使えるようになると思いますが、どうでしょう。

sshで入って落とすのはめんどくさいならば、シェルスクリ��
�トなどにまとめてしまうと楽です。
再起動するよりは早いと思います。

Original comment by nakaokat on 30 Aug 2013 at 5:34

GoogleCodeExporter commented 9 years ago
>rosbridgeが重く体内PCに処理能力が必要になるので、
なるほど、では多分HIROも処理能力が足りないので、体外で�
��げるようにすると思います。
困ったらhrp4に詳しい方に聞いてみようと思います。

>現状QNXでROSは動いていないのでしょうか。
HIROにはまだROSは入ってないみたいです。
HIROユーザなのに、あんまり進行状況がわかってないです。�
��いません。

>unixコマンドレベルの話なのか、hiro特有の話なのかよくわ��
�りませんが、
Aの方はunixコマンドの話で、「リモートにパスワード有りで
入って、suになってコマンド実行」みたいなののやり方が分
かってないです。

Bの方は、HIROとOpenRTMの話です。こちらは今スクリプトを見��
�ら、多分解決しました。
/opt/jsk/bin/NameServer.sh
/opt/jsk/bin/ModelLoader.sh
を実行し直すと、今のプロセスを落としてから、起動しな��
�してしてくれるみたいです。

>再起動されないのならば、別途スクリプトをsudoで上げるな
どすれば使えるようになると思いますが、どうでしょう。
という訳で、/opt/jsk/bin/以下のスクリプトを、リモートから�
��行するスクリプトが書ければ解決しそうです。
書き方がわからないので、調べながら色々試してみます。

Original comment by ke...@jsk.imi.i.u-tokyo.ac.jp on 30 Aug 2013 at 6:08

GoogleCodeExporter commented 9 years ago
リモートからコマンドを実行するのが上手く行かない、と��
�いていましたが、
ssh関連の設定がおかしかったのが原因だったみたいで、解��
�しました。

.bashrcに以下のように定義して、関数を実行すると、
(多分)OpenRTMの環境をリセットすることができました。
問題がありそうなら指摘してください。

function restartOpenRTM() {
  commands="
  echo \"* Restart NameServer *\";
  nohup /opt/jsk/bin/NameServer.sh > /dev/null;
  echo \"* Restart ModelLoader *\";
  nohup /opt/jsk/bin/ModelLoader.sh > /dev/null;
  echo \"* Sleep 3sec *\";
  /usr/bin/env sleep 3;
  echo \"* Restart rtcd *\";
  slay -9 rtcd;
  echo \"* Finish Restart OpenRTM*\";
  "
  ssh root@hiro014 -t $commands
}

Original comment by ke...@jsk.imi.i.u-tokyo.ac.jp on 30 Aug 2013 at 9:37

GoogleCodeExporter commented 9 years ago
岡田です.

おそくなりました.だいたい議論の結果でいいと思います��
�,

./hironx.py RobotHardware0  /opt/jsk/etc/HIRONX/model/main_dof15.wrl -- 
-ORBInitRef NameService=corbaloc:iiop:hiro014:15005/NameService
を体内で実行したら機能する,というのが前提で,

rtcd.sh 
にこれを追加したら,ロボットを再起動すれば,rtcdも走っ�
��pluginも走る,ということになります.
rtcd.sh 
ではrtcdを立ち上げてそこでブロックしていると思うのでい�
��方法を考えてくれると嬉しいです.
rtcdの前に
(sleep 10; ./hrpsys.py .... )&
といれればいいのか?

Original comment by kei.ok...@gmail.com on 1 Sep 2013 at 5:24

GoogleCodeExporter commented 9 years ago
r5360 
で三宅くんがつくったスクリプトを追加させてもらいまし��
�.
hironx_ros_bridge/robot
で
make
とするとrestart-robot.sh ができます.違うロボットの人は
make ROBOT_IP=hiro0001
として自分のIPを指定して下さい.
うえの,
(sleep 10; ./hrpsys.py .... )&
は,
(sleep 10; ./hironx.py .... )&
の間違いですがこれが上手く動けば
このディレクトリのrtcd.sh.in を直して,
makeでできたファイルを実機で使うようにする,
というのが使い方のイメージです.

Original comment by kei.ok...@gmail.com on 1 Sep 2013 at 5:35

GoogleCodeExporter commented 9 years ago

Original comment by kei.ok...@gmail.com on 30 Jan 2014 at 11:05