一、核心函数 1:p.getNumJoints(robot_id)
1. 语法格式
num_joints = p.getNumJoints(bodyUniqueId)
介绍 PyBullet 中用于机器人关节筛选与姿态校准的核心函数。通过 p.getNumJoints 获取总关节数,利用 p.getJointInfo 过滤固定关节以识别可动关节。随后使用 p.resetJointState 将关节重置为零位,配合 p.stepSimulation 更新仿真状态。最后通过 p.getLinkState 读取末端执行器的世界坐标。该流程实现了机器人零位姿态的初始化与诊断,为后续运动控制提供基础数据支持。
p.getNumJoints(robot_id)num_joints = p.getNumJoints(bodyUniqueId)
| 参数名 | 类型 | 说明 |
|---|---|---|
bodyUniqueId(此处为 robot_id) | int | 必选参数,机器人模型的唯一 ID(由 p.loadURDF() 加载模型时返回),用于指定要查询的目标机器人 |
整数类型(int),表示目标机器人的总关节数量(包含固定关节、旋转关节、移动关节等所有类型的关节,基座不被计入关节数量)。
num_joints = p.getNumJoints(robot_id)
获取 robot_id 对应的机器人总关节数,为后续遍历所有关节(for i in range(num_joints))提供循环范围,确保不会遗漏或超出关节索引范围。
p.getJointInfo(robot_id, i)joint_info_tuple = p.getJointInfo(bodyUniqueId, jointIndex)
| 参数名 | 类型 | 说明 |
|---|---|---|
bodyUniqueId(robot_id) | int | 必选参数,机器人模型唯一 ID,指定查询对象 |
jointIndex(此处为 i) | int | 必选参数,关节索引(范围:0 ~ 总关节数 -1),指定要查询的具体关节 |
不可变元组(tuple),包含约 20 项关节属性。
通过 info[2] != p.JOINT_FIXED 筛选可动关节,关键常量说明:
| 常量名 | 数值 | 含义 | 是否可动 |
|---|---|---|---|
p.JOINT_FIXED | 4 | 固定关节(连杆间刚性连接,无相对运动) | 否(需过滤) |
p.JOINT_REVOLUTE | 0 | 旋转关节(绕单轴旋转,如机械臂关节) | 是(保留) |
p.JOINT_PRISMATIC | 1 | 移动关节(沿单轴平移,如直线滑台) | 是(保留) |
p.JOINT_SPHERICAL | 2 | 球关节(三维旋转,如肩关节) | 是(保留) |
示例逻辑:
info = p.getJointInfo(robot_id, i)
if info[2] != p.JOINT_FIXED:
pybullet_joint_indices.append(i)
i,获取关节详细信息 info;info[2] 获取关节类型,排除固定关节(p.JOINT_FIXED);pybullet_joint_indices 列表,为后续关节控制(如力矩控制、位置控制)提供目标关节集合。p.resetJointState(robot_id, j, 0)p.resetJointState(bodyUniqueId, jointIndex, targetValue, targetVelocity=0.0)
| 参数名 | 类型 | 说明 |
|---|---|---|
bodyUniqueId(robot_id) | int | 必选参数,机器人模型唯一 ID |
jointIndex(此处为 j) | int | 必选参数,要重置状态的关节索引(此处为可动关节索引) |
targetValue(此处为 0) | float | 必选参数,关节目标位置(旋转关节:单位为弧度;移动关节:单位为米) |
targetVelocity | float | 可选参数,关节目标速度,默认值为 0.0 |
示例:
for j in pybullet_joint_indices:
p.resetJointState(robot_id, j, 0)
遍历所有可动关节,将每个关节的位置强制重置为 0(弧度),使机器人进入零位姿态(机械臂的初始校准姿态,用于后续误差分析和运动规划)。
p.getLinkState(robot_id, end_effector_link_index)link_state_tuple = p.getLinkState(bodyUniqueId, linkIndex, computeForwardKinematics=False)
| 参数名 | 类型 | 说明 |
|---|---|---|
bodyUniqueId(robot_id) | int | 必选参数,机器人模型唯一 ID |
linkIndex(end_effector_link_index) | int | 必选参数,连杆索引(范围:-1 ~ 总连杆数 -1;-1 对应基座,非负整数对应具体连杆) |
computeForwardKinematics | bool | 可选参数,是否强制计算正运动学,默认值为 False(优先使用缓存数据,提升效率) |
不可变元组(tuple),核心属性索引说明(代码中用到索引 0 的连杆位置):
| 元组索引 | 属性含义 | 类型 | 代码中的使用 |
|---|---|---|---|
| 0 | 连杆世界坐标系位置 | tuple | ee_state[0]:获取末端执行器的三维坐标(x, y, z) |
| 1 | 连杆世界坐标系姿态(四元数) | tuple | 未使用,可用于获取末端执行器的旋转姿态 |
| 2 | 连杆局部坐标系位置(相对于基座) | tuple | 未使用 |
| 3 | 连杆局部坐标系姿态(相对于基座) | tuple | 未使用 |
| 4+ | 连杆速度等进阶属性 | - | 未使用 |
示例:
ee_state = p.getLinkState(robot_id, end_effector_link_index)
ee_pos_zero = ee_state[0]
p.getLinkState(...):获取末端执行器连杆的完整状态(位置、姿态等);ee_state[0]:提取末端执行器在世界坐标系下的三维位置,并赋值给 ee_pos_zero;p.stepSimulation()p.stepSimulation(physicsClientId=0)
p.resetJointState() 之后调用,用于更新仿真世界的状态,确保 p.getLinkState() 能获取到零位姿态下的最新末端执行器位置(若不调用,可能获取到重置前的旧状态)。| 函数名 | 核心功能 | 必选参数 | 返回值 | 代码中的用途 |
|---|---|---|---|---|
p.getNumJoints(robot_id) | 获取机器人总关节数 | robot_id(模型 ID) | 整数(总关节数) | 为关节遍历提供循环范围 |
p.getJointInfo(robot_id, i) | 获取单个关节详细信息 | robot_id(模型 ID)、i(关节索引) | 元组(关节属性) | 筛选非固定关节,收集可动关节索引 |
p.resetJointState(robot_id, j, 0) | 重置关节位置 / 速度 | robot_id(模型 ID)、j(关节索引)、0(目标位置) | 无返回值 | 将可动关节重置为 0,初始化零位姿态 |
p.getLinkState(robot_id, ee_link_idx) | 获取连杆位置 / 姿态 | robot_id(模型 ID)、ee_link_idx(连杆索引) | 元组(连杆状态) | 读取零位姿态下末端执行器的世界坐标 |
p.stepSimulation() | 步进物理仿真 | 无(默认仿真客户端 ID=0) | 无返回值 | 刷新仿真状态,确保零位姿态生效 |
p.getJointInfo 和 p.getLinkState 是获取机器人结构信息的核心,p.resetJointState 是姿态初始化的关键;p.getJointInfo 的关节类型(索引 2)排除 p.JOINT_FIXED,得到可动关节索引列表;p.resetJointState 重置关节为 0 + p.stepSimulation 刷新状态 + p.getLinkState 读取末端位置,形成完整的零位诊断流程;robot_id(模型唯一 ID)为首要参数,关节 / 连杆索引为核心定位参数,返回值多为元组类型,需按索引提取目标属性。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online