bullet3 icon indicating copy to clipboard operation
bullet3 copied to clipboard

旋转关节约束(p.JOINT_REVOLUTE)创建失败

Open WeiShenTXWS opened this issue 9 months ago • 1 comments

问题描述 在使用 PyBullet 创建旋转关节约束(p.JOINT_REVOLUTE)时,约束创建失败,错误信息为 unknown constraint type。点对点约束(p.JOINT_POINT2POINT)可以成功创建,但旋转关节无法正常工作。

复现步骤 运行以下代码:

python 复制 import pybullet as p import pybullet_data import time

连接到物理服务器

physicsClient = p.connect(p.GUI) # 使用 GUI 模式 p.setGravity(0, 0, -9.81) # 设置重力

设置数据路径

p.setAdditionalSearchPath(pybullet_data.getDataPath())

加载地面

planeId = p.loadURDF("plane.urdf")

创建杠杆

lever_length = 6 # 杠杆长度 lever_width = 0.1 # 杠杆宽度 lever_height = 0.1 # 杠杆高度

创建杠杆的碰撞形状和视觉形状

lever_collision_shape = p.createCollisionShape(p.GEOM_BOX, halfExtents=[lever_length / 2, lever_width / 2, lever_height / 2]) lever_visual_shape = p.createVisualShape(p.GEOM_BOX, halfExtents=[lever_length / 2, lever_width / 2, lever_height / 2], rgbaColor=[0, 1, 0, 1])

将杠杆位置升高,避免与地面碰撞

lever_base_position = [0, 0, lever_height / 2 + 0.5] # 将杠杆升高 0.5 米

创建杠杆刚体

lever_body = p.createMultiBody( baseMass=1, # 杠杆质量 baseCollisionShapeIndex=lever_collision_shape, baseVisualShapeIndex=lever_visual_shape, basePosition=lever_base_position # 初始位置 )

计算支点位置(杠杆的 1/3 处)

pivot_position = [-lever_length / 3, 0, lever_base_position[2]] # 支点在杠杆的 1/3 处,高度与杠杆一致

创建支点(固定点)

pivot_body = p.createMultiBody( baseMass=0, # 支点质量为 0,表示固定点 baseCollisionShapeIndex=-1, # 无碰撞形状 baseVisualShapeIndex=-1, # 无视觉形状 basePosition=pivot_position # 支点位置 )

打印调试信息

print("杠杆 ID:", lever_body) print("支点 ID:", pivot_body)

测试创建旋转关节约束

try: constraint_id = p.createConstraint( parentBodyUniqueId=lever_body, # 杠杆 parentLinkIndex=-1, # 杠杆的基座 childBodyUniqueId=pivot_body, # 支点 childLinkIndex=-1, # 支点的基座 jointType=p.JOINT_REVOLUTE, # 旋转关节 jointAxis=[0, 0, 1], # 绕 Z 轴旋转 parentFramePosition=[lever_length / 3, 0, 0], # 支点在杠杆上的位置(相对于杠杆局部坐标系) childFramePosition=[0, 0, 0], # 支点在其自身坐标系中的位置 parentFrameOrientation=[0, 0, 0, 1], # 方向(四元数) childFrameOrientation=[0, 0, 0, 1] # 方向(四元数) ) print("旋转关节约束创建成功!约束 ID:", constraint_id) except Exception as e: print("旋转关节约束创建失败!错误信息:", e)

运行仿真

for _ in range(1000): p.stepSimulation() time.sleep(1 / 240) # 控制仿真速度

断开连接

p.disconnect() 运行代码后,旋转关节约束创建失败,错误信息为:

复制 b3Printf: unknown constraint type b3Printf: createConstraint failed 旋转关节约束创建失败!错误信息:createConstraint failed. 期望行为 旋转关节约束应成功创建,杠杆可以绕支点旋转。

实际行为 旋转关节约束创建失败,错误信息为 unknown constraint type。

环境信息 PyBullet 版本:最新版本(通过 pip install --upgrade pybullet 安装)。

操作系统:Windows 10。

Python 版本:3.9。

硬件信息:Intel(R) Arc(TM) Graphics。

其他信息 点对点约束(p.JOINT_POINT2POINT)可以成功创建。

固定关节(p.JOINT_FIXED)也可以成功创建。

WeiShenTXWS avatar Mar 23 '25 03:03 WeiShenTXWS

could you please repost in English?

Avithohol avatar Mar 25 '25 20:03 Avithohol