Mobile base does not move with set_speed commands

Hi Pollen Robotics team,

I am using the MobileBaseSDK (version 0.1.1) to send commands to move the Reachy 2023 mobile base, and while the goto and goto_async functions work fine, the set_speed command does not seem to do anything. In the reachy_mobile_base server logs, nothing appears when set_speed is called while goto and goto_async both are shown in the logs like:

Dec 08 19:11:15 reachy-2023-0001 reachy_mobile_base[35535]: [hal-2] [INFO] [1765242675.421698022] [zuuu_hal]: Requested to reset the odometry frame
Dec 08 19:11:15 reachy-2023-0001 reachy_mobile_base[35535]: [hal-2] [INFO] [1765242675.480647884] [zuuu_hal]: Requested go_to: x=0.0m, y=0.0m, theta=1.5707963705062866rad
Dec 08 19:11:17 reachy-2023-0001 reachy_mobile_base[35535]: [hal-2] [INFO] [1765242677.848651654] [zuuu_hal]: Requested go_to: x=0.0m, y=0.0m, theta=0.0rad

This is the test command I’m using with set_speed:

import time
start = time.time()
reachy.mobile_base.reset_odometry()
print(reachy.mobile_base.odometry)
while (time.time() - start) < 1.0:
    print(f"send vel commands")
    reachy.mobile_base.set_speed(0.3, 0.0, 0)
    time.sleep(0.01)
print(f"end")

When I run the above test command, Reachy’s base does not move unfortunately. I was wondering if there might be any suggestions on what to investigate for the set_speed commands?

Thank you very much!

Also one extra question, I was wondering when Lidar safety is turned on, what is the safety distance for Lidar? Sometimes when I run goto_async commands, the mobile base SDK will not execute the command if the lidar safety is turned on, but I would like for Reachy to be able to move to a table. Thank you!

Hi @jyau ,

Does the mobile base move when you try to use goto commands instead of set_speed?

set_speed only send a command for 200ms, so maybe you’re not sending enough commands for the mobile base to move.

About the lidar safety, there are two distances that you need to be aware of: the slowdown distance where the mobile base speed will be reduced and the critical distance where the mobile base speed will be null if you try to move forward. By default the slowdown distance is 0.7m and the critical distance is 0.55m. The distance are measured from the center of the mobile base. More details here.

The safety lidar can be turned on / off with the sdk and both slowdown and critical distances can be modified with the sdk as well.

reachy.mobile_base.safety_enabled = False  # will turn off the lidar safety
reachy.mobile_base.safety_critical_distance = 0.4  # will reduce the critical distance
reachy.mobile_base.reset_safety_default_values()  # will reset the slowdown and critical ditances to default values

The code for the lidar safety management is available here if you want to take a look.

Hi Simon,

Thank you for the responses! For the first question, yes the goto commands do work!

I tried to send speed commands over 3 seconds this time (I also turned off lidar safety for now), but still not seeing any “requested” logs in the reachy_mobile_base service logs and the mobile base does not move unfortunately:

import time
start = time.time()
reachy.mobile_base.reset_odometry()
print(reachy.mobile_base.odometry)
while (time.time() - start) < 3.0:
print(f"send vel commands")
reachy.mobile_base.set_speed(0.3, 0.0, 0)
time.sleep(0.01)
print(f"end")

For the lidar part, I think the version of the MobileBaseSDK I’m using, v0.1.1, does not have the lidar features. From my understanding, the MobileBaseSDK for versions 1.0.0 and above are for Reachy 2 so I did not update the MobileBaseSDK past version 0.1.1, is that correct? These are the attributes in the mobile base I can see:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_control_mode', '_distance_to_goto_goal', '_drive_mode', '_grpc_channel', '_host', '_logger', '_max_rot_vel', '_max_xy_goto', '_max_xy_vel', '_mobile_nase_port', '_presence_stub', '_set_safety', '_stub', 'battery_voltage', 'control_mode', 'drive_mode', 'emergency_shutdown', 'goto', 'goto_async', 'model_version', 'odometry', 'reset_odometry', 'set_speed']

For now I turned lidar off to send goto commands that can move reachy’s mobile base close to a table, otherwise I found the zuuu_hal/config/params.yaml that contains the lidar critical and slowdown distance, would it work to modify the parameters there?

zuuu_hal:
  ros__parameters:
    laser_upper_angle: 2.85 # 2.5 is a low value tunned for Remi's robot, on a normal Reachy mobile this can be higher
    laser_lower_angle: -2.85 # is often -laser_upper_angle
    max_duty_cyle: 0.20 # max is 1.0
    cmd_vel_timeout: 0.2
    max_full_com_fails: 100
    main_tick_period: 0.012
    control_mode: "OPEN_LOOP"
    max_accel_xy: 1.0
    max_accel_theta: 1.0
    xy_tol: 0.0
    theta_tol: 0.0
    smoothing_factor: 5.0
    safety_distance: 0.70 # distance from the center of the robot
    critical_distance: 0.55 # distance from the center of the robot

