v1.1.1; fix base vel calc bug, fix last_torque reset bug
This commit is contained in:
@@ -1,4 +1,8 @@
|
||||
# UPDATE
|
||||
## 20260113
|
||||
### v1.1.1
|
||||
1. 修复base lin vel计算错误,错误将世界坐标系下的速度作为了body坐标系下的速度,导致关键指标计算错误,重新评估
|
||||
2. 修复TorqueSmoothnessMetric中last_torque未在episode重置时重置的问题
|
||||
## 20260110
|
||||
### v1.1.0
|
||||
1. 修复三个Metric计算错误
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
|
||||
<worldbody>
|
||||
<body name="base_link" pos="0 0 0.445" childclass="go2">
|
||||
<!-- <body name="base_link" pos="0 0 0.445" quat="0.707 0 0 0.707" childclass="go2"> -->
|
||||
<!-- <body name="base_link" pos="-5 1.2 0.445" childclass="go2"> -->
|
||||
<inertial pos="0.021112 0 -0.005366" quat="-0.000543471 0.713435 -0.00173769 0.700719"
|
||||
mass="6.921"
|
||||
|
||||
@@ -39,7 +39,7 @@ class BaseGauge:
|
||||
self.goal_str = "Init"
|
||||
self.goal_idx = 0
|
||||
self.goals: List[BaseGoal] = []
|
||||
self.metrics: List[function] = []
|
||||
self.metrics: List[BaseMetric] = []
|
||||
self.info = {'goal': [], 'metric': []}
|
||||
self.results = {} # {'goal/sub_goal': {'metric': result}}
|
||||
|
||||
@@ -134,7 +134,7 @@ class BaseGauge:
|
||||
self.create_new_goal_logger()
|
||||
|
||||
def update_metrics(self, sim_data: SimData, goal_data: GoalData):
|
||||
if sim_data.n_step % int(self.cfg.metrics.metric_dt / sim_data.sim_dt) != 0:
|
||||
if sim_data.n_step % int(self.cfg.metrics.metric_dt / sim_data.sim_dt + 1e-9) != 0:
|
||||
return
|
||||
metrics_results = {}
|
||||
for metric_name, metric_obj in zip(self.info['metric'], self.metrics):
|
||||
@@ -143,6 +143,10 @@ class BaseGauge:
|
||||
metrics_results[metric_name] = val
|
||||
self.goals[self.goal_idx].update_metrics(metrics_results)
|
||||
|
||||
def reset_metrics(self):
|
||||
for metric in self.metrics:
|
||||
metric.reset()
|
||||
|
||||
def save_results(self):
|
||||
""" Save the results to a yaml file. """
|
||||
metrics = defaultdict(lambda: defaultdict(list))
|
||||
|
||||
@@ -28,6 +28,8 @@ class LinVelErrMetric(BaseMetric):
|
||||
cmds = cfg_commands.get(name)
|
||||
if cmds is not None:
|
||||
max_ranges.append(max(abs(cmds[0]), abs(cmds[1])))
|
||||
if not max_ranges:
|
||||
raise ValueError("[LinVelErrMetric] No linear velocity commands found in robot configuration.")
|
||||
self.norm_vel = np.linalg.norm(max_ranges)
|
||||
|
||||
def __call__(self, sim_data: SimData, goal_data: GoalData) -> float:
|
||||
@@ -52,6 +54,8 @@ class AngVelErrMetric(BaseMetric):
|
||||
cmds = cfg_commands.get(name)
|
||||
if cmds is not None:
|
||||
max_ranges.append(max(abs(cmds[0]), abs(cmds[1])))
|
||||
if not max_ranges:
|
||||
raise ValueError("[AngVelErrMetric] No angular velocity commands found in robot configuration.")
|
||||
self.norm_vel = np.linalg.norm(max_ranges)
|
||||
|
||||
def __call__(self, sim_data: SimData, goal_data: GoalData) -> float:
|
||||
|
||||
@@ -137,6 +137,7 @@ class BasePipeline:
|
||||
self.first_reset = True
|
||||
sim_data = self.sim.step()
|
||||
self.robot.reset()
|
||||
self.gauge.reset_metrics()
|
||||
return sim_data
|
||||
|
||||
def add_noise(self, sim_data: SimData):
|
||||
|
||||
@@ -20,7 +20,7 @@ from typing import Literal, List
|
||||
|
||||
from robogauge.utils.logger import logger
|
||||
from robogauge.utils.helpers import parse_path
|
||||
from robogauge.utils.math_utils import get_projected_gravity
|
||||
from robogauge.utils.math_utils import get_projected_gravity, quat_rotate_inverse
|
||||
from robogauge.tasks.simulator.mujoco_config import MujocoConfig
|
||||
from robogauge.tasks.simulator.sim_data import (
|
||||
SimData,
|
||||
@@ -248,20 +248,24 @@ class MujocoSimulator:
|
||||
pos=self.get_sensor_data('imu_pos'),
|
||||
quat=self.get_sensor_data('imu_quat'),
|
||||
acc=self.get_sensor_data('imu_acc'),
|
||||
lin_vel=self.get_sensor_data('imu_lin_vel'),
|
||||
ang_vel=self.get_sensor_data('imu_ang_vel'),
|
||||
lin_vel=self.get_sensor_data('imu_lin_vel'), # body frame, check direction, go2 is inverted
|
||||
ang_vel=self.get_sensor_data('imu_ang_vel'), # body frame, check direction, go2 is inverted
|
||||
),
|
||||
base=BaseState(
|
||||
pos=self.mj_data.qpos[:3], # world frame
|
||||
quat=self.mj_data.qpos[3:7], # world frame
|
||||
lin_vel=self.mj_data.qvel[:3], # body frame
|
||||
ang_vel=self.mj_data.qvel[3:6], # body frame
|
||||
lin_vel=quat_rotate_inverse(self.mj_data.qpos[3:7], self.mj_data.qvel[:3]), # body frame
|
||||
ang_vel=quat_rotate_inverse(self.mj_data.qpos[3:7], self.mj_data.qvel[3:6]), # body frame
|
||||
)
|
||||
)
|
||||
if self.n_step % int(0.1 / self.sim_dt) == 0:
|
||||
logger.log(value=np.mean(proprio.imu.quat - proprio.base.quat), tag="sim/delta_quat", step=self.n_step)
|
||||
logger.log(value=np.mean(proprio.imu.ang_vel - proprio.base.ang_vel), tag="sim/delta_ang_vel", step=self.n_step)
|
||||
logger.log(value=np.mean(proprio.imu.lin_vel - proprio.base.lin_vel), tag="sim/delta_lin_vel", step=self.n_step)
|
||||
logger.log(value=proprio.imu.lin_vel[0], tag="sim/imu_lin_vel_x", step=self.n_step)
|
||||
logger.log(value=proprio.imu.lin_vel[1], tag="sim/imu_lin_vel_y", step=self.n_step)
|
||||
logger.log(value=proprio.base.lin_vel[0], tag="sim/base_lin_vel_x", step=self.n_step)
|
||||
logger.log(value=proprio.base.lin_vel[1], tag="sim/base_lin_vel_y", step=self.n_step)
|
||||
if self.n_step == 0:
|
||||
self.debug_print_proprio_shapes()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user