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:
# 调整 parentFramePosition
parent_frame_position = [-lever_length / 3, 0, 0]
constraint_id = p.createConstraint(
parentBodyUniqueId=lever_body, # 杠杆
parentLinkIndex=-1, # 杠杆的基座
childBodyUniqueId=pivot_body, # 支点
childLinkIndex=-1, # 支点的基座
jointType=p.JOINT_REVOLUTE, # 旋转关节
jointAxis=[0, 0, 1], # 绕 Z 轴旋转
parentFramePosition=parent_frame_position, # 支点在杠杆上的位置(相对于杠杆局部坐标系)
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()
代码无法构造旋转约束