import math, random
class Sim2RealAnalyzer:
def __init__(self):
self.g_sim = 9.81
self.g_real = 9.81
def domain_randomization(self, n_samples=100):
params = {
'mass': (5.5, 7.0),
'friction': (0.4, 0.8),
'latency': (0.001, 0.005),
'motor_torque_const': (0.08, 0.12),
'leg_length': (0.28, 0.32),
}
samples = []
for _ in range(n_samples):
sample = {k: random.uniform(v[0], v[1]) for k, v in params.items()}
samples.append(sample)
return samples, params
def compute_sim_real_gap(self, sim_params, real_params):
gap = {}
for k in real_params:
if k in sim_params:
gap[k] = abs(sim_params[k] - real_params[k]) / real_params[k] * 100
return gap
def policy_transfer_score(self, n_distributions=10, n_tests=20):
scores = []
for d in range(n_distributions):
success = 0
for _ in range(n_tests):
friction = random.uniform(0.3, 0.8)
mass_err = random.gauss(0, 0.1)
if abs(mass_err) < 0.15 and friction > 0.35:
success += 1
scores.append(success / n_tests)
return scores
s2r = Sim2RealAnalyzer()
print("=" * 55)
print(" Sim2Real Analysis Simulation")
print("=" * 55)
# Domain randomization
samples, param_ranges = s2r.domain_randomization(100)
print(f"\n [Domain Randomization: {len(samples)} samples]")
for param, (lo, hi) in param_ranges.items():
vals = [s[param] for s in samples]
print(f" {param:25s}: [{lo:.3f}, {hi:.3f}], mean={sum(vals)/len(vals):.3f}")
# Sim-real gap
print(f"\n [Sim-Real Gap Analysis]")
sim_params = {'mass': 6.2, 'friction': 0.6, 'latency': 0.003, 'motor_torque_const': 0.1, 'leg_length': 0.3}
for real_mass_err in [0, 5, 10, 20]:
real_params = dict(sim_params)
real_params['mass'] = 6.2 * (1 + real_mass_err/100)
gap = s2r.compute_sim_real_gap(sim_params, real_params)
print(f" Mass error {real_mass_err}%: gaps = {', '.join(f'{k}={v:.1f}%' for k,v in gap.items())}")
# Transfer score
scores = s2r.policy_transfer_score()
print(f"\n [Policy Transfer Score]")
print(f" Avg: {sum(scores)/len(scores):.2f}, Min: {min(scores):.2f}, Max: {max(scores):.2f}")
print()
print(" OK - Sim2Real analysis complete")
仿真结果:
=======================================================
Sim2Real Analysis Simulation
=======================================================
[Domain Randomization: 100 samples]
mass : [5.500, 7.000], mean=6.317
friction : [0.400, 0.800], mean=0.611
latency : [0.001, 0.005], mean=0.003
motor_torque_const : [0.080, 0.120], mean=0.099
leg_length : [0.280, 0.320], mean=0.300
[Sim-Real Gap Analysis]
Mass error 0%: gaps = mass=0.0%, friction=0.0%, latency=0.0%, motor_torque_const=0.0%, leg_length=0.0%
Mass error 5%: gaps = mass=4.8%, friction=0.0%, latency=0.0%, motor_torque_const=0.0%, leg_length=0.0%
Mass error 10%: gaps = mass=9.1%, friction=0.0%, latency=0.0%, motor_torque_const=0.0%, leg_length=0.0%
Mass error 20%: gaps = mass=16.7%, friction=0.0%, latency=0.0%, motor_torque_const=0.0%, leg_length=0.0%
[Policy Transfer Score]
Avg: 0.76, Min: 0.65, Max: 0.90
OK - Sim2Real analysis complete