【Maniskill】Pose说明
Pose是 ManiSkill 对的批量封装,统一了 CPU/GPU 与多并行子场景下的位姿管理,支持张量/列表/SAPIEN 对象互转,并提供与 SAPIEN 相同的乘法、求逆、矩阵转换等接口。
·
Pose
Pose 是 ManiSkill 对 sapien.Pose 的批量封装,统一了 CPU/GPU 与多并行子场景下的位姿管理,支持张量/列表/SAPIEN 对象互转,并提供与 SAPIEN 相同的乘法、求逆、矩阵转换等接口。
创建方式
Pose.create_from_pq(p=None, q=None, device=None):从位置p与四元数q构造,可自动补零/单位四元数、推断设备,并在批尺寸不一致时自动广播。Pose.create(pose, device=None):接受sapien.Pose、Pose、(N,7)/(7,)张量或sapien.Pose列表,统一转成批量存储。若输入仅含位置(N,3),会自动调用create_from_pq。- 索引/切片:
pose[0]、pose[1:3]返回新的Pose,保持批语义;len(pose)等于批大小。 Pose.to(device):迁移到指定torch.device。
def __getitem__(self, i):
return Pose.create(self.raw_pose[i])
def to(self, device: Device):
if self.raw_pose.device == device:
return self
return Pose.create(self.raw_pose.to(device))
属性
raw_pose:(N,7)张量,前 3 维为位置p,后 4 维为单位四元数q。p/q: 读写属性,直接返回(N,3)、(N,4);可用pose.p = ...、pose.q = ...原地更新。shape:torch.Size(N,7);device: 所在设备。sp: 将批量 size 必须为 1 的Pose转回sapien.Pose。
主要方法
__mul__(other): 批量实现 SAPIEN Pose 乘法,自动广播批维。inv(): 返回批量求逆的Pose。to_transformation_matrix(): 生成(N,4,4)齐次变换矩阵。get_p()/get_q(),set_p(p)/set_q(q): PyTorch 风格 getter/setter。
辅助函数
vectorize_pose(pose, device=None): 将sapien.Pose/Pose/原始数组转换成(N,7)张量。to_sapien_pose(pose): 将单个Pose或(7,)向量转成sapien.Pose(批量输入需先索引)。
def vectorize_pose(...):
...
def to_sapien_pose(pose):
...
示例
from mani_skill.utils.structs.pose import Pose
# 直接用位置和四元数构造,并广播四元数
pose = Pose.create_from_pq(
p=[[0, 0, 0.1], [0.1, 0, 0.1]],
q=[1, 0, 0, 0],
)
# 乘法、求逆与矩阵化操作
tcp_in_world = Pose.create(env.agent.tcp_pose.raw_pose)
cube_in_world = Pose.create(env.cube.pose.raw_pose)
tcp_to_cube = tcp_in_world.inv() * cube_in_world
transform = tcp_to_cube.to_transformation_matrix() # shape = (1,4,4)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)