仿真中的一步不等于现实中的一秒。记录时间步、控制频率和观测频率,才能解释同一段代码为什么在不同设置下表现不同。

三个时钟各做什么

物理时间步决定状态推进的离散间隔;控制频率决定多久更新一次命令;画面刷新只决定多久把状态画出来。暂停渲染不等于停止物理计算,调用等待函数也不能替代推进仿真状态。PyBullet 的显式步进会执行碰撞、约束求解与积分等操作。官方快速指南

同样要区分关节位置目标和末端空间目标。IK 输出只是某种关节配置的候选,随后还需映射、限位、控制与回读验证,不能把目标数组当成已经达到的实际状态。

一个受限的玩具控制回路

下面是无重力、无接触、单位惯量的单变量数值模型,只演示反馈、饱和和时间步。它不等价于 PyBullet 内部控制器,更不能直接用于真实机械臂。

import numpy as np

dt = 0.005
position, velocity, target = 0.0, 0.0, 1.0
maximum_command = 4.0
commands = []
for _ in range(2000):
    command = np.clip(12 * (target - position) - 6 * velocity,
                      -maximum_command, maximum_command)
    velocity += command * dt
    position += velocity * dt
    commands.append(command)
assert np.max(np.abs(commands)) <= maximum_command
assert abs(target - position) < 0.02
assert np.isclose(2000 * dt, 10.0)
print("toy feedback, saturation and simulation-time checks passed")

这个例子的收敛只适用于给定的方程和参数,不保证改变时间步、模型、负载或控制律后仍成立。真正的仿真实验应记录误差、速度、施力与碰撞,而不是只保存一张“到达目标”的截图。

三种控制模式的边界

位置、速度、力矩控制描述不同的命令接口。速度模式不自动保证任务完成;位置模式也不保证避障和精确到达。力矩模式仍然由物理引擎计算动力学,不是“引擎什么都不做”。

强化学习可以选择不同层级的动作空间,不必一概使用力矩动作。固定控制脚本不是学习算法;若要形成 RL 实验,还需定义观测、动作、奖励、终止条件、训练过程及独立评估。

来源与核验边界

本篇结合疏锦行强化学习专题的仿真原理、环境与运动控制讲义,重点重写时间与反馈边界。玩具控制示例已运行;未复现课程机械臂实验、未训练策略,也未操作真实硬件。视频尚未逐节核验,原课件不公开。