Conversation
|
これだと、運用的にはロボットモデルを作るときには必ずrobotname-interface.lを呼ぶということになるけど、 |
そうですね、もう何年も前からrobot.lを単体で呼ぶことはなく、想定もされてないと思います。 |
|
util.l は irteusでもうごくけど、-interface.l は roseus 出ないと動かない、という切り分けになりそうだけど、
実際にpr2-utils.lとかみると、行頭に
(require :pr2 "package://pr2eus/pr2.l")
とかありますね.これは
(require :pr2 "pr2.l")
でいけそう.
あとは、roscoreがないと-interface.lは動かないけど、utilは動く、というのは今でも真か.
…--
◉ Kei Okada
2017年4月18日 23:18 Shunichi Nozawa <notifications@github.com>:
これだと、運用的にはロボットモデルを作るときには必ずrobotname-interface.lを呼ぶということになるけど、
そうするということでいいか。
これまでも、robotname-utils.lを呼ばないと完全に使えるモデルはできていなかったわけだし。
そうですね、もう何年も前からrobot.lを単体で呼ぶことはなく、想定もされてないと思います。
utilsファイルを作ってしまっている以上、utilsを使わないでロボットモデルを使うと不具合がでるはずなので。
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#511 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AAeG3HAkcXpp6GP33TWW1M39_qGVbB_sks5rxMYggaJpZM4NAZVI>
.
|
|
min-max-tableを追加するロボットは必ず、utils.lでinit-ending的なものをつくって :define-min-max-table しなくちゃならない気がしてきた。 |
これはおっしゃるとおりですね。
そうですね。
というかんじでしょうか。 もともとの@YoheiKakiuchiさんのコメントの 別なアレとしては、riに関する依存関係もloadしたくなくて、
などがありそうです。 |
そうですね。
の2点がアレだったので、 このPRでは、robot.lの:init-endingを削除してutils.lにのみ:init-endingをかくことに |
|
超脱線してしまいますが、オブジェクト指向でオーバーライドは明確に単語の定義がありますが、 |
昨晩気がついたんですが、 utils.l は良くない風習で、落ち着いて考えると、pr2.dae -> pr2-model.l として、pr2.lという名前でutils.l 的なものを作るべきだったね、という話ではあるかと思います.が、後の祭り. 現状、
が真の正解、ということでいいとすると、あまり見たくないrobotmodelの:init-ending を更にロボット毎に変えないと 再定義? |
そうですね。
などがありそうで、それぞれ例えば
たしかに、これ今まで積極的に同じディレクトリのファイルをloadする機能を使ってなかったですが、 |
|
2017年4月19日 11:07 Shunichi Nozawa <notifications@github.com>:
package://を極力使わない形にして、PRを更新してみます
ま、とりあえずは、
https://github.com/start-jsk/rtmros_tutorials/pull/508/files +
https://github.com/snozawa/rtmros_tutorials/blob/570f0444d7d90a294fcd07301887bea110e173c1/hrpsys_ros_bridge_tutorials/test/test-all-robots-check.l
で先に進むのでよくないかな.
…--
◉ Kei Okada
|
|
#508と#509は
の2点があり、#509ではそれがないので、#509が良いと思っているのですがいかがでしょうか。 |
|
どっちでもよいのですが、#509はパット見、
(defmethod JAXON-robot
(:init-ending
- (&rest args)
+ ()
(prog1
- (send-super* :init-ending args)
+ (send self :init-ending-org)
は、
(defmethod JAXON-robot
(:init-ending
(&rest args)
(prog1
- (send-super* :init-ending args)
+ (send* self :init-ending-org args)
では?
とか.method名書き換えは、使われているテクニックであはるけど、あまりオススメできないよね.とか.
…--
◉ Kei Okada
2017年4月19日 11:37 Shunichi Nozawa <notifications@github.com>:
#508と#509は
#511 (comment)
<#511 (comment)>
にも少しかきましたが、
#508のcons
- 書いてあるけど呼ばれなくなるメソッドができてしまう(:init-ending)
- 同じようなことが書いてあるファイルが2種類でてきてしまい、かつロボットによってどっちが正解かがかわってしまう
の2点があり、#509ではそれがないので、#509が良いと思っているのですがいかがでしょうか。
その場合は、このPRがcloseで、#509
<#509>+https:/
/github.com/snozawa/rtmros_tutorials/blob/570f0444d7d90a294fcd07301887be
a110e173c1/hrpsys_ros_bridge_tutorials/test/test-all-robots-check.l になります。
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#511 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AAeG3LfuUhaMDFogc5XlJmQRvzBEuPrxks5rxXN8gaJpZM4NAZVI>
.
|
|
ありがとうございます |
|
もうちょっと真面目に考えると、#509 は全てのxx-utils.l
にxxとかけば#508の問題が解決します、となっていて、あまり状況を良くしていないなぁ、という感想です.
現状のutilでのinit-endingeの書き方はこれでよいとして、send-superするのも、おやくそく、ということで、そこでひとつ、:define-min-max-tableルールがややこしい、
ということで、これがなくても動くのがベストなわけで、それをするためにはinit-ending-orgを.utilで定義してくださいね、は、また別のルールが入ってきているように見えます.
そもそも、原因がどこにあるかと考えると、例えばもし、最初っからhrp2-min-max-joint-table.l
というファイルをかいて、全員utils.lを書いて、loadして、、と考えると、
、#508のconsとされているところはそもそも生じなかったという気がする.もちろん.全てのxx-utils.lに何かを書くという時点で、いまいちではあるのと、
多分最初はxx-utils.lを想定していなかったから、robot.lにappendしてrobot.lをロードして(robot)したら動くように、という想定だったんだと思われる.
これだけだと綺麗になっているので、utilを入れ、さらそこで、:init-endingを定義していて全体がおかしくなってきている.ということになる.
問題はappendのなかで、うまくいくように:init-endingが定義されているのが問題なので、ここを治して、init-endingでないところで、define-min-max-tableしたいところ.
こうすれば、できるだけ個々のutilをいじるのではなくて、その上流で何とか直しておくのがよい、ということだから、常に上流で直していく、ということで、方向性は正しそうだ.
で、:init-endingでテーブルをセットするんではなくて、関節を作るときにテーブルをセットするということができるといいんだけど、appendしている以上、むづかしいのか.
クラスのメソッドも含めてdump出来たりすると、ここをいじれるという話もある.そもそも昔はdumpしたhrp2.lのオブジェクトを読んでいたので不可能ではない.
更に上流に目をやると、理屈上簡単なのはeuscolladaでdump時にテーブルができればよい.dumpプログラムがCでめんどうになるので、twopassで動かす
ということになるのが残念か.となると、やっぱ、make-min-max-joint-table.lでなんとかならんか.に戻ってくる.
collada-robot -> hrp2jsknts (robot.l) -> hrp2jsknts
(util.l)と定義されているのが問題でグリッパつけたりどうのこうのなロボットはそれぞれ別のモデルにしましょう
という考え方もある.
https://github.com/start-jsk/jsk_apc/blob/master/jsk_2016_01_baxter_apc/euslisp/jsk_2016_01_baxter_apc/baxter.l
appendするときに、
(defclass hrp2jsknts-robot-new :super hrp2jsknts-robot)
(defmethod hrp2jsknts-robot-new
(:init-ending () ...)
(defun HRP2JSKNTS () (setq *HRP2JSKNTS* (instance HRP2JSKNTS-robot-new
:init)))
という書き方になる.一応これで、解決はする.でもいまさら新しいクラスを導入する、というのは手遅れか.
別クラスがいやだったら、クラス名をrplaca
できたっけ、それができたらOKというきもする.こうすると、utilで再定義してsuperすると、appendの部分が呼ばれる.
この方向のトリッキーな解としてはeuscolladaで書き出すときにdefclass euscollada-hrp2-robot :suepr
euscollada-robotとするというのがあるhrp2-euscollada-robot?
理屈としては、全てのロボットモデルが一気にコンパイルされていたらいいけど、別々のタイミングでコンパイルされたものだと、2回呼ぶと定義うわがかれるし
気持ち悪くない?というのがある.こうすると、euscollada-robotは中身はないんだけど、appendのタイミングで追加する.roscolalda-hrp2-robotが空でもいいのか.
何れにせよ、両方共、これだけのために空のクラスをつくるのでいまいちか.
rplacaが許容されるなら、appendでeuscollada-robotにappend & replaca
するというのもある.robot.lの一番下でrplacaするのと、util.lの先頭でreplacaするのは
前者のほうが罪悪感が伝わって良いのではないか.ただ、この方法だと、本当に別のeuscolladaができていて怖いか.hrp2-euscollada-robotができたらいいのか.
でも、これがあるとすると、euscolladaでそういうinit-endingを出せばいい、となって、だとすると、jskeusで:define-min-max-tableを定義するとおなじになる.
でも、define-min-max-table関数はこのパッケージのローカルルールだから、ここでappendでいいのか.
と考えると、defclassした後名前をかえられたらいいんだけど、むづかしいかな.ちょっとやってみたけど、copy-object
hrp2jsknt-robot でも同じメモリがかえてくるなぁ..
さて、どうするか...しかしなんでできないんだろ、、、
ぐらいが、#508から次の段階のスタート地点かな、と思いました.
…--
◉ Kei Okada
2017年4月19日 11:59 Kei Okada <notifications@github.com>:
どっちでもよいのですが、#509はパット見、
(defmethod JAXON-robot
(:init-ending
- (&rest args)
+ ()
(prog1
- (send-super* :init-ending args)
+ (send self :init-ending-org)
は、
(defmethod JAXON-robot
(:init-ending
(&rest args)
(prog1
- (send-super* :init-ending args)
+ (send* self :init-ending-org args)
では?
とか.method名書き換えは、使われているテクニックであはるけど、あまりオススメできないよね.とか.
--
◉ Kei Okada
2017年4月19日 11:37 Shunichi Nozawa ***@***.***>:
> #508と#509は
> #511 (comment)
> <#511#
issuecomment-295032594>
> にも少しかきましたが、
> #508のcons
>
> - 書いてあるけど呼ばれなくなるメソッドができてしまう(:init-ending)
> - 同じようなことが書いてあるファイルが2種類でてきてしまい、かつロボットによってどっちが正解かがかわってしまう
>
> の2点があり、#509ではそれがないので、#509が良いと思っているのですがいかがでしょうか。
> その場合は、このPRがcloseで、#509
> <#509>+https:/
> /github.com/snozawa/rtmros_tutorials/blob/570f0444d7d90a294fcd07301887be
> a110e173c1/hrpsys_ros_bridge_tutorials/test/test-all-robots-check.l
になります。
>
> —
> You are receiving this because you commented.
> Reply to this email directly, view it on GitHub
> <#511#
issuecomment-295046258>,
> or mute the thread
> <https://github.com/notifications/unsubscribe-auth/
AAeG3LfuUhaMDFogc5XlJmQRvzBEuPrxks5rxXN8gaJpZM4NAZVI>
> .
>
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#511 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AAeG3P57NGVWGhiL7GpJQIUxEIHdub3Yks5rxXh4gaJpZM4NAZVI>
.
|
|
新しいクラスをつくって、send-super するのは検討したんですが、やはり、class名が変わってしまうのが気になる。 classのreplacaですが、 とすると、jaxon-robotに
ですが、メソッドの付け替えよりも禁じ手な気がします。 |
#509が新しくルールを作ってるのと同様に、#508もutils.lで何かをするという意味で、 それで、 「class名をかえる方法」 「classを特性ごとに継承させて新しく定義していく」 「upstreamでなんとか解決する/書き出しをなんとかする」
などを挙げていただいてます。 それでご提案いただいている、 robot.lには もしくは、upstream感をだして、euscolladaの引数で--join-min-max-tableが与えられたらこれをかくことにして
などもありうるのかと思います。 ただ、upstreamもっていく場合のupstreamは、euscolladaというよりは、jskeusなのかな、と思います。 |
|
なるほど、それでいいのか.
禁じ手ですが、make-min-max-table.l
にいれておけば、普通の人はutil.lをみるので、util.lに禁じ手が入っているよりは、良いかと.
で、もう少し考えると、結局daeからhrp2jsknts-min-max-robot
クラスができて、それをsuperしてhrp2jsknts-robotを作れれば良くて、
そう考えると、変な名前のロボットってあったよな、と、
https://github.com/ros-naoqi/pepper_robot/blob/master/pepper_description/urdf/pepper1.0_generated_urdf/pepper_robot.xacro#L5
とおもって、どうしたんだっけ、とおもったら、
https://github.com/jsk-ros-pkg/jsk_robot/blob/master/jsk_naoqi_robot/naoqieus/cmake/compile_naoqi_model.cmake#L13
なのか.いまいちではある.ロボットの名前をcollada_urdfかeuscolladaで決められるようにしても、
https://github.com/start-jsk/rtmros_common/blob/master/hrpsys_ros_bridge/cmake/compile_robot_model.cmake#L127
あたりに入れるのも大工事ではあるなぁ.
となると、ここでsedか.
結局、ライトな禁じ手であるメソッド付け替えをutil.lでやるのと、ディープな禁じ手であるクラスの変更をmake-min-maxでやるのと、更にディープな禁じ手であるsedをCMakeList.txtでやるのと.
ライトな方は、禁じ手が見えやすい、ディープに行くほど、禁じ手は気づかれづらい.見えやすい禁じ手は罪悪感を感じて誰かがそれを直してくれたらいいけど、現実的には難しく、それが前例になっていくでしょう.sedにしちゃえば、.lを見る限り綺麗に書かれているように見える、その分の暗黒面がCMakeに押し付けられている.
「jointのinstance生成時に追加する」は今より正しい方向だとおもいますが、上流に上げれば上げるほど、それなりに綺麗に書いておきたいので、sedソリューションはない気がします.
「生成されたものを引数に与えてもう一回euscolladaを実行する」はtwopass とよんだやつですね.悪くはないけど、、、という感じです.
jskeusにいれるには、hrp2/jaxon
以外のロボットでどういう使われ方になっているか、検討しましょう.例えばmin-max-tableはどうやって入れることが想定されているか.jskeusの段階だと、人手でつくるか、make-min-max-table
で作ることが想定されているから、init-endingで:default-min-max-tableする必要はないように見えます.:default-min-max-tableを使ったらいいjskeusのロボットの例をうまく作る必要があると思います.
となると、euscolladaで自動生成される、というのが:default-min-max-table な話や、:init-ending
の上書きの大前提になっているように見えます.だとすると、まずは、make-min-max-table
的なものをeuscolladaにいれることになる.本当にtwopassしかないかは、パッとはでてこないです.
結局 #508
がダメで、sedはやりすぎでしょう、でクラスの変更も無いよね、で、util.lに禁じ手があるし上流で対応したいよね、となるなら、以下をappendするんではないでしょうか.
```
(unless (assoc :init-ending-org (send euscollada-robot :methods))
(rplaca (assoc :init-ending (send euscollada-robot :methods))
:init-ending-org))
(defmethod euscollada-robot
(:init-ending
(&rest args)
()
(prog1
(send* self :init-ending-org args)
(if (find-method self :define-min-max-table)
(send self :define-min-max-table))))
```
気持ち悪いとすると、euscollada-robotをうわがいているということで、そうでないとすると、appendでhrp2jsknts-robotメソッドで:init-ending-orgをつくる.
``
(defmethod staro-robot
(:init-ending () (send self :init-ending-org)) ;; may be overwritten
(:init-ending-org
()
(print "staro init endinge-org")
(prog1
(send-super :init-ending)
(send self :define-min-max-table)
))
```
でも、これutil.で
```
(defmethod STARO-robot
(:init-ending
(&rest args)
(prog1
(send* self :init-ending-org args)
```
となって、これはこれで気持ち悪い気もする.
ちなみにpr2をみてみると、pr2-robotとpr2-sensor-robot
と2つ作っていて、キャリブ済みのカメラモデルは結局urdfにないので、bagファイルを再生してモデルにしています.
でもpr2-interfaceを作るときにpr2-robotをしていてダメですね.実害は無いんだろうけど.
新しいクラスをつくって、send-super するのは検討したんですが、やはり、class名が変わってしまうのが気になる。
クラス指定するところはinterface位だとなっていて、クラス目変更がダメとなると、これでいいかなぁ、という気がしなくもない.
…--
◉ Kei Okada
2017年4月19日 14:47 Shunichi Nozawa <notifications@github.com>:
ぐらいが、#508から次の段階のスタート地点かな、と思いました.
#509が新しくルールを作ってるのと同様に、#508もutils.lで何かをするという意味で、
同様のルールが相当しますし、以下2点に関しても新たにルールを設定していることになります。
#511 (comment)
<#511 (comment)>
したがって、#508と#509は、ルールをもうける観点ではあまり優劣を個人的には感じてないです
(おっしゃるとおりいずれも良いルールでないので、「ルールのヤバさが同じくらい」という意味です)
それで#508では2点くらいやばそうな点がある他、
#511 (comment)
<#511 (comment)>
でコメントいただいた中の言葉をお借りすると、
#509がよさそうに思う理由のもう一つは「罪悪感が伝わって良い」からです。
#508はそれ自体みると、とくに何も問題なさそうですが、実はその背景には上記の2点の副作用を暗黙につかってるので、
後々メンテナンスがしんどくなりそうです。
#509はぱっとみでヤバいので、(もちろんベストではないですが)#509でなく#508にする
理由もとくにないのかなと思います。
それで、
#511 (comment)
<#511 (comment)>
の他の部分(upstreamで行うべき)は同感です。
その方法をいくつかあげていただいてますが、以下自分の意見です。
「class名をかえる方法」
class名をあとで変えるのは、#509と同じくらいヤバイので、長期的には違う方向性がよさそうに思いました。
「classを特性ごとに継承させて新しく定義していく」
きちんとクラスをわけるのはややアリっぽいです。
rbrainが過去そうなっていて、クラス階層が深くなるのでアレかなと思いました。
また、rbrainの時代に思った致命的な点としては、ロボットの特性に関するものをclassにすると、
多重敬称できないので後々困ることがあります。
具体的には、特性(handの有無、min/maxの有無、足の有無...)は、いずれの組み合わせもありうるので、
単一継承だと実現できないのが難点です。
「upstreamでなんとか解決する/書き出しをなんとかする」
upstreamで解決するのが、個人的にはベストだと思います。
現状、(以下分け方がテキトーかもしれないです)
- なんとかeuscolladaでモデルコンバート時にいいかんじにできないか
- define-min-max-tableをjskeusにもっていき、:init-endingでよぶ
- jointのinstance生成時に追加する
などを挙げていただいてます。
それでご提案いただいている、
「jointのinstance生成時に追加する」
が確かにいいかんじとは思ってきたので、例えば以下はいかがでしょうか。
robot.lには:name "RLEG_JOINT0"がかいてあるので、 make-min-max-table.lの中では、対応する関節名で:name
"RLEG_JOINT0"を 検索して、そこをsedか何かで置き換えて、:name "RLEG_JOINT0"
:joint-min-max-target "RLEG_JOINT2" :joint-min-max-table xxxx`
をかきこむ。
ややeuscolladaの書き込み形式をhackする感があるのが難点ですが、
ユーザレベルでの新たなルールは必要なく、
:init-endingも必要なくなり、:define-min-max-tableもいらなくなります。
もしくは、upstream感をだして、euscolladaの引数で--join-min-max-tableが与えられたらこれをかくことにして
- euscolladaでjoint-min-max tableのないロボットを生成する
- make-min-max-tableする
- 生成されたものを引数に与えてもう一回euscolladaを実行する
などもありうるのかと思います。
ただ、upstreamもっていく場合のupstreamは、euscolladaというよりは、jskeusなのかな、と思います。
たまたま今つかってるろぼっとがeuscolladaであって、min/maxの生成方、利用法もjskeusの機能であり、
euscolladaに依存したものではないので。
また、jskeusにmin-max tableがある以上、euscolladaでないロボットで同じ問題が再発するためです。
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#511 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AAeG3KJ6fAGmu8xn8Fl6Bh2iJ7XItGPPks5rxZ_7gaJpZM4NAZVI>
.
|
|
すいません,遅くなりました.
なるほど. PR2のカメラなどもそうですが,キャリブ済みカメラモデルや,もしかしたらreachability mapとかも また,コメントいただいている の方法がかなりよさそうに思いました. こちらでPRを更新してみたいと思います |
|
#511 (comment)
なので、別なロボットのrobot.lがloadされると問題がおこりえることが分かりました。
となって、:init-ending-orgを使うものが上書きされるようでした。 |
[jsk_hrp2_ros_bridge/jsk_hrp2_ros_bridge.launch] Add voice_text.launc…
Update version of #508.
修正点
&rest argsが元々:init-endingの要所要所についてましたが、不要だったのと、jskeusの:init-endingの引数仕様をかえてしまってることになるので、削除しました。