Skip to content

Active vesselモデル

Flight中の操作機体の形状とパーツ配置を、RViz向けの簡略化したURDFとTFとして公開します。

出力Topic

TopicQoS内容
/ksp_vessel/robot_descriptionstd_msgs/msg/StringReliable / transient local / depth 1URDF文字列
/ksp_vessel/root_framestd_msgs/msg/StringReliable / transient local / depth 1root link名
/tftf2_msgs/msg/TFMessagedynamicbase_linkからCoM基準proxy root
/tf_statictf2_msgs/msg/TFMessageReliable / transient local固定jointとセンサー取付frame
/ksp_vessel/lifecycleVesselLifecycleReliable / transient localvessel ID、generation、model readiness
bash
ros2 topic echo --once /ksp_vessel/root_frame
ros2 topic echo --once /ksp_vessel/robot_description

RViz2

  1. ros2 topic echo --once /ksp_vessel/root_frameでroot名を確認
  2. RViz2のFixed Frameへその値を設定
  3. RobotModelのDescription SourceをTopicへ変更
  4. Description Topicを/ksp_vessel/robot_descriptionへ設定

bridgeがURDF固定jointを/tf_staticへpublishし、CoM変化があるroot edgeだけを/tfへ既定5 Hzで更新するため、この表示だけなら別のrobot_state_publisherは不要です。

更新と期限切れ

  • Flight中は操作機体のモデルを送信します。センサーパーツを搭載していない機体も対象です。
  • 毎回の更新で全パーツの現在の形状と相対姿勢を取得します。構成変更だけでなく、展開・可動・サイズ変更もURDFとTFへ反映します(連続アニメーションではなく更新間隔ごとのスナップショットです)。
  • 既定の再送間隔は2秒です。
  • 受信モデルの有効期限はmax(3秒, refresh間隔 × 3)です。既定では6秒です。
  • active vessel切替やFlight終了ではclearを送ります。
  • 同じvessel IDとmodel hashの定期再送ではproxyを再生成しません。
  • Ground Truthで機体切替を先に検出した場合、不一致modelを直ちに切断します。
  • clear時と期限切れ時は、URDFとroot frameへ空文字列をpublishします。

センサーframeとの接続

受信センサーパケットのpartFlightIdがURDFのpart mappingに存在すると、bridgeは対応linkの子へセンサーposeを/tf_staticで配信します。LiDAR / Image / CameraInfoのframe_idpylon_<sensor_id>_<kind>_frame形式の安定した子frameに一致します。

モデルがない、期限切れ、またはpart mappingにない間も同じsensor frame名を使いますが、機体TFへは接続されません。VesselLifecycle.model_readyで区別できます。

モデルの形状と受信条件

  • link名はKSPの永続的なvessel IDの短縮prefixを含む匿名名です。同じ機体の再ロードで安定し、機体間では衝突しません。
  • 標準・DLC・MODのパーツ名による対応表は使わず、機体の全パーツを走査します。
  • visual / collisionは描画要素の形状に近いbox、cylinder、sphereだけです。SkinnedMeshはアニメーション用local boundsを直方体で近似します。
  • 描画要素がない場合は非trigger colliderを近似し、それもないパーツには25 cmの直方体を置きます。
  • 1パーツあたり最大48形状とし、超過分は全体を覆う1つの直方体にまとめます。
  • 各linkの座標はメートル単位です。パーツのスケールを位置・寸法へ反映し、円柱の軸をURDFのZ軸へ変換します。
  • mesh colliderも近いprimitiveへ単純化し、元meshは含みません。
  • GameData path、part名、メーカー名、textureを含みません。
  • gzip、base64、SHA-256、chunk数、展開サイズを検証します。
  • XMLは許可したURDFタグと属性だけを受け入れ、mesh、外部URI、DTD、entityを拒否します。
  • bridgeはURDFをファイルへ保存せず、メモリ上だけで保持します。

既定では非loopback送信元のモデルパケットを拒否します。別ホストで使う場合だけ、KSP側allowRemoteUrdf = trueとbridge側--allow-remote-modelsを両方指定してください。ROS2 Topicの到達範囲はDDS設定に従うため、必要に応じてROS_LOCALHOST_ONLY=1やSROS2も使用します。

共通モデル設定

GameData/PyLoN/Config/Runtime.cfgPYLON_MODELで送信を設定し、通信先はPYLON_TRANSPORTで共通管理します。LiDARパーツの有無や設定に依存しません。設定一覧を参照してください。機体切替またはFlight開始時にモデル設定を読み直します。

PyLoNを使ったROS2アプリケーション開発のためのガイドとAPIリファレンス