Skip to content

API Reference#

fourier_grx_client.client.RobotClient #

Bases: ZenohSession

Client class for GR series robots. Example:

1
2
>>> from fourier_grx_client import RobotClient
>>> r = RobotClient(namespace="gr/my_awesome_robot", server_ip="192.168.6.6")

base_pose property #

Get the current base pose.

base_velocity property #

Get the current base velocity.

imu_angles property #

Get the current IMU orientation as Euler angles.

imu_angular_velocity property #

Get the current IMU angular velocity.

imu_linear_acceleration property #

Get the current IMU linear acceleration.

imu_quaternion property #

Get the current IMU orientation as a quaternion.

is_moving property writable #

Whether the robot is currently moving.

joint_currents property #

Get the current joint currents of the robot.

joint_efforts property #

Get the current joint efforts of the robot.

joint_positions property #

Get the current joint positions of the robot. The joint positions are in radians.

joint_velocities property #

Get the current joint velocities of the robot. The joint velocities are in radians per second.

__init__(freq=400, namespace=None, server_ip='localhost', verbose=False) #

The client class for GR series robots.

Parameters:

Name Type Description Default
server_ip str

IP address of the grx server. Please make sure to properly setup the firewall to allow port 7447. Defaults to "localhost".

'localhost'
freq int

Robot state update frequency. Usually the user doesn't need to modify this. Defaults to 400.

400
namespace str

Robot namespace. If not provided, it will try to use the robot_id provided in the environment variable GRX_ROBOT_ID. If the environment variable is not set, it will try to load the robot_id from the file ~/.fourier/robot_id.yaml. If the file does not exist, it will fall back to the default namespace gr. Defaults to None.

None

Raises:

Type Description
FourierConnectionError

If the connection to the server failed.

calibrate_sensors() #

Get sensor offsets and save to sensor_offset.json

control_joints(control_type, commands, degrees=False) #

Control the joints in a group with the specified control type.

Parameters:

Name Type Description Default
control_type Literal['position', 'velocity', 'current']

The control type to set.

required
commands ndarray | list

The control commands to set.

required
degrees bool

Whether the joint positions and velocities are in degrees. Defaults to False.

False

disable() #

Disable the motors.

enable() #

Enable the motors.

forward_kinematics(chain_names, q=None) #

Get the end effector pose of the specified chains in base_link frame.

Info

The available chain names are: head, left_arm, right_arm, with corresponding end effector frames: head_yaw_link, left_end_effector_link, right_end_effector_link, and the transformation matrices are in the base_link frame.

Parameters:

Name Type Description Default
chain_names list[str]

The chains to get the end effector pose of. Available chain names: 'head', 'left_arm', 'right_arm'.

required
q ndarray

The robot confiuration to do forward kinematics in. Defaults to None.

None

Returns:

Name Type Description
list list[ndarray]

The end effector pose is a list of 4x4 transformation matrices. The order of the matrices is the same as the order of the chain names. The transformation matrix is in the base_link frame.

get_control_modes() #

Get the control modes for all joints.

get_gains() #

Get the control gains for all joints.

get_group_current(group) #

Get the joint currents of a group.

get_group_effort(group) #

Get the joint efforts of a group.

get_group_position(group) #

Get the joint positions of a group.

get_group_position_by_name(name) #

Get the joint positions of a group by its name.

Parameters:

Name Type Description Default
name str

The name of the group. Available group names: 'left_leg', 'right_leg', 'waist', 'head', 'left_arm', 'right_arm'.

required

get_group_velocity(group) #

Get the joint velocities of a group.

get_transform(target_frame, source_frame, q=None) #

Get the transformation matrix between two frames in configuration q. If q is None, the current joint positions are used.

Parameters:

Name Type Description Default
target_frame str

Name of the frame to get the pose of.

required
source_frame str

Name of the frame to get the pose in.

required
q ndarray

The robot confiuration to do forward kinematics in. Defaults to None.

None

Returns:

