From 2b71f98107119ee2c998b76dd1fe81691afa387e Mon Sep 17 00:00:00 2001 From: Samim Maschal Date: Wed, 26 Nov 2025 18:09:15 +0100 Subject: [PATCH] Implement Mujoco Simulator --- .../launch/simulator_teamplayer.launch | 9 +- .../bitbots_mujoco_sim/Camera.py | 59 ++ .../bitbots_mujoco_sim/Joint.py | 39 + .../bitbots_mujoco_sim/Robot.py | 78 ++ .../bitbots_mujoco_sim/Sensor.py | 28 + .../bitbots_mujoco_sim/Simulation.py | 160 +++++ .../bitbots_mujoco_sim/__init__.py | 7 + .../bitbots_mujoco_sim/main.py | 18 + .../bitbots_mujoco_sim/package.xml | 18 + .../resource/bitbots_mujoco_sim | 0 .../bitbots_mujoco_sim/setup.cfg | 4 + .../bitbots_mujoco_sim/setup.py | 34 + .../bitbots_mujoco_sim/xml/adult_field.xml | 29 + .../xml/assets/adult_field.png | Bin 0 -> 14224 bytes .../xml/assets/adult_field_original.png | Bin 0 -> 35099 bytes .../bitbots_mujoco_sim/xml/assets/ankle.stl | Bin 0 -> 10484 bytes .../xml/assets/ball/back.png | Bin 0 -> 1671 bytes .../xml/assets/ball/down.png | Bin 0 -> 1342 bytes .../xml/assets/ball/front.png | Bin 0 -> 1692 bytes .../xml/assets/ball/left.png | Bin 0 -> 1429 bytes .../xml/assets/ball/right.png | Bin 0 -> 1430 bytes .../bitbots_mujoco_sim/xml/assets/ball/up.png | Bin 0 -> 1345 bytes .../xml/assets/baseplate_odroid_xu4_core.stl | Bin 0 -> 684 bytes .../assets/basler_ace_gige_c-mount_v01.stl | Bin 0 -> 6784 bytes .../bitbots_mujoco_sim/xml/assets/battery.stl | Bin 0 -> 684 bytes .../xml/assets/battery_cage.stl | Bin 0 -> 29084 bytes .../xml/assets/battery_clip.stl | Bin 0 -> 2284 bytes .../camera_lower_basler_wolfgang_imu_v2.2.stl | Bin 0 -> 12084 bytes .../camera_side_basler_wolfgang_v2.2_left.stl | Bin 0 -> 9284 bytes ...camera_side_basler_wolfgang_v2.2_right.stl | Bin 0 -> 9284 bytes .../xml/assets/connector_shoulder.stl | Bin 0 -> 2084 bytes .../bitbots_mujoco_sim/xml/assets/core.stl | Bin 0 -> 1084 bytes .../xml/assets/dummy_speaker.stl | Bin 0 -> 684 bytes .../xml/assets/flex_stollen.stl | Bin 0 -> 27884 bytes .../xml/assets/foot_cover.stl | Bin 0 -> 4184 bytes .../xml/assets/foot_printed_left.stl | Bin 0 -> 4984 bytes .../xml/assets/foot_printed_right.stl | Bin 0 -> 4984 bytes .../bitbots_mujoco_sim/xml/assets/hand.stl | Bin 0 -> 10284 bytes .../xml/assets/hip_u_connector.stl | Bin 0 -> 11084 bytes .../xml/assets/imu_holder.stl | Bin 0 -> 1484 bytes .../xml/assets/knee_connector.stl | Bin 0 -> 2284 bytes .../xml/assets/knee_spacer.stl | Bin 0 -> 6484 bytes .../bitbots_mujoco_sim/xml/assets/lense.stl | Bin 0 -> 11684 bytes .../xml/assets/load_cell.stl | Bin 0 -> 684 bytes .../xml/assets/lower_arm.stl | Bin 0 -> 14284 bytes .../xml/assets/lower_leg.stl | Bin 0 -> 10684 bytes .../xml/assets/lower_leg_spacer.stl | Bin 0 -> 20284 bytes .../xml/assets/motor_connector.stl | Bin 0 -> 684 bytes .../xml/assets/mx-106_body.stl | Bin 0 -> 5484 bytes .../xml/assets/mx-64-body.stl | Bin 0 -> 8484 bytes .../xml/assets/nuc_holder_left_back.stl | Bin 0 -> 1484 bytes .../xml/assets/nuc_holder_left_front.stl | Bin 0 -> 1484 bytes .../xml/assets/nuc_holder_right_back.stl | Bin 0 -> 1884 bytes .../xml/assets/nuc_holder_right_front.stl | Bin 0 -> 1884 bytes .../xml/assets/nuc_main.stl | Bin 0 -> 7084 bytes .../xml/assets/sea_connector.stl | Bin 0 -> 5884 bytes .../xml/assets/sea_ninjaflex.stl | Bin 0 -> 5884 bytes .../xml/assets/shoulder_connector.stl | Bin 0 -> 11084 bytes .../xml/assets/speaker_holder.stl | Bin 0 -> 1484 bytes .../xml/assets/spring_holder_lower.stl | Bin 0 -> 1484 bytes .../xml/assets/spring_holder_upper.stl | Bin 0 -> 4784 bytes .../xml/assets/springholder_bottom.stl | Bin 0 -> 5884 bytes .../xml/assets/springholder_new.stl | Bin 0 -> 11684 bytes .../xml/assets/thrustbearingholder.stl | Bin 0 -> 2484 bytes .../xml/assets/torso_bottom.stl | Bin 0 -> 60284 bytes .../xml/assets/torso_bumper_left.stl | Bin 0 -> 3084 bytes .../xml/assets/torso_bumper_right.stl | Bin 0 -> 3084 bytes .../xml/assets/torso_top.stl | Bin 0 -> 64684 bytes .../xml/assets/upper_arm.stl | Bin 0 -> 6284 bytes .../xml/assets/upper_arm_spacer.stl | Bin 0 -> 1884 bytes .../xml/assets/upper_leg.stl | Bin 0 -> 8684 bytes .../xml/assets/upper_leg_spacer.stl | Bin 0 -> 5884 bytes .../bitbots_mujoco_sim/xml/assets/xh-540.stl | Bin 0 -> 1684 bytes .../bitbots_mujoco_sim/xml/goal.xml | 40 ++ .../bitbots_mujoco_sim/xml/wolfgang.xml | 669 ++++++++++++++++++ 75 files changed, 1190 insertions(+), 2 deletions(-) create mode 100644 bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Camera.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Joint.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Robot.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Sensor.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Simulation.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/__init__.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/main.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/package.xml create mode 100644 bitbots_simulation/bitbots_mujoco_sim/resource/bitbots_mujoco_sim create mode 100644 bitbots_simulation/bitbots_mujoco_sim/setup.cfg create mode 100644 bitbots_simulation/bitbots_mujoco_sim/setup.py create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/adult_field.xml create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/adult_field.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/adult_field_original.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/ankle.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/back.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/down.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/front.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/left.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/right.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/up.png create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/baseplate_odroid_xu4_core.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/basler_ace_gige_c-mount_v01.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/battery.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/battery_cage.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/battery_clip.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/camera_lower_basler_wolfgang_imu_v2.2.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/camera_side_basler_wolfgang_v2.2_left.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/camera_side_basler_wolfgang_v2.2_right.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/connector_shoulder.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/core.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/dummy_speaker.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/flex_stollen.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/foot_cover.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/foot_printed_left.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/foot_printed_right.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/hand.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/hip_u_connector.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/imu_holder.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/knee_connector.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/knee_spacer.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/lense.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/load_cell.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_arm.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_leg.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_leg_spacer.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/motor_connector.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/mx-106_body.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/mx-64-body.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_left_back.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_left_front.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_right_back.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_right_front.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_main.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/sea_connector.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/sea_ninjaflex.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/shoulder_connector.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/speaker_holder.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/spring_holder_lower.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/spring_holder_upper.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/springholder_bottom.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/springholder_new.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/thrustbearingholder.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_bottom.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_bumper_left.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_bumper_right.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_top.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_arm.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_arm_spacer.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_leg.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_leg_spacer.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/assets/xh-540.stl create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/goal.xml create mode 100644 bitbots_simulation/bitbots_mujoco_sim/xml/wolfgang.xml diff --git a/bitbots_misc/bitbots_bringup/launch/simulator_teamplayer.launch b/bitbots_misc/bitbots_bringup/launch/simulator_teamplayer.launch index 309a20155..f1610995b 100644 --- a/bitbots_misc/bitbots_bringup/launch/simulator_teamplayer.launch +++ b/bitbots_misc/bitbots_bringup/launch/simulator_teamplayer.launch @@ -10,10 +10,15 @@ + - - + + + + + + diff --git a/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Camera.py b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Camera.py new file mode 100644 index 000000000..26bdc5ebe --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Camera.py @@ -0,0 +1,59 @@ +import mujoco +import numpy as np + + +class Camera: + """Represents a camera in the MuJoCo simulation, providing image rendering capabilities.""" + + def __init__(self, model: mujoco.MjModel, data: mujoco.MjData, name: str, width: int = 800, height: int = 600): + self.model: mujoco.MjModel = model + self.data: mujoco.MjData = data + self.name: str = name + self.instance = model.camera(name) + self.width: int = width + self.height: int = height + self.renderer = mujoco.Renderer(self.model, height=self.height, width=self.width) + + @property + def fov(self) -> float: + """Returns the camera's horizontal field of view in radians.""" + if (hasattr(self, "_fov") and self._fov is not None): + return self._fov + + # MuJoCo uses fovy (vertical field of view in degrees) + fovy_deg = ( + self.instance.fovy[0] + if hasattr(self.instance.fovy, "__iter__") + else self.instance.fovy + ) + fovy_rad = np.deg2rad(fovy_deg) + + # Convert vertical FOV to horizontal FOV using aspect ratio + aspect_ratio = self.width / self.height + fovx_rad = 2 * np.arctan(np.tan(fovy_rad / 2) * aspect_ratio) + + self._fov = fovx_rad + return self._fov + + def render(self) -> bytes: + """ + Renders and returns the camera image as raw bytes (BGRA format). + Returns Raw image data in BGRA8 format for ROS Image messages. + """ + # Update renderer with current scene + self.renderer.update_scene(self.data, camera=self.name) + + # Render the image - returns RGB by default + rgb_array = self.renderer.render() + + # Convert RGB to BGRA (standard for ROS Image messages) + # MuJoCo returns RGB uint8 array of shape (height, width, 3) + # We need to add alpha channel and swap R and B + height, width, _ = rgb_array.shape + bgra_array = np.zeros((height, width, 4), dtype=np.uint8) + bgra_array[:, :, 0] = rgb_array[:, :, 2] # B + bgra_array[:, :, 1] = rgb_array[:, :, 1] # G + bgra_array[:, :, 2] = rgb_array[:, :, 0] # R + bgra_array[:, :, 3] = 255 # A (fully opaque) + + return bgra_array.tobytes() diff --git a/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Joint.py b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Joint.py new file mode 100644 index 000000000..04dfb05bb --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Joint.py @@ -0,0 +1,39 @@ +import mujoco + + +class Joint: + """Represents a single controllable joint and associated actuator in the MuJoCo simulation.""" + + def __init__( + self, + model: mujoco.MjModel, + data: mujoco.MjData, + ros_name: str, + name: str | None = None, + ): + self.model: mujoco.MjModel = model + self.data: mujoco.MjData = data + self.ros_name: str = ros_name + self.name: str = name if name is not None else ros_name + self.joint_instance: int = model.joint(self.name) + self.actuator_instance: int = model.actuator(self.name) + + @property + def position(self) -> float: + """Gets the current joint position (angle) in radians.""" + return self.data.qpos[self.joint_instance.qposadr[0]] + + @position.setter + def position(self, value: float) -> None: + """Sets the position target for the joint's position actuator.""" + self.data.ctrl[self.actuator_instance.id] = value + + @property + def velocity(self) -> float: + """Gets the current joint velocity in rad/s.""" + return self.data.qvel[self.joint_instance.dofadr[0]] + + @property + def effort(self) -> float: + """Gets the current effort (force/torque) applied by the position actuator.""" + return self.data.actuator_force[self.actuator_instance.id] diff --git a/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Robot.py b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Robot.py new file mode 100644 index 000000000..c3e38c699 --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Robot.py @@ -0,0 +1,78 @@ +import mujoco + +from bitbots_mujoco_sim.Camera import Camera +from bitbots_mujoco_sim.Joint import Joint +from bitbots_mujoco_sim.Sensor import Sensor + + +class Robot: + """Represents the robot, holding all its components like the camera, joints, and sensors.""" + + def __init__(self, model: mujoco.MjModel, data: mujoco.MjData): + self.camera = Camera(model, data, name="head_camera") + self.joints = RobotJoints( + [ + # --- Right Leg --- + Joint(model, data, ros_name="RHipYaw"), + Joint(model, data, ros_name="RHipRoll"), + Joint(model, data, ros_name="RHipPitch"), + Joint(model, data, ros_name="RKnee"), + Joint(model, data, ros_name="RAnklePitch"), + Joint(model, data, ros_name="RAnkleRoll"), + # --- Left Leg --- + Joint(model, data, ros_name="LHipYaw"), + Joint(model, data, ros_name="LHipRoll"), + Joint(model, data, ros_name="LHipPitch"), + Joint(model, data, ros_name="LKnee"), + Joint(model, data, ros_name="LAnklePitch"), + Joint(model, data, ros_name="LAnkleRoll"), + # --- Arms --- + Joint(model, data, ros_name="RShoulderPitch"), + Joint(model, data, ros_name="RShoulderRoll"), + Joint(model, data, ros_name="RElbow"), + Joint(model, data, ros_name="LShoulderPitch"), + Joint(model, data, ros_name="LShoulderRoll"), + Joint(model, data, ros_name="LElbow"), + # --- Head --- + Joint(model, data, ros_name="HeadPan"), + Joint(model, data, ros_name="HeadTilt"), + ] + ) + self.sensors = RobotSensors( + [ + # IMU Sensors + Sensor(model, data, name="gyro", ros_name="IMU_gyro"), + Sensor(model, data, name="accelerometer", ros_name="IMU_accelerometer"), + Sensor(model, data, name="orientation", ros_name="IMU_orientation",), # Global orientation quaternion + Sensor(model, data, name="position", ros_name="IMU_position"), # Global position vector + # Foot Sensors + Sensor(model, data, name="l_foot_pos", ros_name="left_foot_position"), + Sensor(model, data, name="r_foot_pos", ros_name="right_foot_position"), + Sensor(model, data, name="l_foot_global_linvel", ros_name="left_foot_velocity"), + Sensor(model, data, name="r_foot_global_linvel", ros_name="right_foot_velocity"), + ] + ) + + +class RobotSensors(list[Sensor]): + """A list of Robot Sensors with additional helper methods.""" + + def get(self, name: str) -> Joint: + """Finds and returns a specific joint by its ROS name.""" + return next(filter(lambda joint: joint.ros_name == name, self)) + + @property + def gyro(self) -> Sensor: + return self.get("IMU_gyro") + + @property + def accelerometer(self) -> Sensor: + return self.get("IMU_accelerometer") + + +class RobotJoints(list[Joint]): + """A list of Robot Joints with additional helper methods.""" + + def get(self, name: str) -> Joint: + """Finds and returns a specific joint by its ROS name.""" + return next(filter(lambda joint: joint.ros_name == name, self)) diff --git a/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Sensor.py b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Sensor.py new file mode 100644 index 000000000..e787e541f --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Sensor.py @@ -0,0 +1,28 @@ +import mujoco +import numpy as np + + +class Sensor: + """Represents a single sensor, providing a clean interface to its value.""" + + def __init__(self, model: mujoco.MjModel, data: mujoco.MjData, name: str, ros_name: str): + self._data = data + self.ros_name: str = ros_name + self.instance: int = model.sensor(name) + self.id: int = self.instance.id + + @property + def data(self) -> np.ndarray: + """Gets the current sensor reading from sensordata array.""" + return self._data.sensordata[self.adr : self.adr + self.dim] + + @property + def adr(self) -> int: + """Gets the address of the sensor data in sensordata array.""" + return int(self.instance.adr) + + @property + def dim(self) -> int: + """Gets the dimension of the sensor data.""" + return int(self.instance.dim) + diff --git a/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Simulation.py b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Simulation.py new file mode 100644 index 000000000..e9dae7040 --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/Simulation.py @@ -0,0 +1,160 @@ +import time +import math + +import mujoco +from ament_index_python.packages import get_package_share_directory +from mujoco import viewer +from rclpy.node import Node +from rclpy.time import Time +from rosgraph_msgs.msg import Clock +from sensor_msgs.msg import CameraInfo, Imu, JointState, Image + +from bitbots_msgs.msg import JointCommand +from bitbots_mujoco_sim.Robot import Robot + + +class Simulation(Node): + """Manages the MuJoCo simulation state and its components.""" + + def __init__(self): + super().__init__("sim_interface") + package_path = get_package_share_directory("bitbots_mujoco_sim") + self.model: mujoco.MjModel = mujoco.MjModel.from_xml_path(package_path + "/xml/adult_field.xml") + self.data: mujoco.MjData = mujoco.MjData(self.model) + self.robot: Robot = Robot(self.model, self.data) + + self.time = 0.0 + self.time_message = Time(seconds=0, nanoseconds=0).to_msg() + self.timestep = self.model.opt.timestep + self.step_number = 0 + self.clock_publisher = self.create_publisher(Clock, "clock", 1) + + self.js_publisher = self.create_publisher(JointState, "joint_states", 1) + self.create_subscription(JointCommand, "DynamixelController/command", self.joint_command_callback, 1) + + self.imu_frame_id = self.get_parameter_or("imu_frame", "imu_frame") + self.imu_publisher = self.create_publisher(Imu, "imu/data_raw", 1) + + self.camera_active = True + self.camera_optical_frame_id = self.get_parameter_or("camera_optical_frame", "camera_optical_frame") + self.camera_publisher = self.create_publisher(Image, "camera/image_proc", 1) + self.camera_info_publisher = self.create_publisher(CameraInfo, "camera/camera_info", 1) + + self.events = { + "clock": {"frequency": 1, "handler": self.publish_clock_event}, + "joint_states": {"frequency": 3, "handler": self.publish_ros_joint_states_event}, + "imu": {"frequency": 3, "handler": self.publish_imu_event}, + "camera": {"frequency": 24, "handler": self.publish_camera_event}, + } + + def run(self) -> None: + print("Starting simulation viewer...") + with viewer.launch_passive(self.model, self.data) as view: + while view.is_running(): + self.step() + view.sync() + + def joint_command_callback(self, command: JointCommand) -> None: + if len(command.positions) != 0: + for i in range(len(command.joint_names)): + joint = self.robot.joints.get(command.joint_names[i]) + joint.position = command.positions[i] + #if len(command.velocities) != 0: + # joint.velocity = command.velocities[i] + + def step(self) -> None: + real_start_time = time.time() + self.step_number += 1 + self.time += self.timestep + self.time_message = Time(seconds=int(self.time), nanoseconds=int(self.time % 1 * 1e9)).to_msg() + + mujoco.mj_step(self.model, self.data) + + for event_name, event_config in self.events.items(): + if self.step_number % event_config["frequency"] == 0: + event_config["handler"]() + + real_end_time = time.time() + time.sleep(max(0.0, self.timestep - (real_end_time - real_start_time))) + + def publish_clock_event(self) -> None: + clock_msg = Clock() + clock_msg.clock = self.time_message + self.clock_publisher.publish(clock_msg) + + def publish_ros_joint_states_event(self) -> None: + js = JointState() + js.name = [] + js.header.stamp = self.time_message + js.position = [] + js.effort = [] + for joint in self.robot.joints: + js.name.append(joint.ros_name) + js.position.append(joint.position) + js.velocity.append(joint.velocity) + js.effort.append(joint.effort) + self.js_publisher.publish(js) + + def publish_imu_event(self) -> None: + imu = Imu() + imu.header.stamp = self.time_message + imu.header.frame_id = self.imu_frame_id + imu.linear_acceleration.x, imu.linear_acceleration.y, imu.linear_acceleration.z = self.robot.sensors.accelerometer.data + + # make sure that acceleration is not completely zero or we will get error in filter. + # Happens if robot is moved manually in the simulation + if imu.linear_acceleration.x == 0 and imu.linear_acceleration.y == 0 and imu.linear_acceleration.z == 0: + imu.linear_acceleration.z = 0.001 + + imu.angular_velocity.x, imu.angular_velocity.y, imu.angular_velocity.z = self.robot.sensors.gyro.data + + self.imu_publisher.publish(imu) + + def publish_camera_event(self) -> None: + if not self.camera_active: + return + + img = Image() + img.header.stamp = self.time_message + img.header.frame_id = self.camera_optical_frame_id + img.encoding = "bgra8" + img.height = self.robot.camera.height + img.width = self.robot.camera.width + img.step = 4 * self.robot.camera.width + img.data = self.robot.camera.render() + self.camera_publisher.publish(img) + + cam_info = CameraInfo() + cam_info.header = img.header + cam_info.height = self.robot.camera.height + cam_info.width = self.robot.camera.width + + @staticmethod + def focal_length_from_fov(fov: float, resolution: int) -> float: + "Calculate focal length from field of view and resolution." + return 0.5 * resolution * (math.cos(fov / 2) / math.sin(fov / 2)) + + @staticmethod + def h_fov_to_v_fov(h_fov: float, height: int, width: int) -> float: + "Convert horizontal FOV to vertical FOV based on image aspect ratio." + return 2 * math.atan(math.tan(h_fov * 0.5) * (height / width)) + + camera = self.robot.camera + + h_fov = camera.fov + v_fov = h_fov_to_v_fov(h_fov, camera.height, camera.width) + + f_x, f_y = focal_length_from_fov(h_fov, camera.width), focal_length_from_fov(v_fov, camera.height) + cx, cy = camera.width / 2.0, camera.height / 2.0 + cam_info.k = [ + f_x, 0.0, cx, + 0.0, f_y, cy, + 0.0, 0.0, 1.0 + ] + cam_info.p = [ + f_x, 0.0, cx, 0.0, + 0.0, f_y, cy, 0.0, + 0.0, 0.0, 1.0, 0.0 + ] + + self.camera_info_publisher.publish(cam_info) diff --git a/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/__init__.py b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/__init__.py new file mode 100644 index 000000000..2cdb94c9a --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/__init__.py @@ -0,0 +1,7 @@ +"""BitBots MuJoCo Simulation Package""" + +from .Simulation import Simulation + +__all__ = [ + "Simulation", +] diff --git a/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/main.py b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/main.py new file mode 100644 index 000000000..89e3ec586 --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/bitbots_mujoco_sim/main.py @@ -0,0 +1,18 @@ +import math + +import rclpy + +from bitbots_mujoco_sim.Simulation import Simulation +import threading +from rclpy.experimental.events_executor import EventsExecutor + +def main(args=None): + rclpy.init(args=args) + simulation = Simulation() + executor = EventsExecutor() + executor.add_node(simulation) + thread = threading.Thread(target=executor.spin, daemon=True) + thread.start() + simulation.run() + simulation.destroy_node() + rclpy.shutdown() diff --git a/bitbots_simulation/bitbots_mujoco_sim/package.xml b/bitbots_simulation/bitbots_mujoco_sim/package.xml new file mode 100644 index 000000000..ca5137d72 --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/package.xml @@ -0,0 +1,18 @@ + + + + bitbots_mujoco_sim + 0.0.0 + TODO: Package description + 22maschal + TODO: License declaration + + ament_copyright + ament_flake8 + ament_pep257 + python3-pytest + + + ament_python + + diff --git a/bitbots_simulation/bitbots_mujoco_sim/resource/bitbots_mujoco_sim b/bitbots_simulation/bitbots_mujoco_sim/resource/bitbots_mujoco_sim new file mode 100644 index 000000000..e69de29bb diff --git a/bitbots_simulation/bitbots_mujoco_sim/setup.cfg b/bitbots_simulation/bitbots_mujoco_sim/setup.cfg new file mode 100644 index 000000000..de24bec2b --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/bitbots_mujoco_sim +[install] +install_scripts=$base/lib/bitbots_mujoco_sim diff --git a/bitbots_simulation/bitbots_mujoco_sim/setup.py b/bitbots_simulation/bitbots_mujoco_sim/setup.py new file mode 100644 index 000000000..1ce730972 --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/setup.py @@ -0,0 +1,34 @@ +import glob + +from setuptools import find_packages, setup + +package_name = "bitbots_mujoco_sim" + + +setup( + name=package_name, + version="0.0.0", + packages=find_packages(exclude=["test"]), + data_files=[ + ("share/ament_index/resource_index/packages", ["resource/" + package_name]), + ("share/" + package_name, ["package.xml"]), + ("share/" + package_name + "/xml", glob.glob("xml/*.xml")), + ("share/" + package_name + "/xml/assets", glob.glob("xml/assets/*.png")), + ("share/" + package_name + "/xml/assets", glob.glob("xml/assets/*.stl")), + ("share/" + package_name + "/xml/assets/ball", glob.glob("xml/assets/ball/*.png")), + ], + install_requires=["setuptools"], + zip_safe=True, + maintainer="22maschal", + maintainer_email="22maschal@todo.todo", + description="TODO: Package description", + license="TODO: License declaration", + extras_require={ + "test": [ + "pytest", + ], + }, + entry_points={ + "console_scripts": ["sim = bitbots_mujoco_sim.main:main"], + }, +) diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/adult_field.xml b/bitbots_simulation/bitbots_mujoco_sim/xml/adult_field.xml new file mode 100644 index 000000000..71d69326a --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/xml/adult_field.xml @@ -0,0 +1,29 @@ + + + diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/adult_field.png b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/adult_field.png new file mode 100644 index 0000000000000000000000000000000000000000..c11ffe33585ee782d47966510292f907d08f008f GIT binary patch literal 14224 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 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/adult_field_original.png b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/adult_field_original.png new file mode 100644 index 0000000000000000000000000000000000000000..835fa2c4849d93d465c46e4916fb912d9eab3bf3 GIT binary patch literal 35099 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 EU((zN6#xJL literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ankle.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ankle.stl new file mode 100644 index 0000000000000000000000000000000000000000..7ea29289a954bb0dbdb9d34a431fcb1a2ae504d8 GIT binary patch literal 10484 zcmb`Ny{l$d6~b`-Fj$yEYy|Je`wtAHu?+|oAvS}WVlss}5NxK1q*4%+ z6cG^%!9vNs<4quiMTArqqDC0B7qJZE`mMd6b)LP?dB?^VuP)Ahe(Pg@oqhIrIQ)Nq z9}e!8tx#V^Bk@LosOeOh)3_e}DIe2rqo=t;?VP zoa#I%X9_?<*ss zcQXdP>%Oo>#MqpXRU7k8~h(6{<#4Nd?4rYn_!WI#8EQvOEJCXBhRzdW+YedZU zjKOSoU)UmItt8RbU?*~Y%qob!291bSn=x3m?h9K)tobC`UebwN=d%i;?2+;<^z-dGAO8)Z ztg3RNJK-Z6;vuWn?^GFY&g?hraXg%Gm1nXcfO0&%#R;DaBvpM?y-OXQ`-Z3(;kV8P zp}L|5W@6B3xAl=xcE;StSs6C1XXPq(JI#y@;aSy8bi!w4##z)?etL<1%iM|M^^Jt9 zWV1dtglAQK<%IWJ#wfyjG3Hff#eTJkv8WDL#XL@eUGy~JEqjDAs#$VyRjjUz!P`Kd zil{og#R*^YP)qJU7|}mx^gn;HwfnFW@qC|fmD?hq_$@cDz4^oQH|~5P{X~W}V|f1O zU*3AqbV%FZa^tFQr|LA}El&LGEBCJ-8zcP&!Hh|JmmsklZ%Z5P>U1ZhfRwd!c}1py(>>e038+m&eN}-K{L+Sst-Gf@ZV;mtGfN*BvCQwcZ-p> z#_41X5$BQBX(D5|FDiF}%6DUwsuQVF?-mjMTjk#3g!duh{4MmZtHK_7*R!gx)cmex z_OWvMe)XWQs4HsHiYg+%Yav|ab|dC*P6*yOeGg8*J;Qvy{pN(g7lbkyiC%g9Py2Qj zp*m(-{nUEbRoIH*@iMD?&-QQUK7v_C+QgvOiQUd6QF#&Jt5n#^a3mss_Qd@43S(wG zagL3D*^yz`ZGEh}=&XXk)#_=FkT20jL>+sC`=yS@5{jO_dW?zSo}pL1V9Y9FSmkL$ z@M~uu-l>e5&LY^HMSA5cv54T*hl;l)XE^NsuC0-60Xng`iqn$C*e6&~siMDp{Pmo* zGQ>EzDsnHs8=@-r7AH8vkzxCqK(0Dm<#n7S$m$wj)DiKnWS{O`SIMT@4N-M?ixWPw zAP^P(gFVi~`OeZ+*!}xFd%CT``OcCU zQi<@{v%Rx)6?VU8$QbR*YreB2hEyVazHRR;U4`B6OELy_-9R4f2C`Hld{!1wcb2Zg z?)N?!1G{b@^KQv~VT!>5k9Ajs5?tnVe8J4Y=;}jobm1p+lX2#A)U!(8vZo2<8`qCtvBcXszv4M%^cWWqJP-P!on)MF6*j6Z(KE`~=)LRTvU(oc_FL3nu9A&p zCfX^6mY#2(yn0P#(+l;Da}4pq->jnF;<%b=h0UaQ8A>VpJcb*oe0H9 zUp>Y|^zW#-j#3eWQG;Gbkf^B3#8@OAPkM z(}cI|5z1(d;VR$TYs#T1toZ@o_@)jq&radHiMi)^jhVNYCCxvN;IsOX>Qk%~RW z@D?Z7E1_$)tB!>pRSP|>OqeCu?bL@{S-FaNg^HPYnut15rFjK`t>^pmN-B@HA*v2< zae`Tbr~P?F3-i@`VMA05@5QM044VFlc;k3fU%84m1BBiyYD{TQzsCM$Uf2jp-k9gM3WT1MtF~|cHUo|Al#P|?3Ki5UtS)=bLU+m)!Msr z<*wq*0MYM#_A4JwG81tPt<%yv+g-(*!D5Vr`idCU;>4!%C3=?~DE~D~dz4Q1zIUO? P-y*_QvQcOsOZDNuRk0eH literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/back.png b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/back.png new file mode 100644 index 0000000000000000000000000000000000000000..c01b51714f300a773615b065b016e8e2020bbdb3 GIT binary patch literal 1671 zcmZ{keK-?(8^?c}mgS{(wiF$8<{)bA*cfR!G3K!i#Smt7=4Bytig{NSZOCbONMUA& z>`0iGFk>qzy1ZA8Lh*Pz$H}8tr-g9VpU)r9eO=%CbA7+}_5JtG@;L6ItF=c90H8~y zkm+hVd=*^1Ko0Z=s2W>BN$w;78gjJ11j5uF9ZaFS1CX>I0PYn4R@D)A0f1N>0Iyj9 z5N`so`@B%@X{SCwgIrz6U^649|DM`yJ5TYC0pJJYuYx30+Q+FwO%B!FS#uVmzg-(u zv={9K04#}0CVBgH@q8mPeSGv!txf-uQ{-84mwJAGg{G0D{2H$)+{yU;TZ; zltiz%;QQNtMK{rZVEP_9SbaD_rxg?z7nK)P&CVIe9*o_mO8PW;=R1`!c~B8w7QWe@ z5i`1>Y<|vIYiC^==)*>2him%YY*r5@HP)UBSla{4$MUKapel ze5W9=NelZ^|I6Zmer(3Sc~egCbw%seo_L1bR>jA9S~yK$lGdh>(=&5HBU^s zL{e)}RKMY8w=pQtUtdK=rGT_jl}@7;klGNKG9&q?>P4@Uscv#8FgvkBHf=$YC#&M3 zBJJXDJNv5Y7EeL$S4+#xp_W0$DWx;a+S3*l~ew6#9tH9}s1^-cADurWWD z6(1c0KVlM|*g{M?YMDR%(L?zbR&8O48`aYaOgwZ8&MAve4Rc#w7;F30$Z>M8@Wd(& z;c+kFVc1H=P9EU5raJpy`smnH6C5K_1l&#DgDc`YOixvh^%%5fz zPBS8VJB&3fhs5>kTrSwA?Mc`{G?0_wMq;a>lyJrB7NGy*+qukfaxOgJJtg#_qPZ3u zK?S>{Mi>1R712%k+rS+g9si}=ftKbL!r>{|C2YGi`Dz!ijXnDu8EO#2YD=}rmt2Sx zPSd5k&ip1UH$~ARi#a^O;E~W;JP8pZJLfe1DoFP3+dccip{dWeuS6eJ;N3F=3g_#C zt!fzojV1HSl}Y5GoPKy7oBSWqM+^Ckaej;PS!?fg1ZAuviLv1#;A-dBC0~t=EFOOy z!J3TsWaq`*P%!_Z<+!~F;7c!Klg|FmFLp8JQ9=DodZ#L2YDx0)*`GOj*3%;!v#6Ok z>Yg{u+&HGd?2Hxs27Z*$C!zYz#*r8zk&ya(_H@rg_VAzobr-h6#RE0IZ{sEx4Ztu_ zUL!BB{yL3~t~UhMC37!sJqlZy{xssxziWp^335*nfAkao+;LR78MCCz;Y-ELh}!0p zG$`Ul>B}96;pBml_z`F2vqi2Mu{6^aj_;8O(`PfEuF-;{za*I~lpbhV??j!2z8ajz2*7IdYB4UQ zGd?t;8DrKX1KH)6?4~H=kQ8PDt9EoV%*|b$rBi8YiL~Az6r-X zG3zaR_}4j|L{9gd_}u9LZb9~e!sAM(&hhkC2Kul(#KK0ncBgV}OjY?2N_npGFo5NX zDJ5B$8YpAKZsNsGPTlQV#i{J~5%iv(Yr!=K0T>aq3r?>-_xV(PXDKh6IA*h4-?)K% z?fM6i=egLjcg4(`+aMs=y)>OqDtKH;`9NJ_%MCLU-C@l92Ne&32`vbgW|PEEn?Jiw zN9?W78tq;Wcl$eWyn!v2ZmoRxZl=w?M~|YjEWgaZSNIf7=-myA^ds5_(Z!LeS1U9w z(V1!Vgaz|!7wnqsrtZ&-gkUA4Fb?CjzAX{eEXGwUm{A6~^;Zh?K2CwKY+dg|^ zzhrzpD|Oxn^BAohFQ8XzjBX62uKO&A3+S|Pot08jTJ0u4eCtq4eB63g{g_QT&VHPb zKn|N29L-h(SmN+UusA%{lHiRe5b<~-{s;z#BjRuetdElarx5jXNcfq=|6lM6OaH7c N0IKtGa-Ab9?H>lh@nHY} literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/down.png b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/down.png new file mode 100644 index 0000000000000000000000000000000000000000..49ace5b652534155e9d00b28ef2e41e23c208667 GIT binary patch literal 1342 zcmZ{keLNF*9LIki%hFn@xRuPEr!Y2$GV`!CY~9Ft=$7!ZQAEtcxOvJLiL!Zqc#$Tu z5GS__D>e_QLmqMpjdUuz=nyWka_i6g_*1z`W%UCogv}NUlyh<`lG`yEMwQ z5uWmcXc7VEMd`^YIYst!+TSNCYiHqf(|sOJ989z7wa;nng=@mMk@XQ0X}6`YE+X_r zfIwBlYRWkDiu3!vjJ!5?4YIpNzCk$c&Y|*uaE^BrNDzC|aeP{Mvv{y#SY^-a>BQh! z)1~Cq#ChA8FMg4YYTK9Ej~I`tVWe8<;Vih37_pA0B*cDi3E$>%6%L;|p}S``BW4;Y z&9-$M@Gr%JzZyqGOyj=+@_rsb!7q%d6|c?UU{U2p+t~S{dS`0fD1mE2Hrvh^N`Bu^ zei?ygb$O}tMlM;`rg8Q&Ulv zA&wEr3zGZ;iw-x4Z!|I=bhA#|Cn6FIyHBOSMwES^9IPlnaf$^B31nW&JcevIw4G0 zqO2g~IP*JiS3GKi3+j`ye^qSZY4r9sDL7g7XgX|f5 zvo;8~W3Eo=gzpwgeHrW1U#O-Xj7cP-K6+xz zqx%%7&PJ3|-yO)UHfa;TJVsNU8MEHA;O{;b*u(BA(A|@s(ovKnKFP#x>6rha*#076 zQlVnhaP7dLt$Ue>n&z6AxCIW5>7by&0W#dmM6|-mH8o2FQ(sL8w?<#w>KK|i zlN+6(Op1nasnkqMGBhxeZI+~0Ygd!Da1-`|(K4Q31j0BoaD zh=D2+zDZlPfB@O;waN4*(ktzycEh z_i_LX&sP2sfKwfyKlzY};A^g+_kqgkoTY@Y0C3v-O_1}oc#bO6N~Y3CS~CzMeckV_ znpzwIKtn(!dL5;AWCX|M1qB%$Pha_dCTK3aRH!uC;b4rmk)J(usF!SD)p0VQm~WAN zjNwT+V(gE0=_yCwE6cMw*HmQPscr4@x`E_g?smiZdAUe_c;=d0`pU3?_1t6bRdZkE z^{w}<&o|o=#fcZRfW-%wj5@q0o~zCimkQ?>m8O8eR0au$)`U;A2xd{FMV?}S8(Ja`afo7)8zBE;+5J&kz+HfQ?ru#W=i6@f&;bw z>HINtGmCU)8@pBE-nT+s6;Qh$r!+NR`GGU1z_l#G+E?4BegXv4#Dn-?*Mt`9JJ;J3 z8x9T!e%yl&&S)O#CG zX~%!~Ep4d5gl$;MhBIeJPs1$qUktLUoCn}dEp?jRQfZiylyMd&=J19>@A>Q^-lrqE~ z7X8ucc^G$8Hd$=9>qmKvvgT*rL#{0}$7)Y{h10&+WsZ?oc+_Fnuu;;|0l#Oj&OO$K zr_U?}P@b>V^c9jY6r8YHmry5fW4o%s!Y^iyWigAK=p+>M3T>_PtQtm4o!FK z_mSRlaStM-16dCzsZr$~afAG7*^EzA#_N}3MsecW$Sqzd#+rA0F{Pe*XX9Ese79Lx zaZyrtT)(-mes$H`>?VW4Q zIAW|KBX+u6U9BTz74Dn+aPs9qXyH3Ao$d&@VCS)kj-2(V=%t9Vo0$}gwy=>bMSY$Vw@qs=hW3A!p9^Ds!G%U@0FRV^FlJI2Sh1TC3G zS$A>f3acOwdmE-Lv-)T#i5^11QAZrcYHdwajf>SG{t-{Erx@^yI3K#lBM*{;4fbmQ z2H~DxOd+lY2O1YD)=+A{)X&|nf2~N`Ag1(81>7L(A4SuLjr$%zN-~sX6xPAn5{oihFj6rfz#5QS{kTI{6!+uzKrR<_bZm*f^v($@ zuX?8%%g1k92GFvjH|PJ%8RWH#h<;cc)^pA_ACr&){T!lEY(SWiq{uFrz4vKV@GPXi z5>X+4;YC=p$^P!%5!JUwCX?vN5#h;^?x&I>RRGRtjGH4GLFzy&PdokJAu%F0D)s*t=rI?Sssf;re2KTbnY{l2HG}hq literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/left.png b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/left.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b14f7b78511b62d70e2cfa279dc21b1215dc0f GIT binary patch literal 1429 zcmZ`(YdF&j9R8cRG}n`Au9-W@Y~sX_v1vn#{&=WSG?%&NWO6Bwk!ximHk_>yQAlRu zoSdG~A*YVJBbN$0%n9|lM~Ke)cs`sD@9%xy_kG^y{r1cAI!jQ3X~F;iP;w*UK?!5O zLtb(KCIktQ5H#GG>|qZ$`MemY`(e~zK+UEJKe;IO>zkm%%)(!VR*qCEUCz02DY z@;(ZeKemZQ#%*-_5oSEP?~pQy=c4He8NN9mQ6Nw~`KK3q{)**S8l4gmARX^%djLmpjF!2L2;58jSuo&Z{ng*yYab|B>d;Y` z;5}r&LKQ&deyIH zN^EGk>mpXQeKlZBAlYfb^jM?E3RCa13*C`Br!UBfLGHyS`p7gh-;iKZ14eN4f;K0^ zl81(h-nA9?`PZ$~d=8yE%;H!b;c&{dJ&lVfB@ew{ruue~d+QjJGDg*s^zfY4SR?tj zuJ@`4zgrY3aNwQ>)QN%C!FOOZExD8yXKw2Pp2e zlTWqN^A$E`;dUobpV^yvQGr8-kH5@M9qVZ+dGl$+Tw%x$C$~Knrvu+)>kvBKR2hx~ zkl7`Z9+8#}6p4F28N=)n{w z%Z5C19NRUWH&KyMp;yTsT4ecVmfY~OJlZkH)Ekm7KARMq#_Jk9vZzwKu=%U)o(#j-hGA2^!Uqmt-0HPwq?;6IWA3fT9jXSuvU6Dgq0rxKEg>$sEy= ztw^4G`Hm$&mTPW6?)tHt@*w_>o=E(j4HHDkNP{nP51c>Y#=UQeL3%x9I75HvKj@iOo4-2vx_50RVj~@dsx6f^4C;PPA{L+BRC~X$uZK4}{u8TN zV1tLwYK&#?*Ijh+qH@=j5~3U^_i_~j-zy#CKY7DI=PzKP@Df7K))<4V4gJg+kj|pwJdp);?%!3>u9=+nJ+K7!=CP#vcEl dLd=zrh_K}UFZfe$evuRaH`lZHCoVx5{{ow`c3l7f literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/right.png b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/ball/right.png new file mode 100644 index 0000000000000000000000000000000000000000..69965a816dc5c5c2d37f92928f964745e7a4b9a1 GIT binary patch literal 1430 zcmV;H1!?+;P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 bvmBoa&VX0(Xp)#mn~F2Q3<_u2u1xU($Skh8 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/basler_ace_gige_c-mount_v01.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/basler_ace_gige_c-mount_v01.stl new file mode 100644 index 0000000000000000000000000000000000000000..01531abb9fa49ab6629f5745feb30b64bf953fc7 GIT binary patch literal 6784 zcmb`LU5Hgx6vsEsTVMr6Ng|{%QBjn=gnIQ71*L)n(g)Rq6{r={gM`ory73``9%`bO z2r3f#uzZN1hvv>qLs0}4h>&8`LkbZj84*zuwf_Hg*71M#KDQ9M4>RlT_5ba)&i-8Y zr1bxOo@u+wLzp{erU!4na?1$+uUWN(_SK`+gS$?CvKH-c&u&-p&li46gtn5bWE<;c^P9o{=iiu?TJL2m8!mZ;S^`^ksoiZ3B&67 zP~x+{ULw79=~VYQFuDV*63l_k4Q;G&%ZfJsce2W=vi(6-v!l9%X4QI>&^_OYkt|>C zBIIk&LA!bK=&3t{SyeV}R5hd9Pb7VEeOg-!B(TQ1S*c3wQAM;*t{x?9#V`ieST}~| zZYzc=>>{N*L{^opJ`&i2713s;9wn-*T0+;)4+p>a2rK5(Q`_s6m}4cX>g2@Y%H|}h zi8h91HG&HN3xdytb`x8GCPr43#akm;bqPS_jWbe0*Be6MlNaz8QI}meHD~_^Vk65z zv_r?NK;$v1njnTa(ifk;>6b)|2*nxwH$-GbB2?%p?38X_oLaYha^~{yU)!^wPpjj$ z;Xqo6zU}t0(KTZ3jg>R|K&VFv%q$4ZzZ3WdqEy9vbcq{Q+&2&6tBEI(RlAnTH3p5x zD2ebW0UPap!o7d`YsUEQ&K(P?D$m66M0k{djdq+wDShzMrCcG42RALKsywyF6X8(; zHrjD^rF7o%n;B!-?Bs%~%DZGd5gsLAqup=kqt`yj7{kLq&#OvrvVSL{FC}239Vbyr zH@>@zF?Rj&?7XVVn{zx79wlI--A~cuwgU0(t&gYXR8`*XlEp*C7}Kt@t#Vw1j14Yc^urSgp4& z94mMb1O3{#(Z-1O5*#b_C;=NWd_HW>hlqh0RF%y$@4om2SrMFb?Mn&RAbeff+GPx^ zL{-^3W(=(GUV>{^Jxahv4BsEN2N?r9N>#QW83Q}Dm*5^$j}ovE!}qzJC5(ZSK~;9H zFh*4U6~VJa`%(fn2tTjvOk@n4aH_KNkuh*`_7Xf3)uRM##PD<1&UVJY*{&)(=NSVx zKrg}DKs`#pMhw3{?2cj#+)=8s`-(Aell2lQi0DfR*l72A(C%8sz+I~ATFc()H7w zXIE7*vZ}iCJcj6GrG$=ph&-!upTpb!!Zy3kO80Yj-+9j!;mu87O6Z7$$g?U>YIyy0 zc3m4I$DEhvE_8m@7KDBE7~bwrSe~fxweK=oqP%ON()X=(R^`nJ!f#7hJ)`T*jiIB+amsDBdO=_j`>IMD$S5~e$Q`O*m8!tyzHXkE+nj4vRo4d8w zS=pSoDtmI;XEjzWp(BDE@Zp?iTf0;>cOPw?=Q=CfAFaw(3GK65S1q9<;yFcDw$G_* zZW-EsFS)MH%63kxvK>X+Z_9#+Cy#&}cO`U0LgZtmCz+ieTrqwF6ftrsE@ zLD<)N4=SM}0@gEvCGUL(V(WXKL5IM*rFiS4Dz!;~!Y2=nh&M$V1NI2jIeK&{trG^jQ9s}3IHwu literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/battery.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/battery.stl new file mode 100644 index 0000000000000000000000000000000000000000..9cfcaab8146166897ddbcbcc2aa5ea454bb04c4b GIT binary patch literal 684 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 F{{UwIictUn literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/battery_clip.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/battery_clip.stl new file mode 100644 index 0000000000000000000000000000000000000000..6c97c8b9b62e2836abba01c77cf8c56ffa2e4a97 GIT binary patch literal 2284 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 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/camera_side_basler_wolfgang_v2.2_left.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/camera_side_basler_wolfgang_v2.2_left.stl new file mode 100644 index 0000000000000000000000000000000000000000..74f0de193e557dea703fe515b5645b80f7ac6a0f GIT binary patch literal 9284 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 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/core.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/core.stl new file mode 100644 index 0000000000000000000000000000000000000000..e778fb9bebbfa41964b7b704582441629df2e2cc GIT binary patch literal 1084 zcmb_bF%H5&46DijGvXJWn4#*zfA~T+9>LDU7pi`Z*gap<>%qiHtxRIa$)z;Sf6r-E z&ZgJ%Hn!cqN4V`Cy)feE!~2@)=ExtLA}iq$tnZ4Li3-QRJy;hk?<(U>S7>Zdt^09z zkpfuWz~~Y)a1JU^Hz_bVaa94)5Hs$vQsCaI9+{OCWT8@2*yIL0(Ic`H7mo__UskeE z7pzh-PpypHYh8iEW0)E!vV;+rH!zO{1$SHSz}1_b&mQVGDp0djEO&*B&!G)wKgHRR zzm~gFt+eypNvW8>bVxlDHyHgGm&ZyGS;Szek`(jQA;T|2tkfYqxJ~e=Fn|h6|Bs;f E02tE8@Bjb+ literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/dummy_speaker.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/dummy_speaker.stl new file mode 100644 index 0000000000000000000000000000000000000000..4c9f147f498beac2d9023bf74e3404a165b4012e GIT binary patch literal 684 zcmb`EOAdoD3`8S!+ZAW&rcw~s=qJJ} WcvI=pJBJ5B!XR#3oFwu*Unv`hN`tom literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/flex_stollen.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/flex_stollen.stl new file mode 100644 index 0000000000000000000000000000000000000000..21c0952af0260c36648e95841e1f3fec3ffe12ac GIT binary patch literal 27884 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 KSi7o{tNGT#D-T;YqJ1WFGP*YRglluZU@5J|; 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 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/hip_u_connector.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/hip_u_connector.stl new file mode 100644 index 0000000000000000000000000000000000000000..561db981e71f235baf4e4c0ab2285ab23fdd3353 GIT binary patch literal 11084 zcmb`NU5H;t8O9H^H&RNp5u+7F6Z?TiXi!K>_P?tjw2C6tLZhXAfThxliZw-$v^iQY zBvlNEdQ(U-)mV*KP_(jNH!WV63R(mOt48ob1)E-qX?1?@%rpOI=A7Lt7dHEH=K0Mt zpYJ(ya)#mm`}4GLZmUOc%CasT0ii|djH^(yB2_DgSFTzY0>C3}c)6|qzkV)*$r`&a+<%!%-jswdue z`ufG`kFFOF5w0SZ3J=B6s^QqHH&$PJ?S0{)lAbv8sr`$0?0Kqqh;S9LRCp-P9(TWG z&)U}F_V7?iPyFNj8y8==>LiH-NXZt-MPtdA+Pn{|rB3vauRBG*#IGV=lT^G-;dPz?(y2q~iQt=SsDq^XqNpbGS z(`nAHzV*sAFX;)^!nl6Cc!+Qnu~gKgID3?p7#=F=3D)$>>-Q875w0SZ3J=BEqwJ{g zP)Sd)H^2JRyNZVhR}o8vhvMw<*_2E6UVC47sH7*zF~51k9mPY0tB9q-Lvi*f87@3j z(i7y$SKV@Z@etuEVyW;@oITb*d4A==7f*(VN_v7k|NVpV5aB9fsqj!79_gQak3z*g zYLV(vyn5gVMU#5Qh?RXz7vba^l#{?@ax8 z_-OQDxZ{;~-}K+ZzdR=o)r%@CE*xlyUq5!^>iWs2&%O7HC$?RcYWNPszkhaVeM-FI zM~{CO!c{5WPfKQrt>ke-@z~7my>Or-HggO4H??Xjd0baKYQ654T4lt`hi|zt_56mU zpdZ!4RcUm~_2M+9zv(v<<=T)&x7IsL05Rvat|^h%Thy59&mOKK)>_InIq~@;uQ{Bc z*n`>!NmX}IqPzX!g!URLk5!XeHKy4c=xwYFR-fXH<9ip(c_;_wDgBJ}n!j_ZU5UZ# zQVfwQt7{C4rAMoJ>@0fGAmPly!@VXR3q!DR} z>M^IoF#aXqBsY z%H$-pJK?QriM%&yeVxJT!BZ;r>IqODsQIb=2*Oo*o|`3t^%7zyw2r49u3~O@HiVuK z)k7tyoX`qwJYqh4d~~AAt?kBYOlnfek`{62`oo0!qA9~VjiRBYOyGmT86H@l*2=mA#sGQK*CpsM2jVR@-cuvq;9Ol1d zyI3VPmq3gn_^UgPW|Nw!qqI}yQSTpH5< z1RgpSDKkJYPtkO5RrK6d%0xR7(GS&y$_eGlY0p&xp%uQPN3_aS+8?_U-YO?(P0b}5 z-SBXgb}$~ZMD*NM$}2k(;o&Oft{sW+kUOfL&{JQ#Yh8sO@80Cm5L8_~lo_1R{tw~s z=QH~_6;AHb^&mzkT;*{?BrNZdR9AW)%x7f9w2-IseBI7Ck>%!8yAqsn zYF&!+_$*JwxgVufW2+hlT2jt9cHYgSr8#Nq5|L_3dr%JSos01XfRs_i{N89!}5T!kNR{x#BB-_M7xqH;oOp?XB1 zG2z5QY)67skR2ThlLOEs_o=a~z zZ~OfRzL(x7MwU}f?A`$_xXwIfA{mUCXxkk5O0cV+o45xYq=I#dXxtjsMq_^ z6Zvj~5)WpIOiipjuefIFm^l%s$~%&JFA-7KRYPbspwcSYozS}K39V_`Qv1QVwy9U^ znCr7d^jsyVoX}2dJc3XOgtGIF9?>dSDYx%Vc&l1s`IJ$69<6efGEVlGA)-~TQoh=e z2oH9V=D#QMt}XL1GBMQUDrHo8G(-$DCAv=#Gt#_)%7op|Sy$D=Rm@;{<5hQBRNbsZ zMpygJ3D#S)+N+1F^jt!#CIn_NRw_Z|gmxObI)gD*K0b^aPx`s%%3X7#E0yk|I}&vU z)$^9vX>?tsr-AIz5p<|{EJxP~&1?wkTW7C}SmWloa!R<$W6f+Pj-UBc0u;g_dc#7mWrAbXAk>&r&r2v-qHg@@woQNHAeIaf(fXm4f@5w0SZ3J=BE zqkNIF6&{MShkdYA7FR**`jk*z I?$Hwe1741TQUCw| literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/imu_holder.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/imu_holder.stl new file mode 100644 index 0000000000000000000000000000000000000000..c04c67f34542dac880cb8fc45bef02809a181d51 GIT binary patch literal 1484 zcmb`HJx;_>41`nBa0HOx23&wu3Q8(OML~~1oB=l+fQEBWA`vN<*ke%ABJn;alQ;R< z4r{ZS*dCAVyxpexUppPjMY)wL`k&wZ*ZbA+?&RYB5=DLkB{uiz@aS1GX{Yu zpO(7UcSqgX>(fqpU^L_>IW5GXma-f#8PUS?y29#E>{`E|*vi^s4E3df`uWH0v@6H3 z$(tB64e4nMWFBTHOVh&MWaQ+EkmU?@OB}1a;t6%tWsZlp=MF!ZJC=+XBk}Usb-XnK z;1wgp@T?K1-ioo*NOfnZ!)aH2p`V`ts;iBvLv{t8y^rin?^&l$bF3IK&XOllS<<7cgN()_&Jd>CoT23#gTY;ANxhH$ zJTb(FGX-!BVQqo9G+<%TD@z)9eG6cGX(0wr%5tm@@yV(N>OSpqj{2YIS>RI3e;?x< Ef9b5&F#rGn literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/knee_connector.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/knee_connector.stl new file mode 100644 index 0000000000000000000000000000000000000000..12179326124dfd3c34becf2bdbbc34ea7dd4b42f GIT binary patch literal 2284 zcmb`IKWkJ`5XB!PMH-tleg_FiAPbSb@QT#drnE_86Rd161Z-@qERs4_7J@b*4;~ou z4T4E;W3Tx`D(B3dbNAf0Tbg1sygk2}J7?aV?YjT_w`J+>-|mk;zHRi#{AusQ@apM7 zdiL`=F@AnL&bK$d3|F5Y=ZFh&5yZ{MytO)j6jViZ_ai!ml8bHyWQWZ=_9XFX&;s7qjL}mokPVKr?MKU>3oS$74o)( zb>5?MGdEl330{F<4Bxb#_tB&Ct+TK2$_c2*3hO1c^){PUR|%%bQs8 z7m7sG@Don!xjwUw5vr;^F;n#lM7R9OgBc?^}&LSPQy@n5HgnC{}V z@T#0Dh)hCN;%-a0yCBdZb7{AjAm1@R4G6C>Rk2=6poj98N4|-i2j@)R)T=IIChU*| z`UtP8Z=T)Mh0t7}g%Ed(dQpQa_7pXi34rLMelsPwF-+(usx=0!A)Whnt(`j-HN3-k zue=^(?&AzUUtEl0s=?->rE{GGVs<%jQbEGfe^qw~a zZpXNJpq*AP>M8jL~IEsA-#7vX4~8lLOBTM7RiM2?tXGxLVe!;ma-C_+h1EGL*|=}h;K1QBT# z8ibXBX=P1aV58jLw@j?2h1mL`g-Di_qR@iskCNW+d3GMY_df3{{?Y!B!#&^6J@-EM z-gEAK75RVvqNKYhmp7w-7H{i#?~836*{)2`UOBoG_UoO4f|sUm)%L^pW&%a>U`(*8 zZQ&YK_5b$zG=c6BLpa9%fpr>V_lnA(Avam=UyfD8F%p73=bo-n)$qs51MUeu<1Zc+ zs~XzIDe=m4gNqZ+sF>jS#Sv^C>{)X6D2=f$GbrG%;1Ch3>OLEy#O7#n)5iq{}TSd56j`}aNZslB*uRPhrPv8wvJm{@&uL~+77 zgG_LiaA&@7e7nwYZ$nM+&F|f6FRrc)_AUEE?baJ=-CYu$-%_FbXUlJyVD!K-YQNn+ zvG}MWR%MoDl=$?*gyMuV4<>jY>pUXci98P;JD&oVVAZ~@{dH8EmeyS1sF>g{l6>6| z7P9_d8=mh#*2g)AjogmR2OE{aC0Kl4IHB2 zsF*+&1%bNa#1Qr%??Ppn+KG{jidD$-P@$4t*|%Z>bpn#!?guC4 zF!hbs1vx$+u7|2mfaE=if-Z)QV-1Bp3$SVKV zho0hm)k}yG=3#=fl1S_PI*qY%)r}#m{Cg>SLbgi?F~U4daPAW6UQ@0yj@&jUWEI~H z3ld@kVjy!e!I@8F`O95dtofPBr6H^QyC`~!vuH0NMwo{Q&Xppc?3kr7`kiSG9TmL? z3KC)jVjw#^_iM_*BCq~%ybkl&d8s92mH+-gPx1Ssmk=Y&!vyDGk)bj_zm5`Zu4xWg z#qWfIgcyMsmd}x?Q32fCe){4ujWM|W;gI`9m9gJ|3KC)jVxV6p+#1ywRAFC9$LF~U4dz(#v~r`}b2z7sK;X0Ok&%D;uD2r`9wuO;J$^y9-qI&TjIIAJ z%(05^z6A*}!unzYHrnIY-HY=x8e`Q1x8_*Ix8j0?7-4-e0UPb{E&PM0=4gzOBg=EF z@^9fOLX0pE6Z{L3$e*Q68sp1}hqJ8mZ~f>AxBi3>Bh14DY_#JoBC@D+t;V=>z|<_O z{MSp05F^aP1Z=e9g(T8&ss%CRni+kkvC4l_6(`KY1Z=d&ukG2vYK@Vd(5$~rBE!Ms zzt4*k=3xRh+T-8hE=+FJ7|-_k$?4bs1)(@$9wzuVK#`s|>ovxKsZ}AX{NFXu6Mol7 z6Xsz8HrnIg8OknHX^gqU>O)rX%lq<#^~D5iw8#I`(02b-8e_nQ1tF`r%3PkXzL?;8 GCGsC!tpKM0 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lense.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lense.stl new file mode 100644 index 0000000000000000000000000000000000000000..40d74deaa0e26421b8ba4af2519d3ccf7e5a16d8 GIT binary patch literal 11684 zcmb`Nf9PLT8OKlCA4Nl?^pCO9O6H`%(8@`DuKNU)3+kUJ6=p@vh~*f;!kKeyHyNhn zAK4$9VX5gbX4VFw#6EZ5TS<)2j1VlB_5-0tKPb|m60+z0-22?m>vPWieCv<)$G&Ih zykF0A?z!hY&+|QZDgA%{oEgm3t(qUa{PyPf+TS-1UVHfdSFgF%+eiMjbEYx%>u3Ba z35|pb^kjjkpFMi1+ui==4^?lwX`8p-d+w%+v=eno?xUvan%CUq#Fcw~=XS&2f)D>k zjF4D9tJi;T*9j4)*4|!S^7L0`YMH9f&T9XwZt+1Ks<(BOP5_fb=Y^SGRFZ!s$pToD%yvqH?6A(r@xhNT6f zrV6p^f1DKwu88}nZLOwi{pgLy-QJJ4{_ui();#R(HJ>{?>^@ibf0YDBLC<%IeAM4v z_bIpgLUn8N%guLq`wbUgg*-1wdMRqEM$>dt1<_BGzV z{+3hf@#1y<<{p3Y+slb?=s!ttMMBig>fo6NeJ0<0;WxAU|8U6LpSb(7^MAKJL3_eYtn**danANZf9f5aS;hmR0hFMXCJysHalF~;IHC2dRB_TIOyduFBN$IHr`&&cO*LOX4 zQjz+(M-DdnH)c3fTm2TbZ6AO7tGh+i`)+<VT**?>hEIkzqeiMKCXUg zZA%rNqZuVq5Mhgi+UoBz!_QB@(|x@5tV>#|us)tk3L*s&BP7&TzcNuue>-}%`}pkh zA8x6_9&1L46hzn}p|<+F%p^$z#Z zzV!48Rmd`44HQHQB1TB4t$x)KDLuJ%ulsoWn?AZi6|?gwk%9FRRf;eJ?7SW zC%MY{l4^!gLW7ATph;M+?Vm%l+Cmkc>Aw*Dd?zIEuJs}ucNO-SIK zS1I-TO1orA74}%QIw2pne->&V>_qd?pAYT!DedB{I4w)I+ee5PA%PQRM1Rh8YNu4; z%vY-u@?qz>B7s<9KKgj2=rg4XvCC;$vgk8H#0UvQI3xPFt0+393NhI0Ia#tOIzq$< z2}EimkUyqWA(vF6gz|?I@?m+RB7q!bK9C2eR3RriElZZw=7jQ~6EQ*pnbQd5^C?xx z?OtWdl4a*Pp?vN{jF3PDU99i4*c+^+!blwU7BgeKn;DwU*PeWYyA~ zP<`b@jF3P@W(4ZQEmWaq^x9XJtm>N+suP`v5fZ2@EnfB2Yi-r*6;$PS4zkqUIf(ek zU9US5M2wJN9o+fYa_$8iqe521&h9d1B_Y)zo0aaV9-iIMpbTf(TnA)K-6YFCKgM9NURh;daPx(hDL5 z5hEnjR=@7yQ~G;fQ}419MHOz?s!<{Z5w=LEt^V#_{IR~KzTP4ORk(+%Mu`+e*dn2} z`n%iu^XE17lq%fs`Tc%Dcub@%5^B3|`#O-)H|90`^>^P8F7IpV)0S(g!VRr|bts4wM2wJ7TmAZGk<$5nO})-) z2C8t&U5yech_FRMZS{BG5Zb<`e$;9os&E%xjS?w{uth>`^><%3e%;s94_ggK74F#m zTS!5qAYz1s+UnPrl$3tb*VI>9ElO4XrJ*2F5HUhRZS~u?5dX3pDZnO2pWRy^- zO&kGD!tQ4A94l1enfwb)KdU*R=WrrMNMNmIDdByrP=$BXj1qbuPV{RvBY}5rxdr>G zr3!nj86~u@oRAOOKMP-euoKM(&PPkTI4e%elI`|6q4VKHjF7;IG6Ltkr3z=h86|Yi zosbVZ&kYI067zw0)l!An<+LnW^qCWiS5CwT2}C#}5O-Uu5QF_|mMmEmofCeSL0cpc zkB#W_hu^SJgKh?qgam3)BjQHbs@IcL<^SVCmb(9OA!6Is^EL(% zBP3V{cRt>6<6DkIg{*j<{ZEd`BH=;3|N4s9eu8%===c2L_wB7ns?eSkglW4kyc{8c zNImg6)ji?&K6-N9_3)0QAO;^CA%RF;E&8B}cO(Td_}~Z$#P-YwRlHRxh`|R(NFY*Y zKB(dyNkI%gI6?xkJ@Y{oZ&eCn@WBxhh{u@^s(7nX5Q7hnkU*r)d{D(ZlBGoA2nodY z%m-DxRar_Tj*viX&wNnDTa~3m;s^;u>dXgKydzmkB#w|kq|SU$#aor7MB)eu#P%$f zP{mu7r9|Qg3B>ly2UWaPSxWf*MIYNIB#KB~M@*!OcO=URj*!5tEJx`$g%7IWZ&nb3 zlnrW*kiZ&dKB&UFd8XEibh*}S%e?!bEfUxZO(ze6D!hNMIOIc>ffIud+9H8Hoe@-F zA7`~s=cRiN+9H9onfag!=P|3{=!3RMAjV`qs6t%HYEk;2EfR>8nGdQEAG4a8K4^;s zVt(hNj(1KK;(YeI0emFdB7xkM`Jf8 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/load_cell.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/load_cell.stl new file mode 100644 index 0000000000000000000000000000000000000000..10a6ded3587c08b28c7a53d33ca6480194789619 GIT binary patch literal 684 zcmb_YK@P$&49gjD;ybIf3;)>{BJm84NPL1xdj{WG?ABm*CQ>UmwUamz|BZ7mmk~Jw zE|=Tu^nSGG{W=w%3^U*9b*CwuMGTfI0ej>;epc%t%pS;7k#*Oh0(Hgmem{!t0opP9 zYPcC@CA_If0J%k0_&6c{5V_%&kAXR%=iSFg;Vk0O13tb}vA)&P>|}XfJy<{M2R@E0 g?G5=R1vbm=ZgN|1IoIB(K%S9x*GVay<(Sh(?7qUU-2eap literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_arm.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_arm.stl new file mode 100644 index 0000000000000000000000000000000000000000..a6ff1783b63c28b8664ff09cf2dd7e620f472e08 GIT binary patch literal 14284 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 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_leg.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_leg.stl new file mode 100644 index 0000000000000000000000000000000000000000..f251cda1cef54aba32005ef4cb734bcdababf698 GIT binary patch literal 10684 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 CP{U>b literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_leg_spacer.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/lower_leg_spacer.stl new file mode 100644 index 0000000000000000000000000000000000000000..6bda6802ffd9b0f43192b700db1a54bf2f294fc5 GIT binary patch literal 20284 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 NLvy(9^~lGP_&=wrXAl4Y literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/motor_connector.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/motor_connector.stl new file mode 100644 index 0000000000000000000000000000000000000000..11930f1602531f400c708587e39013d3fe8e4199 GIT binary patch literal 684 zcmb`E!41Mt3`08rY=o%9B#h!cxU&R@URZ@=cOWm7TT}H&q~AD>ou>W6@ZUK7jMI3# ze=bn-`P$hS{`q*nR$kSqqY(w+j#Ya{D}^#U#^%YMv^sR8I&!d4Z#CgSL8Nwo1suC~VFLQ-{UjP6A literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/mx-106_body.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/mx-106_body.stl new file mode 100644 index 0000000000000000000000000000000000000000..d52c169f7a336481041657639c0645032ad5e1a6 GIT binary patch literal 5484 zcmb`LJ+2%@6on`90+5JESOHE6T6#jHNQebEw-AUW&=w&HB*X*+gv3@`BL`%7CyrPF z^_{MB`&4(0Bc9xEuBy&=|LSM@`F8t%f4-Bu^{IPZU;g_2^4pg`Z|}eP{Eclsd4BwM z(>U5Ik*c)u)V=Fty|>xz9HYnEGRAEsQ2PflWMvheY~y^r@5GHd6a&(B#$bF-q$+I_ zdq%{uUuNF^`NuRKF%BYCw*UR&YdT#W5doxHa^^%-M?|b9Qq^p!dW?~9j2roTJ!S;+ zLyTLhY@@QLfzaOSGg5Ryw#Vso#SoDy+fm0-1a%BCm^l$!tM4GzPOPbFwp6hm2jLiA zbIr_%OXb8UzqV1eN8={yL|wZ3$@3Q*Sv7iLod%-Sa#J0t!bWu_npQt`22}@{v{Pi8 z7(?ZC1_#w6;;4fR>f-xRE4TR8M;S&9kit%^0g_K+9AX+ zfiJ7lz7Sdud}R#Vj6ZwzvG(p!hhwA)zm7K$Rfm09W#WgAetP|wNLAVcVY|GMuwdp3Hfio)GOyp9oS?=hdqvNxDzj`DIv^toO?yJvlx3EcNCSg zdPLN{%YIef%`ZFOw#KtpMWjl$dj)MmYSr@DFTZc@iES#!c71Bq-KEb|GotI;$)YFt z;7M+CWBwfWrPVIYKcf}Ru+_Hb(PKaG(YUI`%8k(szAR@383C}Wgg zuRk?R3CGZG@4cd?t=n1;>}!lrk;$A87TvXKh++DJF*3t#Ai!3~@J!3Oh*tRr2(K-w zwC$;~BFt0wr8UR)dJwM>8ZSawomCGBVNr*C;WvoI8ICc|D(BwDuS7%lePv&$OtfsT zgz7k}9udbm&&sjgACL1bK^^-&f^k+s^zRaN!Gul}z?1I`-v)8-ieQ`=#~IAKguXo_ zfOG?83<%Z(zqaX&W9+rGIu=yEYi)Zx>(~i=SY?}=^FmZsIddYE;o}(nc9yEg7>SHg zGc86DwyAHZoOf!em~r2*TejtCBvNIY?p}y#Rx^Tb%wwEa%`uYDU2>~`v5oNRsj6ydv_TeDPY4@Aps-zDxzQ*Kdt)l^jvMDLF>vF$Dl1nW`0u%pvM zulDojtWt$d9ronzR^=6=pCZLDK}{EeHNU84#C~F_h*@XCskQBKx`6H=Qe~SpxDY@( zhdFa1lnPU)iq-RP7O6gs=wkziPGS=bi8U z<`{}|PZhRRc(UEy@4cc9{cYgg7dM>7E3374SCxkv& KY9aSd2k{@luO1u# literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/mx-64-body.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/mx-64-body.stl new file mode 100644 index 0000000000000000000000000000000000000000..bc27727c19c960db4d8140eb6cfe57c017b3c712 GIT binary patch literal 8484 zcmb_fJ*yp66uqF8g+&nmK97g&|GAB84LXEv$^eLL`U?rna8P z#Zu71LQ;r-z{bW_aj!Ld?OA8e8Pj;--M5)pYp?xvKJMxC|9&3P-F%LJGydND?AG$d z>z^)v{r&bN`|fiuUcr9&=XZP#O3!eV+wcU2KJ#Vxn!?v44YQ}v=5wOw_>Mm^pk552 z;7K+a_#)$nN8jQNab0tX9TS>FAZlL zM`b8zOsaIlh=}l+FQY!_IZ?283_f3>fQ#WMx8_lZwVidcg3Z2TlP^wQx$mhjCV9diJK~7@-M;?x{oO*^d>P=3`gbqed^}M2*Gpb2` zfpWX475(E2ezBr#rOM{>TDA0_49uudv~#XnMu72Qt)|=8p1OGU=J(5&AAD7|a>DZ! z3OE>!f{i?YI%J%My79^LS7O5!19qc92BH$mZRm;7?r?e&elbf`1+k&gGgRGREV74; z6a4B;YBUVhs?#VGG_=m)sbR1L(#VP;k76LFj=|GlkCKKnnEfS65E|^-jn`hd`ugGf zw4Zr=z54OTt?O$)7!hi=&lY}BtKWWqg%QF|aKMe>D7RUWVuUfD-B;RV{QBUf1C0Ud zm_ZHqm9`kDLK_wH7@&?B(kNfShD}C9Th9Zyer9AoKpiuJ$6A%I^h-u|cIo>uKn)q3 zUB(tGwWeJ*rVlo9YStha^9VI!&^-v}JPoFgo_^yhPXpPk8=ecj&ea};oio`TV_k=u z_B-!>e4%N-eeK?bp8s)Fo_CqoUILV=yWIJ_XUxjnQPTM5 z%?CZBqKeEJ71W&}yP}c?YDI?556!C>zQeVdqb5S33SPqqh#xX4bD*S$NRAo)X2j?^ zh!s_t%SKM}RE&sg&BNa~Lpfp3Uz1QjMkv&$W0Z!!kqw4Ai?f6p#qeG9omXF8(2pM< z-_-fRov2~Vfnw%B9qo@T!%rb zLXQmexno2!HHk#Qmop;2dd|!}kMip|bqr~sR^`hX-q}uLLZ1=4_oib&1NV}qAI|Vu z0B+412C~)NSvK@wLmNBanBge5#UP7ORc~X5la2jK(~jM4L&MUF!fpUtH$6SClasfx zAaI>KO1I2CgF0t?BN8!W=Zw{J;MP+U|3|1NGve1o-9OF7uZiuJF^79Z1r7Y>Xc(AE zXdg3_M`X(zNAB~qRjVxzN67{X+NxW`!q2)VLOrHou~Tia+d#1HjnBaaeHPnJxTWd& z3@M;AiLx#8Z4#^JBh(=S66|1TuD+1T z_bYiShBVL*YUG-rZTDU7`2pT)bG)$qDFchDf)DPBpOBlk;fWeLWJ*?!l5@?}z%Y9km!R#L!MX36-8Et=e@$#Mq&H zDqBXQ;eA$Au?8nZ3t(wf2OZ^h!*Gq}mZ3@`TAhOfja@&GdB-RXy-}srb5&%VhfvsY zRE3VwXyl!$TOWs+Prjnep0EnWQ5nitRLiKS&?!Ho%$~HO`sy0Wd($!+4ZkOvJ!uX0 z8ba-Q(=r;3{bXp`(Wkyvd%t;GLT@H9id8GhGH15>#p3r}vT&2(?KLOdZydNMPI%7n z=lG7ly8G}=un-(PI?|#qBq7q^Ng^~ymnFfRV2oyHl9;L3}voJng|h<7-XIC z?Kc2F_5C&g9CKiWH6<2Rt$ExyeM-1S&~x^~8OU6oiUFBM18>Am24P_3qiQv0RM04tY@p<+VW7Iws9P~QXpE&YhXxtxw_#XR8w2hejjR7?6T1|%xX>czA%KFi0beXH?L`6>2$jr+=o&E(bwcH#4 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_left_back.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_left_back.stl new file mode 100644 index 0000000000000000000000000000000000000000..19d998c096b9eec55f559c8af1dc59d983e5e17a GIT binary patch literal 1484 zcmb`Gt4;$!6ow~U6pjSN#gJeSU{JecleQiOxN00v08E154G<6<LYf4#)e8K0Zl^?tiYu0|@1{wZOyc=BiC(u=w5~Sv z?($ZHl+K%&-ga*ZszO#%i07ld{;kC5R57A2OW4z_>L6iNu(@w3fjt8EC8J~%?4)=(zATaMZpcbcv997xObNa})FN5MmlJI6uFgY) Qrf=NCsH<2xJwff<59r^{Y5)KL literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_left_front.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_left_front.stl new file mode 100644 index 0000000000000000000000000000000000000000..ae2851d5b268488f428f0b567dba3f7ad499030f GIT binary patch literal 1484 zcmb`Hy-EW?6om(oAlTVPVzRR{9E778c@wf)5}>Q0$CgEm-7-eFW_- zt!<2DK<}B&8P04{ImBv%x;4I>{W+J z3|CTxE%s8bQm@waPLW!YC7#MODTV5UeQ$L;fB{xmmvhbIqv2aWg5o6h#~LWeQN zU%x}+^mx}i>e1m@Dk7b>fyczWD$kE`?h75IVRxO>zHRcWk5@O1*K?ufZ= zj5%{B0tw{86Rl(*5qecx75r)*ut+;d4<)#6(50%}Lsf(JBXq&x>fI00x;M}{5fI^t zs<@(k2>?#8UZ|9?*t-(C3poi@XrjVt73RbDSE zjL)jKD@q|3!fQv}nE5~g5IQowsY;ZwdzTsFdT~uWFRQ}4qWxAUm>2IhV^@Ts3%f5c z9`CIpbV^VaJ^mz&sd6d7s@UyuFW}KnrSpgcPdA(lnhSAyi^Mz2Kx|EnT#`sCIpMTg zpI6r2SOJ%cT)(r3X(OB}|ffAy#F} zgbv|;`01=Cb-7Pfmjn{3(!9Nd=XW#ixpay9aok1rQ=LA{r36&HL?XNOb+7($NTf~# O66|B$_)Ar*DiS|88f<+4 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_right_front.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_holder_right_front.stl new file mode 100644 index 0000000000000000000000000000000000000000..2911ed8556b14427b2cd131d6ec3b252111f4d8a GIT binary patch literal 1884 zcmb`Hze>YU6vi*Kg9t9&L>vU`;9>`hh(o|Xh|tAJ2NmC-Pap=wK@b-~K_{uTPoOAG z$mXOt3ci4ggHXZM^WB>-Il0lzOeZ(r@BFo&| zgfZ|9HfMu(ON20d6=VEL04?|;jXGen>(G^BP{rJR0u-Lm_KLosBBAH+w2+g~Ds9tK zfe1vgz+S;d<*6e3)5-)@to%7_ zW@PU!RPaUGW)W7daqe~rY*dV2ew0^Rj@ft-F4)Y?OntEpzp9bXP!fiC*PvJ3Ir5B YfipaqVqS;NgoK{C`)hrbpOqti09LVnH~;_u literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_main.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/nuc_main.stl new file mode 100644 index 0000000000000000000000000000000000000000..773dc5a2dd6fb9baa9850bc289cc603af7ceb472 GIT binary patch literal 7084 zcmb`Lv8x?L6vl69Cl;dEJP`aZ+_#mfL=Yulia-o1#!9db)7S|%rcY;K<3F(Pf@rX{ zQfnKlkRX9zp`P!X^PT(con2nzl6&8|bI$L4vomvcW^*|Fzt>kiUCTf7%g^sEf6i}D zU;psz&5JKTTb_J-gZ7J`zrQ?w^dW7=f{0I>J?fR;-&vl&cXyuvG<#Iq3-rRCL`NX= zca4pxZGzaj#zqfGuQfa>ZE4`1PQbvqw3-xpql-)JHczU4DD`E;R@8$9^p~4yT%I-zqxwp?=PUy3-HE5S zo?bop=?*pIfyUN~8HmaYj}x*x@!cn{AD{j47B%F7Mn2~k*Bgk+3y%}BJAwSriC;|~ z#$51{$23^yYF8YI7Qb40JZeJJnuvRttOn~O zqY4HQRlsLH?89M?@F>~n?coq}acMPJxuRCMUm@!*vGO<}yKBUny0jXsyiqIMU!k!} ztUON0?ix`Wv(;ebjhf)z4vk%6<#9rG*NFVH)nMg~TH%=i8oR{Gvpypth}+pdA^3mF0t}BA-iit ziq=2vn7LF%(4d`bmv+P&k-6x}in@mID6he=u|IBTY(y>S#6X}iu69g`jb20KQVrzP0DT71Wcy{f3Z+iijv2#<1& zY@afa`A3Z;7&Q>*8jNxx?i}~Gp^^1WPu3mne3onw9+gkEYY2~WdVlSDR8}fA2BPlV zJx+Mt)Ch-B6}6yMPXpL7y4;Ci^J?)OpLX=9>>=raAO^xcPGoOMXE6V?W6THMo#_dJ z?*nkfd@OiZtLPS1eA>~YVx$+mt08J2&=^-cdX&@AtMzK{z?nvj!h&}-IQI$nIFT#y zbRVVRYcz=o&SAB;Xp9f%13h6>-p4i(0IsURfymyny@&EU2<>ptO8 zve84ntKt7kpwZ-kcGLuRHRe_OKxi*g6%`@66L|N)+Jc5W(1=>W{z?tC4@C6@9w%gX z0`E|$5opK*ji?Fi?bJ~FKvYlQaYA+{@Ggj2hlV`Rh?>Beff{Nbi0TPEPRQ;A-f8j7 zf`&ZMh?*Go-GQi{z~hAMPT<`f&t7QA1C6MOIkiT?m3jTMUk literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/sea_connector.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/sea_connector.stl new file mode 100644 index 0000000000000000000000000000000000000000..6330b8215392d9876ae54513fcda57bc6a57b230 GIT binary patch literal 5884 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 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/shoulder_connector.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/shoulder_connector.stl new file mode 100644 index 0000000000000000000000000000000000000000..a40dfeeed33613fc662cf6fe1ba85de91b7850f5 GIT binary patch literal 11084 zcmb_iO~|cN7(G`8m#Ok!26up%7~y{Be5bB~0VQRiBqow6DTH2Sh9M~>Q3f)*lD>QH z{U$PyA_El3%m5h}8IZl!e%AA@z2AMlkz4nC>%M!fy`E?PJbRz_yQ|gz`{$?H-Bf;* zztiy>xBRhw`0h^*KK<*ZHSmY;e110YPR}W66wY$oE2b^9rC;{-);+J$1FXOck5n)! zR}7l-(h&OH(yQaB4(EO-c4kFRcc zV0-!VSJOi+z2fM;>&pzD2@ffp1uPakgsaDOKR>noar@0BZ|N1ky>ad4nODC&OT{FG zvw+1yPr}vXhbLdyzVPcq^iWH$IQ`Kzn?Fxo5gt-F3s@|82-m2}X5t?7mOYB2R^cqe zN7hp)BC11g=@pS*r*IaqSm;T(8C`m)rB}oZUT7800u~D%!c`HgWa}-xBGy}YNZ~AC zvCxxn^@!C@54H4)*f-%Jg|mRgf`@SRh+Rt$we*VE|KTBpvw+2dhj8_X>O&8;^opos z;UR^yfW?A`aP^2PN)NU4im1ooA%(Mm#e#=0JnG&6C?_Xx0C5gBw}IxYUxe9gmIz+#~%VG1<5EA!x;A@=-PJoieSGw2Ft>$}VMc`EXjp={&S zzW|TnDxrs3!17hOKM!a5UfHiu3p`xmGuYb>GgJTsQ2Z$;n2JwjSyWtbu~Hq|Mw}x>=aVtjNrLK3t(4Ok#XY zTlA%|vdX|!qMk^e%4hjI@icG+o}&)-QL!eXksj(RDiIY{E15@DQF^G~sG_Ke{1&F3 zN;@N}b+`1pK~(XbV`Fo^*7K#pS&m(i-@LF&vg!kCg#&BlGpJ)al@C+wfNjM{!ILvR zu&x+yjA+J==ZY{rCLnJCw!M-)EfvnP{dj^xa}Ezz_iFb2U!vOeg&gaU+{26L^bemmem!lm|1~@=n-SZJYsH| zoWN^G*IBVL#tKO3;hFb}vTx?7CMmS4k-6%JjY6$HSnW`7KAdIMN8>gtV8N)ge$ekg zu>-Ho+*yH9cjYlFAaxJUvn#Y8Nh}|=T3cUh!?@4MgL$y>;KszvHRr}!D&)bNB^2ep z%X^|>c`%RJL)Fq1xH-AsB9EP-DtQR6)f3cIOp!VA7_pWL<$*i36q!d<>b1OE4^w2n zy7e~-dE{6{w)E>1-F(QyS&k7QqmlLG=*fW?A`aP_daYT42&{8U>_ zQaB4(EO-c44|}VYExke&yyhW=vw+2dhj8_g;+LL;Sr;I z=qW{~IkO7BJS<}UjM77INI*Risu(xX2(kpbIYZcA{ z77HH2Rl(2tT`f->XF;v=DisrURnJnty<)z@;dHh$inzRC7PH0d|GglA#BFx2bXC z+=Tj|87m)MvLcfG3Pz>AEJ7+Gs@Y>I{n5kw)yjZ+p#YH{F;>hY=BCLBJZ3%tpf6{| z{Eroo(j#V&vGqO$I-_h926OH#otAqQj0$F0qhJjbYqYnSJ1g*6^OzNo zx(73Ng?2D_xvqFa);AN}meGm`ft%{X?}Cu_EGVL0jTPw;^@<)+s8*tvIdge9%Q1R_ zqJB3oKl1;6h=s<$S%dMcRp5bGj+<{25V2CKJKv?xr&(TZsJxbq-I3K<$dj*B~ zzaRQ;xz;Ga1AZ}29KXzi3TPFH@K8}2>#3%`d@XrS=wGvp-6h6jD(H_*4HcC*sxJ$8dg6tW?lLk@qOXt{YOpruYwe@cPpL literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/speaker_holder.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/speaker_holder.stl new file mode 100644 index 0000000000000000000000000000000000000000..047963389c15eb7a3265f84a41b974cf44a1b70e GIT binary patch literal 1484 zcmb`Gv2DaK3`Jd~$N*ObX>N%CHsBdjW*emlGC?Nr5-AMa7+E4ig#VLYqGVqe0e2we z|M*3Unx_9w*kZ5s_7j(S_!bh!v=*(4QrGg_9`eJ~Uj#JVay_ViBDQ{Jy?e-fhN7Jm#r(?Gq?b2X630bwbEz%@vN7%TFHc*P2xkv-0d6>Al1BP_BW9 zI-h?VH;7#xnef{KrBhj~Nz|R=Hh1h}9f>q0 z^oUHAaL&k^&W@eI52tNJF@gO^z?~DF^G2ph_)Hnqy^nnV?FRh~R)TY-o-~!ek35N$ z&{V71L#J^LED{BQDvw@~fZ|XGUlYFMJ4c*O7_$&{fGGHlDku25I>NLhI9KSd)sf$z P6WXV`Bh-_2!jbp`6c(4n literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/spring_holder_lower.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/spring_holder_lower.stl new file mode 100644 index 0000000000000000000000000000000000000000..799e36c1165233be9c6503476124e22936d7fec7 GIT binary patch literal 1484 zcmb`HJugF17{?ET#0Rj5m5H&5<YRtcL(4BQwbCX2*`h{eFtRMMAALwo>f z%sv1$Sj5Kpo!+PSf7(^kv`_B&|DN}Ao%`Rx5!#Q| zRr@yy#M4~8k2oLMNA2o+m3y+Pl@BsC1R;c=MfXvc?<|W=_jm*&gDc3p(7Bq+K~P6yYq3NfdZI+UCDf7kD#Wli4l3Kqm_Y5n rE&m_hS5~=pSF=UeBf{IqW}p*{2_^@|{m{MA`D=agJ?~f9O^t~^YLSnc literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/spring_holder_upper.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/spring_holder_upper.stl new file mode 100644 index 0000000000000000000000000000000000000000..dfd73887a37142c8636442533fc8af934a23c659 GIT binary patch literal 4784 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