Thank you!

Hi @jyau ,

The MobileBaseSDK if dedicated to the mobile base for Reachy 1 so you can ugrade it! Could you try to upgrade it to 1.0.2 and check again the set_speed commands? From what I remember there was a bug in the set_speed command with the 0.0.1 version.

Changing the critical and safety distances from the sdk from the yaml file that you pointed will work but I would recommend using the sdk client, it should be possible with the 1.0.2 version!

Hi Simon,

Got it, thank you! I’ll try upgrading to 1.0.2 for the MobileBaseSDK again! Previously when I had tried using MobileBaseSDK 1.0.2, there was an issue with the port, I think the reachy_mobile_server is listening to port 50061 but in MobileBaseSDK version 1.0.2, it seems the port had changed to 50051? Is there somewhere the reachy_mobile_server port can be changed?

Thank you!

Indeed, the MobileBaseSDK seems to be listening to port 50051, I can’t remember why we did that…

You change the port here if needed.

Good luck!

1 Like

Hi Simon,

Sorry for another question, I was wondering when updating the MobileBaseSDK to 1.0.2, do I also need to update and rebuild the reachy-ws so the reachy_mobile_base.service also updates?

I have updated the mobile-base-sdk to 1.0.2 on my laptop and changed the port but I get this error:

>>> from mobile_base_sdk import MobileBaseSDK

>>> mobile_base = MobileBaseSDK('10.192.8.157', mobile_base_port=50061)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/home/jhyau2/.venv/lib/python3.10/site-packages/mobile_base_sdk/mobile_base_sdk.py", line 52, in __init__

    self._drive_mode = self._get_drive_mode().lower()

  File "/home/jhyau2/.venv/lib/python3.10/site-packages/mobile_base_sdk/mobile_base_sdk.py", line 76, in _get_drive_mode

    mode_id = self._utility_stub.GetZuuuMode(Empty()).mode

  File "/home/jhyau2/.venv/lib/python3.10/site-packages/grpc/_channel.py", line 1176, in __call__

    return _end_unary_response_blocking(state, call, False, None)

  File "/home/jhyau2/.venv/lib/python3.10/site-packages/grpc/_channel.py", line 1005, in _end_unary_response_blocking

    raise _InactiveRpcError(state)  # pytype: disable=not-instantiable

grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:

status = StatusCode.UNIMPLEMENTED

details = "Method not found!"

debug_error_string = "UNKNOWN:Error received from peer  {created_time:"2025-12-17T18:46:24.440726553-06:00", grpc_status:12, grpc_message:"Method not found!"}"

Currently I’m updating the mobile-base-sdk on Reachy’s computer to 1.0.2, then I was not sure if I would also need to update the workspace reachy-ws? This is the output for systemctl --user status reachy_mobile_base.service:

reachy@reachy-2023-0001:~/dev$ systemctl --user status reachy_mobile_base.service
â—Ź reachy_mobile_base.service - Mobile base SDK server service
     Loaded: loaded (/home/reachy/.config/systemd/user/reachy_mobile_base.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-12-17 18:15:39 CST; 1h 32min ago
    Process: 1655 ExecStartPre=/bin/sleep 10 (code=exited, status=0/SUCCESS)
   Main PID: 1982 (bash)
      Tasks: 60 (limit: 9054)
     Memory: 179.3M
        CPU: 29min 79ms
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/reachy_mobile_base.service
             ├─1982 /usr/bin/bash /home/reachy/reachy_ws/src/reachy_2023/mobile_base_controller/mobile_base_sdk_server/launch_mobile_base.bash
             ├─2047 /usr/bin/python3 /opt/ros/humble/bin/ros2 launch mobile_base_sdk_server run_mobile_base_sdk_server_and_hal.launch.py
             ├─2048 /home/reachy/reachy_ws/install/rplidar_ros2/lib/rplidar_ros2/rplidar_scan_publisher --ros-args -r __node:=rplidar_scan_publisher --params-file /tmp/launch_params_9j61v7b0
             ├─2050 /usr/bin/python3 /home/reachy/reachy_ws/install/zuuu_hal/lib/zuuu_hal/hal --ros-args -r __node:=zuuu_hal --params-file /home/reachy/reachy_ws/install/zuuu_hal/share/zuuu_hal/config/params.yaml
             ├─2052 /usr/bin/python3 /home/reachy/reachy_ws/install/mobile_base_sdk_server/lib/mobile_base_sdk_server/mobile_base_sdk_server --ros-args
             └─9293 /usr/bin/python3 -c "from ros2cli.daemon.daemonize import main; main()" --name ros2-daemon --ros-domain-id 0 --rmw-implementation rmw_cyclonedds_cpp

Thank you very much!