Quick Start Example

Sending actions to and getting observations from the robot is very easy. See the following example, using the TriFinger robot, that simply sends a constant position command.

Note

This example shows only the frontend part of a multi-process setup. The backend for the actual robot needs to be run in a separate process.

Python

import robot_interfaces

robot_data = robot_interfaces.trifinger.MultiProcessData(
    "trifinger", False)
frontend = robot_interfaces.trifinger.Frontend(robot_data)

position = [
     0.0,  # Finger 1, Upper Joint
    -0.9,  # Finger 1, Middle Joint
    -1.7,  # Finger 1, Lower Joint
     0.0,  # Finger 2, Upper Joint
    -0.9,  # Finger 2, Middle Joint
    -1.7,  # Finger 2, Lower Joint
     0.0,  # Finger 3, Upper Joint
    -0.9,  # Finger 3, Middle Joint
    -1.7,  # Finger 3, Lower Joint
]

while True:
    # construct an action with a position command
    action = robot_interfaces.trifinger.Action(position=position)
    # send the action to the robot (will be applied in time step t)
    t = frontend.append_desired_action(action)
    # wait until time step t and get observation
    observation = frontend.get_observation(t)

    print("Observed Position: {}".format(observation.position))

C++

#include <robot_interfaces/finger_types.hpp>

// Some convenience typedefs to make the code below more compact
typedef robot_interfaces::TriFingerTypes::MultiProcessData RobotData;
typedef robot_interfaces::TriFingerTypes::Frontend RobotFrontend;
typedef robot_interfaces::TriFingerTypes::Action Action;

int main()
{
    auto robot_data = std::make_shared<RobotData>("trifinger", false);
    auto frontend = RobotFrontend(robot_data);

    Action::Vector position;  // <- this is an "Eigen::Vector9d"
    position <<  0.0,  // Finger 1, Upper Joint
                -0.9,  // Finger 1, Middle Joint
                -1.7,  // Finger 1, Lower Joint
                 0.0,  // Finger 2, Upper Joint
                -0.9,  // Finger 2, Middle Joint
                -1.7,  // Finger 2, Lower Joint
                 0.0,  // Finger 3, Upper Joint
                -0.9,  // Finger 3, Middle Joint
                -1.7;  // Finger 3, Lower Joint

    while (true)
    {
        // construct an action with a position command
        Action action = Action::Position(position);
        // send the action to the robot (will be applied in time step t)
        auto t = frontend.append_desired_action(action);
        // wait until time step t and get observation
        auto observation = frontend.get_observation(t);

        std::cout << "Observed Position: "
                  << observation.position
                  << std::endl;
    }

    return 0;
}

When using C++ you need to add the package robot_interfaces as build dependency to your package.

More Examples

For more examples, see the C++ demos of the robot_interfaces package and the Python demos in the robot_fingers package.