fix(lekiwi): HW fixes v0.2

This commit is contained in:
Steven Palma 2025-03-17 17:38:08 +01:00
parent 5130cba57a
commit e254a96bfb
No known key found for this signature in database
3 changed files with 20 additions and 14 deletions

View File

@ -108,6 +108,8 @@ class DaemonLeKiwiRobot(Robot):
pass
def connect(self) -> None:
"""Establishes ZMQ sockets with the remote mobile robot"""
if self.is_connected:
raise DeviceAlreadyConnectedError(
"LeKiwi Daemon is already connected. Do not run `robot.connect()` twice."
@ -340,7 +342,7 @@ class DaemonLeKiwiRobot(Robot):
"""
Capture observations from the remote robot: current follower arm positions,
present wheel speeds (converted to body-frame velocities: x, y, theta),
and a camera frame.
and a camera frame. Receives over ZMQ, translate to body-frame vel
"""
if not self.is_connected:
raise DeviceNotConnectedError(
@ -409,7 +411,7 @@ class DaemonLeKiwiRobot(Robot):
# t3': execute motor_cmd
# t3'-t2' << t3-t1
def send_action(self, action: np.ndarray) -> np.ndarray:
"""Command lekiwi to move to a target joint configuration.
"""Command lekiwi to move to a target joint configuration. Translates to motor space + sends over ZMQ
Args:
action (np.ndarray): array containing the goal positions for the motors.
@ -425,7 +427,7 @@ class DaemonLeKiwiRobot(Robot):
"ManipulatorRobot is not connected. You need to run `robot.connect()`."
)
goal_pos: np.array = np.empty(9)
goal_pos: np.array = np.zeros(9)
if self.robot_mode is RobotMode.AUTO:
# TODO(Steven): Not yet implemented. The policy outputs might need a different conversion
@ -437,11 +439,13 @@ class DaemonLeKiwiRobot(Robot):
logging.error("Action should include at least the 6 states of the leader arm")
raise InvalidActionError
# TODO(Steven): Assumes size and order is respected
wheel_actions = [v for _, v in self.from_keyboard_to_wheel_action(action[6:])]
goal_pos[:6] = action[:6]
if action.size > 6:
# TODO(Steven): Assumes size and order is respected
wheel_actions = [v for _, v in self.from_keyboard_to_wheel_action(action[6:]).items()]
goal_pos[6:] = wheel_actions
self.zmq_cmd_socket.send_string(json.dumps(goal_pos)) # action is in motor space
self.zmq_cmd_socket.send_string(json.dumps(goal_pos.tolist())) # action is in motor space
return goal_pos
@ -450,6 +454,8 @@ class DaemonLeKiwiRobot(Robot):
pass
def disconnect(self):
"""Cleans ZMQ comms"""
if not self.is_connected:
raise DeviceNotConnectedError(
"LeKiwi is not connected. You need to run `robot.connect()` before disconnecting."

View File

@ -11,7 +11,7 @@ from lerobot.common.teleoperators.so100 import SO100Teleop, SO100TeleopConfig
def main():
logging.info("Configuring Teleop Devices")
leader_arm_config = SO100TeleopConfig(port="/dev/tty.usbmodem585A0085511")
leader_arm_config = SO100TeleopConfig(port="/dev/tty.usbmodem58760429271")
leader_arm = SO100Teleop(leader_arm_config)
keyboard_config = KeyboardTeleopConfig()
@ -26,7 +26,7 @@ def main():
robot = DaemonLeKiwiRobot(robot_config)
logging.info("Connecting remote LeKiwiRobot")
robot.connect() # Establishes ZMQ sockets with the remote mobile robot
robot.connect()
robot.robot_mode = RobotMode.TELEOP
logging.info("Starting LeKiwiRobot teleoperation")
@ -35,9 +35,9 @@ def main():
while duration < 20:
arm_action = leader_arm.get_action()
base_action = keyboard.get_action()
action = np.concatenate((arm_action, base_action))
_action_sent = robot.send_action(action) # Translates to motor space + sends over ZMQ
_observation = robot.get_observation() # Receives over ZMQ, translate to body-frame vel
action = np.append(arm_action, base_action) if base_action.size > 0 else arm_action
_action_sent = robot.send_action(action)
_observation = robot.get_observation()
# dataset.save(action_sent, obs)
@ -48,7 +48,7 @@ def main():
duration = time.perf_counter() - start
logging.info("Disconnecting Teleop Devices and LeKiwiRobot Daemon")
robot.disconnect() # Cleans ZMQ comms
robot.disconnect()
leader_arm.disconnect()
keyboard.disconnect()

View File

@ -304,7 +304,7 @@ class LeKiwiRobot(Robot):
try:
msg = self.zmq_cmd_socket.recv_string(zmq.NOBLOCK)
data = json.loads(msg)
data = np.array(json.loads(msg))
self.send_action(data)
last_cmd_time = time.time()
except zmq.Again: