isaaclab - imu - linear velocity

전찬욱·2025년 12월 9일

linear acceleration

./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py       --task Isaac-Velocity-Flat-Unitree-Go2-v1 --headless --max_iterations 5000
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py       --task Isaac-Velocity-Flat-Unitree-Go2-v1       --num_envs 16       --checkpoint logs/rsl_rl/unitree_go2_flat_acc/2025-12-09_11-25-01/model_4999.pt       --headless --video --video_length 1000 --enable_camera
./isaaclab.sh -p -m tensorboard.main --logdir=logs
tensorboard --logdir logs --host 0.0.0.0 --port 6006

처럼 호스트를 0.0.0.0으로 지정하면 외부에서 접속 가능


• lin_acc_b is “specific force” because the IMU code explicitly adds a gravity bias in world frame before
rotating to the sensor frame.

  • source/isaaclab/isaaclab/sensors/imu/imu_cfg.py:34-42 sets gravity_bias=(0.0, 0.0, 9.81) by default and
    explains it’s to mimic IMU gravity bias.
  • source/isaaclab/isaaclab/sensors/imu/imu.py:104-131 (in _update_buffers_impl) computes lin_acc_w
    = (lin_vel_w - prev_lin_vel_w)/dt + self._gravity_bias_w, then rotates to body frame and stores in
    lin_acc_b. With the default bias, a stationary sensor gets ~[0,0,+9.81] (world up), which is the
    specific force reading.
  • The overview doc repeats this: docs/source/overview/core-concepts/sensors/imu.rst describes the +g
    default and shows an example reporting ~9.8 at rest.

• Go2 IMU has no extra transform: in source/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/
velocity/config/go2/rough_env_cfg.py:71-76 it’s created as ImuCfg(prim_path="{ENV_REGEX_NS}/Robot/
base") with no offset overrides. The defaults in source/isaaclab/isaaclab/sensors/imu/imu_cfg.py:20-34
are offset.pos=(0,0,0) and offset.rot=(1,0,0,0), so the IMU frame coincides with the base link’s frame
(same position/orientation). It inherits whatever pose the base prim has in the USD. No extra rotation/
translation beyond that.


• Edited source/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/config/go2/rough_env_cfg.py

    38 +            # scale to put resting +g (~9.81 m/s^2) inside [-1, 1] and clamp any spikes
    39 +            scale=0.1,
    40 +            clip=(-1.0, 1.0),
    41          )

• Updated Go2 rough env to normalize IMU linear acceleration so it stays in [-1,1]. In source/
isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/config/go2/rough_env_cfg.py, the
base_lin_acc observation now scales by 0.1 and clips to (-1, 1), so the default +g reading (~9.81 m/s²)
becomes ~0.98 and any spikes are clamped.

If you want a different normalization (e.g., exact 1/9.81 instead of 0.1, or removing the clip), I can
adjust.


linear acceleration에 노이즈를 0.2 씩이나 넣으니까 학습이 느리지.
› scale 0.1이면 충분할거같은데 노이즈가 생각보다 크다. 이를 줄여야한다. 데이터를 측정해보면 약 (0.3, 0.05,
0.95) 정도의 값이 정지상태일때 나왔으니 노이즈를 0.2가 아니라 0.03~0.05 정도로 하는게 합리적이라고 생각한
다.

• - Go2 IMU obs noise is from the obs term, not the sensor: source/isaaclab_tasks/isaaclab_tasks/
manager_based/locomotion/velocity/config/go2/rough_env_cfg.py:25-34 sets base_lin_acc with
noise=Unoise(n_min=-0.2, n_max=0.2), i.e., uniform ±0.2 m/s² per axis.

  • The observation pipeline (source/isaaclab/isaaclab/managers/observation_manager.py:343-414) applies:
    compute → modifiers → noise → clip → scale.
    • With clip=(-1,1) then scale=0.1, a resting +g (~9.81) is first noisy to ~9.61–10.01, then clipped to
      1, then scaled to 0.1. So the gravity channel is almost constant 0.1, and only the zero axes carry
      ±0.02 from noise—most dynamics get flattened. That can destabilize learning.
  • If you want normalized but not flattened signal, options:
    1. Remove clip and set scale=1/9.81 (or 0.102) so +g ≈ 1 and dynamics scale proportionally.
    2. Keep a wider clip, e.g., clip=(-5,5) before scaling by 0.1 (effective [-0.5,0.5]) so you don’t
      instantly saturate.
    3. Or set IMU gravity_bias=(0,0,0) and skip scaling, if you prefer raw linear accel.

노이즈를 0.2에서 0.05로 줄이고 track linear velcoity 보상가중치를 1.5에서 2.0으로 키워주었다.


수정한 결과는 만족스럽다.

시간순으로
마젠타: 정규화 이전
보라색: 수정 전
초록색: 1.5에서 2.0으로 증가해서 보상이 더 커보이는걸 감안하더라도 증가추이가 마젠타보다 더 빠르다.
최종적으로 신호가 더 강하기 때문에 마젠타보다 더 빠르게 수렴한다.

*플롯 제목에 유의.

별로인 점은 linear velocity weight를 증가시킨만큼 다른 reward들이 억제된다는 점이다. 물론 작업만 잘 하면 장땡!

0개의 댓글