Type Description

np.ndarray: The transformation matrix.

inverse_kinematics(chain_names, targets, move=False, dt=0.005, velocity_scaling_factor=1.0, convergence_threshold=1e-08) #

Get the joint positions for the specified chains to reach the target pose in base_link frame.

Parameters:

Name Type Description Default
chain_names list[str]

The chains to get the joint positions for. Available chain names: 'head', 'left_arm', 'right_arm'.

required
targets list[ndarray]

The target poses in base_link frame.

required
move bool

Whether to move the robot to the target pose. Defaults to False.

False
dt float

The time step for the inverse kinematics.

0.005

Returns:

Type Description
ndarray

np.ndarray: The joint positions to reach the target pose (in radians).

list_frames() #

List all available frames.

liveness_check(timeout=1.0) #

Check if the robot server is alive.

Parameters:

Name Type Description Default
timeout float

Timeout in seconds. Defaults to 1.0.

1.0

Raises:

Type Description
FourierConnectionError

If the connection to the server failed.

move_joints(group, positions, duration=0.0, degrees=False, blocking=True, gravity_compensation=False) #

Move in joint space with time duration.

Move in joint space with time duration in a separate thread. Can be aborted using abort(). Can be blocking. If the duration is set to 0, the joints will move in their maximum speed without interpolation.

GR1T2 Joint Order

The joints order is as follows: 0: left_hip_roll_joint 1: left_hip_yaw_joint 2: left_hip_pitch_joint 3: left_knee_pitch_joint 4: left_ankle_pitch_joint 5: left_ankle_roll_joint 6: right_hip_roll_joint 7: right_hip_yaw_joint 8: right_hip_pitch_joint 9: right_knee_pitch_joint 10: right_ankle_pitch_joint 11: right_ankle_roll_joint 12: waist_yaw_joint 13: waist_pitch_joint 14: waist_roll_joint 15: head_pitch_joint 16: head_roll_joint 17: head_yaw_joint 18: left_shoulder_pitch_joint 19: left_shoulder_roll_joint 20: left_shoulder_yaw_joint 21: left_elbow_pitch_joint 22: left_wrist_yaw_joint 23: left_wrist_roll_joint 24: left_wrist_pitch_joint 25: right_shoulder_pitch_joint 26: right_shoulder_roll_joint 27: right_shoulder_yaw_joint 28: right_elbow_pitch_joint 29: right_wrist_yaw_joint 30: right_wrist_roll_joint 31: right_wrist_pitch_joint

Example:

1
2
3
4
5
6
7
8
>>> # Move the left arm to a specific position
>>> r.move_joints("left_arm", [0, 0, 0, 20, 0, 0, 0], degrees=True)

>>> # or use the ControlGroup enum
>>> r.move_joints(ControlGroup.LEFT_ARM, [0, 0, 0, 20, 0, 0, 0], degrees=True)

>>> # or use indices, with radians instead of degrees
>>> r.move_joints([23, 24], [0.17, 0.17], degrees=False)

Parameters:

Name Type Description Default
group ControlGroup | list | str

The group of joints to move, specified by a string or a ControlGroup enum, or a list of joint indices.

required
positions ndarray[float]

target joint position in degrees.

required
duration float

Time duration in seconds. If set to 0, the joints will move in their maximum speed without interpolation. Defaults to 0.0.

0.0
degrees bool

Whether the joint positions are in degrees. Defaults to False.

False
blocking bool

If True, block until the move is completed. Defaults to True.

True
gravity_compensation bool

Whether to enable gravity compensation. Defaults to False.

False

movej(sides, target_positions, target_velocity=None, target_acceleration=None, max_velocity=None, max_acceleration=None, max_jerk=None, degrees=False, move=True) #

move the joints of the arms to the target position.

Parameters:

Name Type Description Default
sides list[Literal['left', 'right']]

Sides of the arms to move. Can be "left" or "right".

required
target_positions list[ndarray | list]

