テーマ
Active vesselモデル
Flight中の操作機体の形状とパーツ配置を、RViz向けの簡略化したURDFとTFとして公開します。
出力Topic
| Topic | 型 | QoS | 内容 |
|---|---|---|---|
/ksp_vessel/robot_description | std_msgs/msg/String | Reliable / transient local / depth 1 | URDF文字列 |
/ksp_vessel/root_frame | std_msgs/msg/String | Reliable / transient local / depth 1 | root link名 |
/tf | tf2_msgs/msg/TFMessage | dynamic | base_linkからCoM基準proxy root |
/tf_static | tf2_msgs/msg/TFMessage | Reliable / transient local | 固定jointとセンサー取付frame |
/ksp_vessel/lifecycle | VesselLifecycle | Reliable / transient local | vessel ID、generation、model readiness |
bash
ros2 topic echo --once /ksp_vessel/root_frame
ros2 topic echo --once /ksp_vessel/robot_descriptionRViz2
ros2 topic echo --once /ksp_vessel/root_frameでroot名を確認- RViz2のFixed Frameへその値を設定
- RobotModelのDescription SourceをTopicへ変更
- 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_idはpylon_<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は含みません。
GameDatapath、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.cfgのPYLON_MODELで送信を設定し、通信先はPYLON_TRANSPORTで共通管理します。LiDARパーツの有無や設定に依存しません。設定一覧を参照してください。機体切替またはFlight開始時にモデル設定を読み直します。