Skip to main content

Data Query

get_base_data()​

Python
get_base_data(key: str) -> list[float]

Reads base (torso) kinematic data, updated at ~100 Hz.

key valueDimensionsDescription
'quat_xyzw'4Orientation quaternion (x, y, z, w), base → world
'quat_wxyz'4Orientation quaternion (w, x, y, z), base → world
'rpy'3Roll / pitch / yaw angles (rad)
'omega_W'3Angular velocity, world frame (rad/s)
'omega_B'3Angular velocity, body frame (rad/s)
'acc_W'3Linear acceleration, world frame (m/s²)
'acc_B'3Linear acceleration, body frame (m/s²)
'vel_W'3Linear velocity, world frame (m/s)
'vel_B'3Linear velocity, body frame (m/s)
'pos_W'3Position, world frame (m)
Velocity and position have a resting bias

When a GR-W is standing still (states 0/1/3, no one commanding), vel_B/vel_W carry a constant bias of roughly 0.9 m/s and pos_W drifts at about 1 m/s; omega_B/rpy stay near zero as expected, and the bias disappears in the security protection state (9). Therefore:

  • Do not use the absolute value of vel_B to decide whether the robot is stationary, and do not treat pos_W as a trusted position source.
  • To check whether a velocity command takes effect, compare the delta of vel_B against its own baseline (a 0.05 m/s command produces a delta of about +0.05 m/s during the command window); rely on on-site observation for stop verification.

Example

Python
import os
import time

os.environ.setdefault("FASTDDS_BUILTIN_TRANSPORTS", "UDPv4") # required on the robot

from fourier_aurora_client import AuroraClient

client = AuroraClient.get_instance(domain_id=123, robot_name="grw")
try:
time.sleep(1.0) # wait for state data
rpy = client.get_base_data("rpy")
print(f"roll={rpy[0]:.3f}, pitch={rpy[1]:.3f}, yaw={rpy[2]:.3f}")
finally:
client.close()

get_true_data()​

Python
get_true_data(key: str) -> list[float]

Reads ground-truth data from true_data_pub.

key valueDescription
'vel_B'Linear velocity, body frame (m/s)
'vel_W'Linear velocity, world frame (m/s)
'pos_W'Position, world frame (m)
'contact_fz'Normal contact force per foot (N)
'contact_prob'Contact probability per foot [0, 1]
GR-W limitation

In the current GR-W deployment, vel_B, vel_W, and pos_W return zero vectors, and contact_fz and contact_prob return empty arrays; these fields cannot be used as real-time body or contact data on GR-W. Use get_base_data() for body pose and velocity.


get_contact_data()​

Python
get_contact_data(key: str) -> list[float]

Reads contact data from contact_data_pub.

key valueDescription
'contact_force'Contact force per foot (N)
'contact_prob'Contact probability per foot [0, 1]
GR-W limitation

GR-W has no bipedal contact semantics. In the current deployment contact_force returns 12 zero values and contact_prob returns 2 values; they must not be interpreted as foot contact, nor used for safety or motion decisions.

Example

Python
import os
import time

os.environ.setdefault("FASTDDS_BUILTIN_TRANSPORTS", "UDPv4") # required on the robot

from fourier_aurora_client import AuroraClient

client = AuroraClient.get_instance(domain_id=123, robot_name="grw")
try:
time.sleep(1.0) # wait for state data
force = client.get_contact_data("contact_force")
prob = client.get_contact_data("contact_prob")
print(f"contact force: {force}, prob: {prob}")
finally:
client.close()

get_cartesian_state()​

Python
get_cartesian_state(group_name: str, key: str = 'pose') -> list[float]

Reads the Cartesian state of a specified end-effector.

ParameterTypeDescription
group_namestrJoint group name (e.g. "left_manipulator")
keystrState type — see table below
key valueDescription
'pose'End-effector pose (position + quaternion), default
'twist'End-effector velocity (linear + angular)
'wrench'End-effector force / torque

Both arms publish pose (7 elements) and twist (6 elements) on the current GR-W; wrench currently returns an empty array. Check the returned length before use and do not assume force/torque data is provided.

Example

Python
import os
import time

os.environ.setdefault("FASTDDS_BUILTIN_TRANSPORTS", "UDPv4") # required on the robot

from fourier_aurora_client import AuroraClient

client = AuroraClient.get_instance(domain_id=123, robot_name="grw")
try:
time.sleep(1.0) # wait for state data
pose = client.get_cartesian_state("left_manipulator", key="pose")
print(f"left end-effector pose: {pose}")
finally:
client.close()