Data Query
get_base_data()
get_base_data(key: str) -> list[float]
Reads base (torso) kinematic data, updated at ~100 Hz.
key value | Dimensions | Description |
|---|---|---|
'quat_xyzw' | 4 | Orientation quaternion (x, y, z, w), base → world |
'quat_wxyz' | 4 | Orientation quaternion (w, x, y, z), base → world |
'rpy' | 3 | Roll / pitch / yaw angles (rad) |
'omega_W' | 3 | Angular velocity, world frame (rad/s) |
'omega_B' | 3 | Angular velocity, body frame (rad/s) |
'acc_W' | 3 | Linear acceleration, world frame (m/s²) |
'acc_B' | 3 | Linear acceleration, body frame (m/s²) |
'vel_W' | 3 | Linear velocity, world frame (m/s) |
'vel_B' | 3 | Linear velocity, body frame (m/s) |
'pos_W' | 3 | Position, world frame (m) |
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_Bto decide whether the robot is stationary, and do not treatpos_Was a trusted position source. - To check whether a velocity command takes effect, compare the delta of
vel_Bagainst 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
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()
get_true_data(key: str) -> list[float]
Reads ground-truth data from true_data_pub.
key value | Description |
|---|---|
'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] |
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()
get_contact_data(key: str) -> list[float]
Reads contact data from contact_data_pub.
key value | Description |
|---|---|
'contact_force' | Contact force per foot (N) |
'contact_prob' | Contact probability per foot [0, 1] |
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
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()
get_cartesian_state(group_name: str, key: str = 'pose') -> list[float]
Reads the Cartesian state of a specified end-effector.
| Parameter | Type | Description |
|---|---|---|
group_name | str | Joint group name (e.g. "left_manipulator") |
key | str | State type — see table below |
key value | Description |
|---|---|
'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
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()