关于Drake中MultibodyPlant使用及添加Box刚体的技术咨询
Drake仿真常见问题解答
环境配置
- Drake 1.9.0
- Python 3.7
- 操作系统:Ubuntu 20.04
- PyCharm
问题1:是否所有需交互和接触动力学仿真的模型必须属于同一个MultibodyPlant?该假设是否成立?
是的,这个假设成立。Drake的接触动力学仿真(包括碰撞检测、接触力计算)仅在单个MultibodyPlant实例内完成,跨Plant的模型无法直接进行接触交互。所有需要发生碰撞、接触的刚体必须添加到同一个MultibodyPlant中,由Plant统一管理所有刚体状态、计算接触约束。
问题2:向同一Plant添加更多ModelInstances会增加可控连杆数量,是否意味着每个可控子系统需单独创建MultibodyPlant以连接Controller LeafSystems?该假设是否成立?
这个假设不成立。你完全可以在同一个MultibodyPlant中添加多个ModelInstance,针对不同子系统(比如Kuka机械臂、其他可控机构)分别创建Controller LeafSystems即可。通过MultibodyPlant.get_actuation_input_port(model_instance)获取对应子系统的控制输入端口,将控制器输出连接到该端口就可以实现单独控制,不需要为每个可控子系统单独创建Plant。
问题3:若上述假设成立,如何协调接触仿真时间步长与各控制器-多体植物控制的时间步长?是否有相关指导?
同一个MultibodyPlant的仿真步长是全局统一的,所有连接到该Plant的控制器需要适配这个步长:
- 若使用离散控制器,控制器的更新周期必须是Plant仿真步长的整数倍,或直接与步长同步。可以通过
LeafSystem.SetPeriodicPublish或设置离散更新事件来对齐时间节点。 - 若使用连续控制器,Drake会自动在仿真的每个时间步内完成数值积分,确保控制器与Plant的动力学计算同步。
- 建议先确定MultibodyPlant的仿真步长(比如初始化时
MultibodyPlant(时间步长)),再基于该步长设计控制器的更新频率,避免步长不匹配导致仿真不稳定。
问题4:是否可以使用Box形状类直接向MultibodyPlant添加基本正方体?我研究过AddRigidBody函数,但它需要空间惯性矩阵,希望能通过辅助函数为Shape子类自动生成该矩阵。
可以直接添加,Drake提供了辅助函数自动计算惯性矩阵。示例代码如下:
from pydrake.multibody.tree import SpatialInertia, UnitInertia, RigidBody from pydrake.geometry import Box import numpy as np # 定义正方体参数 box_size = [0.2, 0.2, 0.2] mass = 1.0 # 创建Box形状 box_shape = Box(*box_size) # 基于正方体形状生成单位惯性张量 unit_inertia = UnitInertia.SolidBox(*box_size) # 构建空间惯性矩阵 spatial_inertia = SpatialInertia.MakeFromCentralInertia(mass, [0,0,0], unit_inertia) # 向Plant添加刚体 box_body = plant.AddRigidBody("box", model_instance, spatial_inertia) # 注册可视化与碰撞几何体 plant.RegisterVisualGeometry(box_body, RigidTransform(), box_shape, "box_vis", np.array([0.5,0.5,0.5,1.0])) plant.RegisterCollisionGeometry(box_body, RigidTransform(), box_shape, "box_col", 0.0)
另外,也可以用Parser加载URDF文件定义简单几何体,URDF中直接指定形状和质量后,Drake会自动计算惯性矩阵,操作更便捷。
内容的提问来源于stack exchange,提问作者L Wall
相关产品推荐
相关产品推荐

