fkanehiro / simtrans

11 stars 14 forks source link

SDFからVRMLへの変換でリンクが消える #38

Open fkanehiro opened 8 years ago

fkanehiro commented 8 years ago

@yosuke さん、次のようなsdfを変換するとchildがいなくなってしまうのですが、なぜでしょうか?

<?xml version="1.0" ?>
<sdf version="1.5">
  <model name="test">

    <link name="parent">
    </link>
    <link name="child">
    </link>

    <joint name="joint" type="revolute">
      <parent>parent</parent>
      <child>child</child>
    </joint>
  </model>
</sdf>
yosuke commented 8 years ago

一部のモデルの変換(Atlasなど)で、上と同じような空のリンクがあり、それを空のVRMLジョイントセグメントに変換するとmodel-loader側で読み込みエラーが出たので、空のリンクは変換をスキップする処理が入っています。

リンクの中にvisualかcollisionがなく、かつ子リンクもない場合、変換をスキップするというルールにしているのですが、このルールで不都合がありそうでしたら調整します。

fkanehiro commented 8 years ago

model-loaderでどのようなエラーがでますでしょうか。以下のようなVRMLで試しましたが特にエラーは発生しませんでした。

DEF box Humanoid {
  humanoidBody [
    DEF WAIST Joint {
      jointType "fixed"
      translation 0 0 0
      rotation 0 0 1 1.5708
      children [
        DEF BODY Segment {
          mass 0.5
          children [
            Shape {
              geometry Box {
                  size 0.2 0.8 0.2
              }
              appearance Appearance {
                  material Material {
                      diffuseColor 0.0 1.0 0.0
                  }
              }
            }
          ]
        }
        DEF CHILD Joint {
          children [
            DEF CHILD_S Segment {
            }
          ]
        }
      ]
    }
  ]
  joints [
    USE WAIST,
    USE CHILD
  ]
  name "box"
  segments [
    USE BODY,
    USE CHILD_S
  ]
}

今回のケースでは、形状はないが質量はあるリンクをぶら下げたいと思っています。 なので、形状も質量も子供もないリンクは消してよいと思いますが、いずれか1つでもあるものは残していただけると助かります。

yosuke commented 8 years ago

上の例、ありがとうございます。

VRMLの出力が良くなかった(空出力のやり方が間違っていた)可能性が大ですね。

上の例でエラーが出ないのであれば変な条件判断する必要なく空は空のまま出せると思うので、そのように変更します。

yosuke commented 8 years ago

39 で変な条件判断を消去しました。

昔(最初のバージョンの開発中)はこれでロード時にエラーが出たのだけどな、、、と思っていたのですが、今は条件判断を削除してもエラーは再現しませんでした。たぶんどこかでフォーマットが間違えていたのだと思います。

fkanehiro commented 8 years ago

ありがとうございます。 あまり実害はないようなのですが、Jointが2つあるにも関わらず、Humanoidのjointsフィールドには1つしか出力されないようです。 それとsegmentsフィールドは空のようです。

yosuke commented 8 years ago

jointに関してはfixedなどのjointIdを振ってはいけないものをjointsフィールドに入れてしまうとChoreonoidでジョイントスライダー画面にスライダーが出てこないという現象があったため、対処としてこのようにしています。 ただ空セグメント同様、試行錯誤の産物なので正しいやり方があったら直します。

segmentsフィールドも無くても動いていたのでどこかのバージョンでコメントアウトしてしまったのですが、復活させておきます。

fkanehiro commented 8 years ago

はい、特に深刻な影響はなさそうなのでお手すきの際におねがいします。 スライダーの件はchoreonoid側を直すべきかと思います。

yosuke commented 8 years ago

了解しました。

もろもろ一段落したらjointsについてはもう少し症状を狭めてまずはchoreonoidの方にissueをあげておきます。 segmentsについても後ほど復活させえておきます。