code_计梦星河 2025-03-23 10:54 采纳率: 75%
浏览 15
已结题

pybullet构造旋转约束

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()

代码无法构造旋转约束

  • 写回答

5条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-03-23 10:55
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    根据代码,旋转约束的创建部分出现错误,旋转约束是无法通过`p.createConstraint`函数进行创建的。正确的做法是使用`p.createConstraint`函数结合`p.createConstraint`函数来创建约束。以下是正确的实现代码:
    # 创建旋转约束
    try:
        c = p.createConstraint(lever_body, -1, pivot_body, -1, p.JOINT_FIXED, [0, 0, 0], [0, 0, 0], [0, 0, 0.5])
        print("旋转关节约束创建成功!约束 ID:", c)
    except Exception as e:
        print("旋转关节约束创建失败!错误信息:", e)
    

    这样就能正确地创建旋转约束了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月23日