Skip to content

Commit 76a2cec

Browse files
committed
Fix broadcasting bug
1 parent 65bcb7b commit 76a2cec

2 files changed

Lines changed: 26 additions & 12 deletions

File tree

tools/mujoco-simulator/mujoco-simulator/mujoco_simulator/joint_actuator_info.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ class JointActuatorInfo:
1010

1111
def __init__(self, name: str, model: MjModel) -> None:
1212
self.name = name
13-
self.qpos_addr = model.joint(name).qposadr
14-
self.qvel_addr = model.joint(name).dofadr
15-
self.qacc_addr = model.joint(name).dofadr
13+
self.qpos_addr = model.joint(name).qposadr.item()
14+
self.qvel_addr = model.joint(name).dofadr.item()
15+
self.qacc_addr = model.joint(name).dofadr.item()
1616
self.qfrc_actuator_addr = model.actuator(name).id
1717

1818

tools/mujoco-simulator/mujoco-simulator/mujoco_simulator/low_command.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
import numpy as np
22
from mujoco import MjData, MjModel
33
from mujoco_rust_server.booster_types import LowCommand
4+
from numpy.typing import NDArray
45

56
from mujoco_simulator.joint_actuator_info import JointActuatorInfo
67

78

89
class RobotPositionControl:
10+
model: MjModel
11+
qpos_indices: NDArray
12+
qvel_indices: NDArray
13+
actuator_indices: NDArray
14+
915
def __init__(
1016
self, model: MjModel, actuator_info: list[JointActuatorInfo]
1117
) -> None:
1218
self.model = model
13-
self.qpos_indices = np.array([info.qpos_addr for info in actuator_info])
14-
self.qvel_indices = np.array([info.qvel_addr for info in actuator_info])
19+
self.qpos_indices = np.array(
20+
[info.qpos_addr for info in actuator_info], dtype=np.uint32
21+
)
22+
self.qvel_indices = np.array(
23+
[info.qvel_addr for info in actuator_info], dtype=np.uint32
24+
)
1525
self.actuator_indices = np.array(
16-
[info.qfrc_actuator_addr for info in actuator_info]
26+
[info.qfrc_actuator_addr for info in actuator_info], dtype=np.uint32
1727
)
1828

1929
def apply_control(
@@ -33,13 +43,17 @@ def apply_control(
3343
current_velocity = data.qvel[self.qvel_indices]
3444

3545
# TODO(oleflb): booster supposedly clips position to joint limits first
36-
control_torque = np.clip(
37-
kp * (q - current_position) + kd * (dq - current_velocity) + tau,
38-
self.model.actuator_ctrlrange[:, 0],
39-
self.model.actuator_ctrlrange[:, 1],
46+
desired = (
47+
kp * (q - current_position) + kd * (dq - current_velocity) + tau
4048
)
49+
50+
ctrl_min = self.model.actuator_ctrlrange[self.actuator_indices, 0]
51+
ctrl_max = self.model.actuator_ctrlrange[self.actuator_indices, 1]
52+
control_torque = np.clip(desired, ctrl_min, ctrl_max)
53+
54+
# Ensure existing control values are used as floats when smoothing
55+
current_ctrl = data.ctrl[self.actuator_indices]
4156
smoothed_control_torque = (
42-
weight * control_torque
43-
+ (1 - weight) * data.ctrl[self.actuator_indices]
57+
weight * control_torque + (1 - weight) * current_ctrl
4458
)
4559
data.ctrl[self.actuator_indices] = smoothed_control_torque

0 commit comments

Comments
 (0)