L7ygI0rivJq`>=~3 zvL8L}xsovU_c#Nn^Iguo^GuJJRcU!Qz@+^v!m~+K87I+KA#8qU1u4U$4=UHe=IyH0N4uX_lkzec-o5sxtO0e6*_WF!h+~@s(9V?D=C^)cG48 zJJpj!d6>(*5}pUI9-fOrc!kZ_?R@Tsxm4-V)O9|;dSqTyJ7Q4v4puvcOy{DmG0Rcc ze2nv5YEqT4uRm(-0@nF1D=uH-c)n}79^J?Fs>)YFtdfZ!|4Ud1Ud6E*j9n#`>(O5s z?NpBl$lecfp@R1H0IjlIkEE>u0$heWggGDr2_~s6JLXipIGw z$r z(u@e7!5bbYcD$s<_gMT49xBd0ET28@Dz@5(L_?34nTuG0(cOEbihevvlt<=TiI2Z} zejuk+sUmhhdZr*6z@vW?Te}Kex$cB?*Y@X5SaT=bgO~Pb&+VtTDhWO<&FIpqg#fDW zhqDF`3C7U!CanCIhpJpl3sD#zS(Aj@;JU78uXl^kD!(_3a_{h1TcrxZ_wE*Av?}wm zjwQT*VzlaLNc-ulUDbW%H}$njhDYW~f)QDW;o+)AmGMH*uo_)!lAwQAax8KNiND}4^l$s~bADq!PV9KeRatZ4A)S6DKH78p;T6lJq9xA% zLKG&UM-tn9V6(JJn%3^;Bi)IekHM!g@lB#EU}!y{G1j@v>E zkE}@|*FuRW5A&kREy^`^rte_wOY8@|^{ghxa1hO>_gqz;EpLg2_EqA1Btie2o8BDc z5UHXcTtQ$q7ospd%$2Gf^;3L$q$)kO1P!ZwqGNR@9Fg)kkVB-3SQQ?|MVwFF! zKTk{*u_`=_R}X9M1WHD_h@(BXpWcroc4WI$`p@@Xf3+NN)?2vg_v5U>Q1;7lz8$;LKPmyXZjA-|1E0`9>x&v$5szj5ULj9 zH0m>`>P~RK##mQJL)y=LjLKs;9uqNnSaT;le<*Rwf2|VFCVJ2N*=rxG9-rwuIPHD< z*=s*Wu?^b4F4ZGd#HtqJG@8%)lF0M9)x*5J=J2)QLJW_rNrJO}k5{uts(6*6Y9WS4 z*4&Bxe58ul&uQdqku!a7+r@~(2_F9aS% zWDT(dqwY}@G3tv@#mX?=5YM62xA zOROQU#P+(+A)$&DZoDO0wS4j|G9_Jk?b)DL) z2Cers2b|*)TaMqjBV}CKR>iD&Ry-55wLOmZ?*-S}xo*sLd}2o0Yx?J&tWvnbOk7`ki>a$CCm7_Zmh+n{FE@KGyF?gfvz2^5$wG!=K96nLS z=sq(Ss@>kMdjwJaaGxlF%1pMZ_W=)IXHetoHe+99pzH6*5ZqOco0({B5!DBxoC9M# zh}|nq#F&p%WxV$=mw6=|k<|ktRT=AXQJhWWCu;m`4hqYO``(S;65QEM#Y2M1_BdX& zcf#s;2kEiT*t@2?wm*ALrwLUM zwrWc>v*Sh9+zIdau2!`c^{pyZ#Hz?-T*Ud*J*>GC9H|-U5+Cik{q(U)!utU5SO}o% zhc$Re_&>VtJyf-==rPgq^Eh5)t~+u6A69!mQbp|l|FQc&SuYQBCBeO4miOk+BwCd! z{ud=Z7NRhSthp18`s|Ua{y#PK{}G%_6ES&Mb0=J(t49*9T|6dY@~{RE3FhDOQ+$rq zUG>^T&N;FFBQT@xedxoZ1?wtNwX9vR10r+L_9uz*$Xs{A&jOL2{M{o}#Hz?-4B(@0 zQP$iEKhsp|qdm8uzSSn-|CWZwLIBlPYYiR}%(>-FSotpxRm`UGLKKEa*4znOJA0&x zSQVL!&-5KE4{Pp(D`xdb!fy`5V`<5t=thp2RZ}vzPv3pc9O+;b#+?qS#D4gQ6 zAKCL9(d^$!=mBBgEz!_M5>5Y;bC0F`P4nExf7mCl(^-;Jd%j>hq^jA zRy#y{bPsdkA;Cyn-lfRxhbm^xcp(ad$eKH0YiEyC5v$7iKht-xJX9q?>}<{i+qo;8 zy@WC4u7$Z(smgQeg#bI~dDbMsUSjeXM5_3|Q*HZ}z^3-?=DHJ(2eVnHFMr zSd#=ZYkBqgKu)XfDm}IY(D{0>zcN83(O(b0-|b>c{!ij~|{Va{S2HbKjXr z7013Ld}UF@(VpAS>;d7bB-26w)v?x^Bsdya-h`F^@-QzmXuKuLBWv!2eVRQ|MXZWU z#zmY@{jATLJ28#!(UA5tzbb-o&heNCJc`JgBpBU2kt#-4k1c^s&4;;?Ahv%r$j9-5 zeY-@icFHH>XiWR*`x09Mp=u#clkTDFPWW1+#4Z2jk%X^B@K^|->W4LWNU+bheDzSp zQO0;73d197?!|hnD5AW5r`4NZTIswbvw;o|jw?^U^2dEm0m>lSGaP>3#J7q1%~)&KWc= z_0gW&Pd|IL2EsiNV`q60=TrBv=1xeLxaGe*tby>ziHGH9`VQ8&^;mN!q`Nddtby=& zg@@&S4{Dke2B0p?g1rpKA1u1opwi z<1>l}E2OdYEd_T~-T^TP#N$4I_HK0D&%itR#JoGr9R-$GtMGt0cB(BgJTjLt1jpUI z$4<2p=l8u)SmOA9>z0!QFr6 zO2U{H)>w_6y9c1ueHXFitQP*R?XUWgDq~a&0rUbi-Hq*s_bsC9+c>{>sx5)IJm|T( zj3F39%dxmTcB(A_R6TFo#Q0nRcYL!l7*Wfiher{qGDfu{`Uv+e^aozyo(bZ%J&bSM z^Lq~UxQJ9`oJ1cdShiaBCB|((KgDgITys7Xd_LRzmbmN1m_6T~@VhtgW4LVqP=VMEhhc(wK>8+xC8mpsi zg5{BUbEFr7jkXADE{`Whw+K*`RJZ|4PlB;P|m8GH>pQw!|~?T0?v% zIJT2f(jmc~;To%J6eyqO9HM%jV`XpgTL>(Qu%^#B z$B({!uuq&k29bGlTiFuTb8GOp6Vsd@wklP`&OezJVt6=KNjQep{OOz_RXJ{3qCD8n zcOH~aV>R`|wr8IfqMFC}SaTmM_M(%=ATn?6AGbvH!x}v9#4@_aT?JvE$g~i{!?8-j zF(RXH~c0a_lt?R{U{w!3j0?B%DE9$j@OmaVqNDpkaemHi|2*tb_d za^LQLkWojucnrePZ60I$SO^M=u!g*MqD1X!>=W(B$P0nWR!v0xK~3(}i0>^#I6NxX zth)Aawr~)`!e(wXXOmpzv>bK69>Z^mRAub> zZb5aN%5M;$C7hSg63ZC{)a6k`s*F+1M1I08YasZ9Qxd)BNuti&JD}vs2 zOY9wcmZRa(uhbIURS+od1ZCZaYkG`3?#A?kD|(irzUE`6+7iPfa~VT$WpeMaQ*8-6 zn8EsPLyoDe2G$ZWtAy2KIl61kcdC`(s`KkU)W6G{p8K7d#*CZaia`teRp*m9cB+-& zs`f^aL(6$>{Kgp z&iBDo@_w!FxEovU`&9frj-1C%^(0Xq=7RRH9KI%MywtFT+j7pC|EFQjUyc4YaCcfr;c+A9mhsPim4{GcO z+a2$>;WvomTqSj^?Jc=fTVi-*E@O!P9S1v)ooY)AkIZEZ!RPk({n)9t#PG;m#t`iJ z_8vRcmKYwH%NT;~e(#a0mgbpr^O(5T+=+JPF>fD7=Dp&#)O*{|gJ_lgOhXTAy2nLO zPbMDY+~jQgTdD?vS~IQ0y+#60;z1mD5AwEcq*TNU(aL(OvL*@luB*pRg~vkRQRgM( z@P7s|ZgXCvU^yAC^OBuvOGv%sSmc==aoY>k=+Y|V@;IN4m(=7jDr1hQsVk7h^h>ClUTdHT2b2m0|J&yL=e)>vO1;L%&C>Dak_GsTv9l4TVtR|0=>tWtLAKhb1 zltOoM#%8MFouV+ihHj~9^8$KqPOb0;&sh=Ub8?Y&9RWHBALIB?yP!C-6@G`OSJOiW!7+P zPmgK8dmx9PRqkuO+S2OE!*c$f`(ZBpGTsxYteJ_o)Sa1?fAYAiu72Ez6Yc$Q6tf>W zhUwD@+n%GaB^o*(Iq!t~{PH-E??zV@9>ztSPxG-B4^}NGyirjvfm$|uO&P#(R3?g&g30pgR%&PZ}l|iP7m^`e3&e-*Kio4ZI@2=-h zUaMP6Id@9?_qEznMeM%zF_AS%uy23tVct9fJSMUx3HC&Lk5sXi^xG0`82UM!x$Xp? zR#?X>Rm3Xrn258YdsveMt+m`NeI?#i)^3Sb*^iv&LM4%F!Lsg=s+|8VQ68*5kFTs( zN0+V3^4TL*Ic{5`JhJ9aczi66135iU6|pKZ85eOr^?jl>cf#XiiCg~5BMJ8gc&sUlWICgUQ`r~ZGwSaT=#+efO1z3TywiI_aBNrE`}b#Jr@w-%lJ*3Vs*Kh2_l2#w6OLi2kM`VtxH{#&P7%AbNGH;jM#GM@+cxzz30Ci!dyuZTRwZFiW<*xpC&Sw1oYH%3fiN; zj^Y#K{6(Mm&4brIzNW5%qdm8u{#va{+7pDU@-dM$N$_gov4?r-?G?OMsTgwRW%7 z2SGXB=w=Vs4=Q3?m_+ru-VM)OZjVWjzaGcwGxh+eBv6>C)a|M7q4|sVaXjBOh9-7@ zjBXIePW2>F9_BKyM7~y=Js?t*F)i}ZDc)Bx7aqozLl<$_msA;}S_m+x`bG!NMHx+$ z?e58n5m-)Kk3%9=87DD%Uhl=zc3Z;hGh_Qi{vw)3{l5V9Do&NJ=U=r_XeU0C{cIow)h|kE*Tm`Ud{IdxN7|+xDw`CbH&Exc9z#jz_A9nH$QWOs8q3Hq#qMmlLT|)sF%lRRjw<)v4Bc4xnc%!P?M^+zxj3F z)s(gRwgkYG>rPCqI+~cDXQ|?EXEXaZw<>Fr$Tc=b_dvnJyt&4sFr1}JK;K> zJyMlzC(}fXo@Y%G`G2#N2gJcss_2umxg`Lm|L5gSJRU3a=D6jkk5-jOK6xf5D*LezRgk%|g`Ni^ntPtAZ2O+z zvoihTMM@{nVo7!RLgjcGhR(l!rA2RwFq_n44mJo yGUkkxb9iXaUdQXfBD`)0L5zwxSIkPJD&uMqjj7jZw#r=Qm0;_7Or$E~PW(S}tF{aP literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_bumper_left.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_bumper_left.stl new file mode 100644 index 0000000000000000000000000000000000000000..1abead395c34ba6baeb4bb5ef027cda0f566fd59 GIT binary patch literal 3084 zcmb`JO-L0{6vwX#qP>@-C1Lb|&w`LdB7=xGK7vGwKA_x03M~wS+(tqcS4uJ7NRYWG zqeb|jR=RbOQ}kK{wX;Q#K_rP_6eMDx)co&#|MASst5p|q&YW|8=bZa><|*}mN7@hf z@yDT@Qri2zbUXJYHSTploxTO68|t7WPA0ni@BleMTgy zSBgZ`A_>YiM^8tkx79yac%x;c@8Hnv+Hx9a43Vfegd!m=QG&Em7dFk0R}ZH==XI-D zUEUAS>s~f;a0|2~=p}Plf2By+y@nQX-HQVb@7?>-k~C#fc!r6x{u<}V;~IOy#mq?u zga#^Whb-q5BY>K!Xo(WWq3|zU6;BBW?lWXo3&;=}Qq+sPR+Io>2*!e!B)IDE3s=R? z0D|}NuQ|+GNiW{6e-pAQNpMBtRY8MckNp}obs4cYVeekY_w649!(H+TG)d+kh#>wA@R-Q{;s(x^y# zHy_?`^E1t^^kQ7>O>qLOv`B(7d@!`Px3oF?=<9qUYO!{u=Kq}>|RN{ zogOtgq=o%TMzX}4v23EFb;1zzf`xZGPQbdfV=A=gl7P%E0a<%fW7%wHA&0cE6UB36 zx>vHV3iF^BV)5R^iG`}Pd+ujLtSS=nyde^Y`Q^tKB~J|QO<|Jy;PrYS0 zl}Y>GS`yfES&6*=VIt}!yAS({&EsD5uC4K}%Z%8AM4KeL*4yO5Oi`^M7;R$LxCO%$a-6@BGjGIQJ>_f1jM6 zPM5xlyE{+Tq=qM)sLH3Q$)}-l5awSOWhA2bJ50R)b+|=D8&av2jh-B$E;)VoVUrBL zHHe=p*QaEZ)CeL2WBXXv&AsY!yPH>2d#<%Reb09~oD=mp?n5M^QJ8HqG0`pl$EUY`X_f?| zjJiez=#MaA97TA{qmh@Z3!Cc$J2l+k9KF|I`y(I}Ja4Nu<=A)BOC&TkWE6Wakw8^e zgX)NqgzUkfDmxEZJNF<_LmLT8$SCeXB7ve}RY}4-J7RAl#06DZg7qRV`>~>itx86* zyDAc~swBakjaMaWm$zta9vTz!)ysD+-!d4lOwdCbRlw%y!Ed`(8b&k+m59M&Ti7Xgc-{Bp^T!9C}xrbZ2wM_Gv{poe11^PaZ720lVH@xTjQg& zV}vq&?wXsS=&SqPX`)7DuaNdNNXRIuflQLn?$x_PUN)WgBq1x|Dqszvq1|scTMJ)n zmeMk>RWE%=+9z774i%=KtfyrZ^I|McpsJ`x612-zwe_#1-^@)|iXDXv>_<62jBEGU z_eYtT8>x(pk~e3ZnD&M;oo8-`)=Co5718d)3-y`57rQ+f1#xJi_GALyh(}|LvxUt^ zyFc3V-h#VSkZU5}IPrNb*X6uZzgs;Sg?zjp7F8Lb}&zL_H)x%d?<#oq5-Gn2s_;(4CS-e}ubM M5TU-4Jy<6G0mXwDT>t<8 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_top.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/torso_top.stl new file mode 100644 index 0000000000000000000000000000000000000000..6813943177c9e24c835a925a8fafce6517f8642e GIT binary patch literal 64684 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 literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_arm_spacer.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_arm_spacer.stl new file mode 100644 index 0000000000000000000000000000000000000000..ee3be5ab48d71946a2961f1a5a108a8f1a3c5bcb GIT binary patch literal 1884 zcmb`Htxf|$6ouCyS_eD;0umB}tD`Mdpm11ZF@%JWU4v2U1-5K%QY+j8= zEkyAPk#N;^XEALhB32N&^3JZ-hw>xF1Dd!LCyz)_l~f)(5k}(Vp+1^D$s-a)A6ZZ( zPM}gI5poFmdFOgMf4HA9LW~D7Z;kUmK7r0%^>Nu9{z(*A$UT=6WjsyE4|?3oP;$pta zBqGGS!3?!?JE_F`&^Q{NNCbkWiV9IQiC7grwHqZBevq{EjZ QuLL$Dts*KXw9?7r8$xwQIsgCw literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_leg.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_leg.stl new file mode 100644 index 0000000000000000000000000000000000000000..93698c335ca7670356787d7a268912c31e17580e GIT binary patch literal 8684 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 Q_7M&URw0H8_h69tA9K+z!~g&Q literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_leg_spacer.stl b/bitbots_simulation/bitbots_mujoco_sim/xml/assets/upper_leg_spacer.stl new file mode 100644 index 0000000000000000000000000000000000000000..8472919b776af845b2fbc78650d7756674fc54da GIT binary patch literal 5884 zcmb`LL5NjV7{_m8Vp+>Zw#XDdtIWTRS-mrL_{PPVT%YYC~D@A=pb6+ zB3mSdMNu@1W*j1Binl1ur4oY$AyE^wb2M5M(RBXbx&M3q=iQU59?s+Qp8xOszwbNe zzI)y)ivRa@FqzI(zkE2-{rc^nyBjW#b`hUHdd}hp=Pz_mKlYr(hB*K3{{o?^_qTPj zgsY76$e;)O&TZP>Q$J|igsL<~wl=#1=KuAXFI0$;6$$#a300w{9O3%L`8RsNogR$Q zE6~sy;Sda}=*O870;qY+9RIT9yq~_lw7?kG6T*4GJXD1kDtIV?*<-Ib0u>3Y$4l!c z8xN=>p{j5GczO{YgG9Q5ms+4_X|V!P21Wco*w?e;*BTnDS4gh&?{9v@yy2ZMnvcrJ&-SBR89}A!w8pC z<%qav$2p;dNw)|EC_FP}Sn}@XlVA z0GiB24-%{ox~6jL6+Eaq_2{iV##zEVI06qP*te`lQ#t#?457v=%}Q06m)&JY5`vXC zy;1@hnnBA$RoIF2$P(tk5#&Bdpl?l94rYTY?sn~4Lm+58xCTnZ?tZ)PpRZoHd9ph2 z`Js;9&wqb%t^4F1mrBgU&y}zfFVw`F`|g@ml^-oXdS~JW#Nb>xBJ5pyc*3cQF=}E~ zfnXggr%rZsLd=uK;b-)pyIO~;80$=d7`?o;T6esvKK||E z4tVfv@c0Akd%7MxOB4l(GlwVcSJjI{cbD8_=tv~SyvJJaf$r)^jtIR{LRE~p9`OXg zte*OP&pbUamlCWmc#!z+uMP96Voh9+cmmks>$oM91*&!gsK>GJ=pc4=&nvx zN8WfByV~(7gSp-t9Vs{O{L`MTydLUMLRE}WN1Hh5Jzl-C`k9U>!Dm$T*b}lUhQ>CR z{1j!33`vB_kyTAN9bt@lNv9qwd)Mqxm1fl@&iJfG9=<-OBTD>uc(lZ`D|#ID#HHoi zI;!$H+h+-S)h2e=mFq~3h?SF26=SS9XNm;sc<9KkSshV=^+f`8EbsrRqbk+}k2Znz zxVm@ESshV=U5_5vB`;rD-L5L`7^qTW-L~c4+Gi*2T#b7WCo=SX=GZQ*fjy~tJ$MM= zRK*x|q{L0N#|P)Hj_ZgLxX*b4^nIv_YmdA&t}5JvQ`1`(;E@umTVowMk|V;t62hs9 zF+WRq)-DRxap0BRbM(MmO0d4*!8%?$xHP9K)&!4~KxN_ODm=G&X3$mB=e%j1fA@c` zQkAZGi!jU+ePqRFhCXrl=~@eI{&1#NmF}_sCe(vnz`Qz>`8faX|3X$=XZ8w;7J-ZY z<@!3Jgx+aE3ONW>p+7w7WeM}p5hb(>sfVf%^I6*>3`15rqD0zV{~YZ569Dd7dph&` zGHLEB{x)DIfQC>NV0(O7`Mzhl;zMG4C`8 z!?#BSgDUQP&ScZdo2$4JF|TID9fRu);NYcoaNa@M2(J#GC92}?%MymcLo-n#n-y&A z6At$T=7ow+9Iel$caW2yigz&RECDF#l@i(!FSPlChpKdKvV?i)h!WaE^QhlK<-QL4 zma69mbb;SRP3-);|8te9^fb^S0N5Rc5q@jTJq@^bZGIzE#TY8iln}P#F~Swht+`Jo zyc}vks4B*|&Y2MN6$p&5SB#N~cEku*d)PN&5USGH@0R8_%kT?`u6gZYXCGc?Moq8i z(fpQyT?ti-sL}BI6|;f|Pvoql=`IL|Ra6z%TNvz(tUTeiS~q=+_`0&v(EaM% za(;@`5unYZ{wEr(P3$I!2Os9qsa)UsnHwPwiv>Lrtyf(gURBQt+P0^pQ?6y(?TPb% UX#3WPn9I=n;o^2XW|2bp1zyo5#Q*>R literal 0 HcmV?d00001 diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/goal.xml b/bitbots_simulation/bitbots_mujoco_sim/xml/goal.xml new file mode 100644 index 000000000..7b38f97ee --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/xml/goal.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitbots_simulation/bitbots_mujoco_sim/xml/wolfgang.xml b/bitbots_simulation/bitbots_mujoco_sim/xml/wolfgang.xml new file mode 100644 index 000000000..357dfdeee --- /dev/null +++ b/bitbots_simulation/bitbots_mujoco_sim/xml/wolfgang.xml @@ -0,0 +1,669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +