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

如何获取凸体的轴对齐包围盒(AABB)以实现与地面贴合

获取Drake中凸体的轴对齐包围盒(AABB)

要获取你添加的凸体的AABB并调整其位置与地面齐平,按以下步骤操作:

1. 确保SceneGraph关联与Plant初始化完成

首先确认代码中已关联SceneGraph(Drake处理几何查询的核心组件),并在添加完所有刚体和几何后完成Plant的初始化:

from pydrake.geometry import SceneGraph

# 初始化阶段关联SceneGraph
scene_graph = SceneGraph()
self.plant.RegisterAsSourceForSceneGraph(scene_graph)

# 在添加完所有凸体、刚体之后执行
self.plant.Finalize()

2. 创建上下文并获取几何查询对象

Drake的几何计算依赖上下文(Context),需要创建Plant的默认上下文,并获取用于几何查询的QueryObject:

# 创建Plant默认上下文
plant_context = self.plant.CreateDefaultContext()
# 从根上下文获取SceneGraph的上下文
scene_graph_context = scene_graph.GetMyContextFromRoot(plant_context)
# 获取几何查询对象
query_object = scene_graph.get_query_output_port().Eval(scene_graph_context)

3. 计算凸体的AABB

你可以通过之前保存的geom_id直接计算该凸体在世界坐标系下的AABB:

# 计算世界坐标系下的AABB
world_aabb = query_object.ComputeAabb(geom_id)
# 获取世界坐标系下的最低点z值
world_min_z = world_aabb.z_min()

如果需要获取凸体自身局部坐标系下的AABB(用于后续调整刚体初始位姿更方便),可以通过SceneGraph的检查器获取原始形状数据:

# 获取几何形状的检查器
inspector = scene_graph.inspector()
# 获取对应geom_id的形状
convex_shape = inspector.GetShape(geom_id)
# 生成局部坐标系下的AABB
local_aabb = convex_shape.MakeAabb()
# 获取局部坐标系下的最低点z值
local_min_z = local_aabb.z_min()

4. 调整凸体位置与地面齐平

如果地面是z=0的平面,要让凸体最低点与地面齐平,只需将刚体的初始z坐标设置为-local_min_z(抵消局部坐标系下最低点的偏移):

# 调整初始位姿的z分量,使凸体最低点对齐z=0地面
H = RigidTransform(RotationMatrix(np.eye(3)), np.array([0., 0., -local_min_z]))
# 用调整后的H添加刚体和几何(替换你原代码中的H)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:00:43