You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于MultibodyPlant的get_state_output_port输出格式技术问询

关于MultibodyPlant::get_state_output_port的常见问题解答

问题1:多刚体场景下,状态输出是否先拼接所有位置量,再拼接所有速度量?

是的,get_state_output_port的输出向量严格遵循**先所有广义位置量(q),后所有广义速度量(v)**的结构:

  • 前半段是广义位置向量q,长度等于plant.num_positions(),顺序对应模型中关节(包括自由刚体默认添加的6DOF关节)的添加顺序,每个关节的位置变量按其定义的自由度顺序排列。
  • 后半段是广义速度向量v,长度等于plant.num_velocities(),顺序与q完全一一对应,每个关节的速度变量同样按自由度顺序排列。

问题2:通过AddRigidBody逐个添加刚体后,如何定位其在状态输出向量中的对应片段?

当你用AddRigidBody添加自由刚体时,MultibodyPlant会自动为该刚体创建一个6DOF的固定-base关节(默认命名为{刚体名}_joint)。你可以通过以下步骤定位状态片段:

  1. 获取刚体对应的自动生成关节:
    joint = plant.GetJointByName(f"{body.name()}_joint")
    
  2. 获取该关节在q和v中的索引范围:
    • 位置片段:起始索引q_start = joint.position_start(),结束索引q_end = q_start + joint.num_positions(),对应状态向量的state[q_start:q_end]
    • 速度片段:起始索引v_start = joint.velocity_start(),结束索引v_end = v_start + joint.num_velocities(),对应状态向量的state[plant.num_positions():][v_start:v_end](因为状态向量前半段是q,长度为plant.num_positions())

问题3:是否有方法查看状态输出向量每个索引对应的刚体及变量信息?

有多种实用方法可以获取状态变量的明细:

  • 直接获取名称列表:使用plant.GetPositionNames()和plant.GetVelocityNames()函数,分别返回q和v中每个索引对应的变量名称字符串列表,名称会明确标注所属刚体、关节及变量类型(例如"my_body_x"、"my_body_theta"、"my_body_vx")。
  • 按关节遍历查询:遍历模型中的每个关节,通过joint.position_start()、joint.num_positions()确定位置变量的索引范围,再用joint.get_position_name(i)获取单个位置变量的名称;速度变量同理使用joint.get_velocity_name(i)。
  • 可视化模型结构:使用plant.ExportModelToDot()生成DOT格式的模型结构文件,其中包含关节与状态变量的关联关系,可通过Graphviz工具可视化查看。

内容的提问来源于stack exchange,提问作者HoliInn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:22:27