Hi! I’m having trouble using the /navigate_to action.
Before sending the goal, I clear the graph, upload the map, and set the localization method using the corresponding services. All of these steps complete without any errors. I also acquire the lease beforehand, and by checking the /status/leases topic I can confirm that my node has the lease for all resources (including body).
However, every time I send a /navigate_to goal, the action fails with a lease error saying that the body lease is owned by someone else:
[spot_ros2-1] [ERROR] [1770292318.048565582] [spot_ros2]: Error raised in execute callback: Lease on "body" has state (Status.OTHER_OWNER) [spot_ros2-1] Traceback (most recent call last): [spot_ros2-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/action/server.py", line 336, in _execute_goal [spot_ros2-1] execute_result = await await_or_execute(execute_callback, goal_handle) [spot_ros2-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 107, in await_or_execute [spot_ros2-1] return callback(*args) [spot_ros2-1] File "/home/chiara/ros2_ws/install/spot_driver/lib/spot_driver/spot_ros2", line 3017, in handle_navigate_to [spot_ros2-1] resp = self.spot_wrapper.spot_graph_nav._navigate_to( [spot_ros2-1] File "/home/chiara/ros2_ws/build/spot_wrapper/spot_wrapper/wrapper_helpers.py", line 55, in wrapper_try_claim [spot_ros2-1] return func(*args, **kwargs) [spot_ros2-1] File "/home/chiara/ros2_ws/build/spot_wrapper/spot_wrapper/spot_graph_nav.py", line 517, in _navigate_to [spot_ros2-1] self._lease = self._lease_wallet.advance() [spot_ros2-1] File "/usr/local/lib/python3.10/dist-packages/bosdyn/client/lease.py", line 421, in advance [spot_ros2-1] lease_state = self._get_owned_lease_state_locked(resource) [spot_ros2-1] File "/usr/local/lib/python3.10/dist-packages/bosdyn/client/lease.py", line 483, in _get_owned_lease_state_locked [spot_ros2-1] raise LeaseNotOwnedByWallet(resource, lease_state) [spot_ros2-1] bosdyn.client.lease.LeaseNotOwnedByWallet: Lease on "body" has state (Status.OTHER_OWNER) [spot_ros2-1] [WARN] [1770292318.049514152] [spot_ros2]: Goal state not set, assuming aborted. Goal ID: [ 70 20 32 40 242 3 67 19 181 210 228 59 27 177 238 184] [spot_ros2-1] [ERROR] [1770292348.392360039] [spot_ros2]: Error raised in execute callback: bosdyn.api.graph_nav.NavigateToResponse (RobotImpairedError): Robot has a critical perception or behavior fault and cannot navigate.
What confuses me is that /status/leases shows that I do own the leases, yet the navigation code fails when it tries to advance the lease (it looks like lease_wallet.advance() raises because the wallet thinks it doesn’t own the body lease).
The only workaround I’ve found is to explicitly release the claim before sending the goal, and then re-acquire it after the goal finishes (success or failure). This “works”, but it’s quite inconvenient and creates problems in my workflow.
Am I missing something in the correct lease workflow for /navigate_to? Is there a recommended way to avoid this Status.OTHER_OWNER error, or to properly synchronize the lease used by GraphNav with the one reported on /status/leases?
Hi! I’m having trouble using the
/navigate_to action.Before sending the goal, I clear the graph, upload the map, and set the localization method using the corresponding services. All of these steps complete without any errors. I also acquire the lease beforehand, and by checking the
/status/leasestopic I can confirm that my node has the lease for all resources (including body).However, every time I send a
/navigate_to goal, the action fails with a lease error saying that the body lease is owned by someone else:[spot_ros2-1] [ERROR] [1770292318.048565582] [spot_ros2]: Error raised in execute callback: Lease on "body" has state (Status.OTHER_OWNER) [spot_ros2-1] Traceback (most recent call last): [spot_ros2-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/action/server.py", line 336, in _execute_goal [spot_ros2-1] execute_result = await await_or_execute(execute_callback, goal_handle) [spot_ros2-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 107, in await_or_execute [spot_ros2-1] return callback(*args) [spot_ros2-1] File "/home/chiara/ros2_ws/install/spot_driver/lib/spot_driver/spot_ros2", line 3017, in handle_navigate_to [spot_ros2-1] resp = self.spot_wrapper.spot_graph_nav._navigate_to( [spot_ros2-1] File "/home/chiara/ros2_ws/build/spot_wrapper/spot_wrapper/wrapper_helpers.py", line 55, in wrapper_try_claim [spot_ros2-1] return func(*args, **kwargs) [spot_ros2-1] File "/home/chiara/ros2_ws/build/spot_wrapper/spot_wrapper/spot_graph_nav.py", line 517, in _navigate_to [spot_ros2-1] self._lease = self._lease_wallet.advance() [spot_ros2-1] File "/usr/local/lib/python3.10/dist-packages/bosdyn/client/lease.py", line 421, in advance [spot_ros2-1] lease_state = self._get_owned_lease_state_locked(resource) [spot_ros2-1] File "/usr/local/lib/python3.10/dist-packages/bosdyn/client/lease.py", line 483, in _get_owned_lease_state_locked [spot_ros2-1] raise LeaseNotOwnedByWallet(resource, lease_state) [spot_ros2-1] bosdyn.client.lease.LeaseNotOwnedByWallet: Lease on "body" has state (Status.OTHER_OWNER) [spot_ros2-1] [WARN] [1770292318.049514152] [spot_ros2]: Goal state not set, assuming aborted. Goal ID: [ 70 20 32 40 242 3 67 19 181 210 228 59 27 177 238 184] [spot_ros2-1] [ERROR] [1770292348.392360039] [spot_ros2]: Error raised in execute callback: bosdyn.api.graph_nav.NavigateToResponse (RobotImpairedError): Robot has a critical perception or behavior fault and cannot navigate.What confuses me is that
/status/leasesshows that I do own the leases, yet the navigation code fails when it tries to advance the lease (it looks likelease_wallet.advance()raises because the wallet thinks it doesn’t own thebodylease).The only workaround I’ve found is to explicitly release the claim before sending the goal, and then re-acquire it after the goal finishes (success or failure). This “works”, but it’s quite inconvenient and creates problems in my workflow.
Am I missing something in the correct lease workflow for
/navigate_to? Is there a recommended way to avoid thisStatus.OTHER_OWNERerror, or to properly synchronize the lease used by GraphNav with the one reported on/status/leases?