Desired joint positions.

required
target_velocity list[ndarray | list] | None

Desired joint velocities. Defaults to None. If None, the robot will estimate the velocity based on the target position.

None
target_acceleration list[ndarray | list] | None

Desired accelerations. Defaults to None.

None
max_velocity list[ndarray | list] | None

Max velocity during trajectory generation. Defaults to None. If None, the robot will use the default max velocity at 5 rad/s.

None
max_acceleration list[ndarray | list] | None

Max acceleration during trajectory generation. Defaults to None. If None, the robot will use the default max acceleration at 10 rad/s^2.

None
max_jerk list[ndarray | list] | None

Max jerk during trajectory generation. Defaults to None. If None, the robot will use the default max jerk at 50 rad/s^3.

None
degrees bool

True if the input is in degrees. Defaults to False.

False
move bool

Whether to execute the trajectory. Defaults to True.

True

Returns:

Name Type Description
list list[list[ndarray]]

The trajectory of joint positions and velocities for controlled arms to reach the target pose.

movel(sides, target_poses, max_velocity=None, max_acceleration=None, max_jerk=None, move=True) #

Move the specified arm to the target position.

Parameters:

Name Type Description Default
sides list[Literal['left', 'right']]

Sides of the arms to move. Can be "left" or "right".

required
target_poses list[ndarray]

Desired end effector poses.

required
max_velocity float | None

Max velocity during trajectory generation. Defaults to None.

None
max_acceleration float | None

Max acceleration during trajectory generation. Defaults to None.

None
max_jerk float | None

Max jerk during trajectory generation. Defaults to None.

None
move bool

Whether to execute the trajectory. Defaults to True.

True
Return

list: The trajectory to reach the target pose.

play_traj(group, traj, timestamps=None, dt=0.005) #

Play a trajectory in joint space.

reboot() #

Reboot the motors.

set_control_modes(control_mode=None) #

Set the control modes for all joints.

Parameters:

Name Type Description Default
control_mode ControlMode | list[ControlMode] | None

ControlMode can be PD, VELOCITY, CURRENT. Defaults to None.

None

set_enable(enable) #

Enable or disable the motors.

fourier_grx_client.utils.ControlGroup #

Bases: tuple, Enum

Control group enumeration. Each group is a tuple of (start, num_joints). Available groups are: ALL, LEFT_LEG, RIGHT_LEG, WAIST, HEAD, LEFT_ARM, RIGHT_ARM, LOWER, UPPER, UPPER_EXTENDED.

Source code in src/fourier_grx_client/utils.py
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class ControlGroup(tuple, Enum):
    """Control group enumeration. Each group is a tuple of (start, num_joints). Available groups are: ALL, LEFT_LEG, RIGHT_LEG, WAIST, HEAD, LEFT_ARM, RIGHT_ARM, LOWER, UPPER, UPPER_EXTENDED."""

    ALL = (0, 32)
    LEFT_LEG = (0, 6)
    RIGHT_LEG = (6, 6)
    WAIST = (12, 3)
    HEAD = (15, 3)
    LEFT_ARM = (18, 7)
    RIGHT_ARM = (25, 7)
    LOWER = (0, 18)
    UPPER = (18, 14)
    UPPER_EXTENDED = (12, 20)

    @property
    def slice(self):
        return slice(self.value[0], self.value[0] + self.value[1])

    @property
    def num_joints(self):
        return self.value[1]

    @classmethod
    def from_string(cls, s: str):
        return getattr(cls, s.upper())

fourier_grx_client.utils.ControlMode #

Bases: IntEnum

Control mode enumeration.

Source code in src/fourier_grx_client/utils.py
35
36
37
38
39
40
41
42
43
44
class ControlMode(IntEnum):
    """Control mode enumeration."""

    NONE = 0x00
    CURRENT = 0x01
    EFFORT = 0x02
    VELOCITY = 0x03
    POSITION = 0x04
    PD = 0x09
    OTHER = 0x0A