Supported robots
URI talks to a robot through a RobotDriver plugin. Each plugin is a
standalone project in its own repository. This page lists the existing
drivers. To support a robot that is not listed, see
Create a new robot driver.
Drivers
| Driver | Robots | robot_interface.driver |
SDK / transport | Commands | Repository |
|---|---|---|---|---|---|
rtde_driver |
Universal Robots (UR3e/UR5e/UR10e/...) | RobotDriverRTDE |
ur_client_library (RTDE) | position, velocity, torque | isri-aist/rtde_driver |
kortex_driver |
Kinova Gen3, Gen3 Lite | RobotDriverKortex |
Kortex API | position, velocity, torque | isri-aist/kortex_driver |
xarm_driver |
UFACTORY xArm | RobotDriverxArm |
xArm C++ SDK | position, velocity | isri-aist/xarm_driver |
triorb_driver |
TriOrb omnidirectional mobile base | RobotDriverTriOrb |
USB serial (/dev/ttyACM0) |
position, velocity (planar) | isri-aist/triorb_driver |
ros2_control_driver |
Any robot running a ros2_control controller_manager (UR, Franka, OpenArm, Gazebo/MuJoCo sims, ...) |
RobotDriverROS2Control |
ROS 2 topics | position, velocity, torque (depends on the active controllers) | isri-aist/ros2_control_driver |
miroki_driver |
Enchanted Tools Mirokai | RobotDriverMirokai |
ROS 2 topics (enchanted_msgs) |
position, velocity, torque | isri-aist/miroki_driver (private) |
"Commands" lists the controller.mode values the driver implements (see
Robot manager). Asking for a mode the driver does not
support makes the driver throw or ignore the command.
To run a robot in simulation, see Simulation.
Messages
Every driver uses the same two messages, whatever the robot. uri interface
fills a robot_comm::State from the driver's getters each cycle. It passes
the robot_comm::Command it receives to servoJ, speedJ or tauJ,
according to controller.mode. The full definitions are in
Communication.
State field |
Filled from | Drivers that provide it |
|---|---|---|
position [rad] |
getActualQ() |
all |
velocity [rad/s] |
getActualQd() |
all |
torque [Nm] |
getJointTorques() |
all (rtde_driver reports the target torque) |
bodySensors (IMU: orientation, angular velocity, linear acceleration) |
getIMUs() |
miroki_driver |
forceSensors (F/T: force, torque, in sensor frame) |
getForceSensors() |
none yet |
Command field |
Sent to | Used when controller.mode is |
|---|---|---|
position [rad] |
servoJ() |
position |
velocity [rad/s] |
speedJ() |
velocity |
torque [Nm] |
tauJ() |
torque |
Sensor data is matched by name to the RobotModule's body sensors and force
sensors. A driver that doesn't override getIMUs() or getForceSensors()
sends empty lists.
Using a driver
Every driver is built and installed the same way. Use the same install
prefix as URI, because uri interface only looks for plugins in
<prefix>/lib/robot_interface:
cmake -S . -B build \
-DCMAKE_PREFIX_PATH=/path/to/install \
-DCMAKE_INSTALL_PREFIX=/path/to/install
cmake --build build --parallel
cmake --install build
Then point a robot entry of mc_rtc.yaml at the driver's class name:
Robots:
ur5e:
module: UR5e
robot_interface:
driver: RobotDriverRTDE
ip: 192.168.1.100
Use uri viewer -c <config> to check that the plugin loads and reports joint
state before starting uri manager.
Driver notes
rtde_driver
- Runs the UR controller in headless mode: it sends the URScript program
itself, so no URCap is needed. Set
UR_SCRIPT_FILEifexternal_control.urscriptis not found automatically. sync()blocks on each RTDE package, so the loop runs at the robot's RTDE rate (500 Hz by default).
kortex_driver
- The Kortex API is downloaded by CMake if it is not found. Pass
-DKORTEX_ROOT_DIR=/opt/kortexto use a local copy. - Uses the robot's default username and password, which are hardcoded for now.
xarm_driver
- Joint position control only (
set_mode(1), servo mode).speedJandtauJthrow.
triorb_driver
ipis the serial device, e.g./dev/ttyACM0.- State is the planar pose
[x, y, theta]. Commands are[vx, vy, wz]in velocity mode. In position mode, the driver turns the pose error into velocity commands; it does not use TriOrb's native position commands. - Resets the odometry origin at startup. Has a watchdog and sends zero velocity on shutdown.
ros2_control_driver
- A plain ROS 2 node, not a hardware plugin. It reads
/joint_statesand publishes toforward_command_controllertopics.controller_managermust already be running with the right controllers active. - Takes a YAML file through
robot_interface.config_paththat names the topics;ipandportare ignored. Supporting a new ros2_control robot only needs a new config file. - Requires a sourced ROS 2 workspace at build and run time.
miroki_driver
- Talks to Mirokai's own onboard controller through its ROS 2 bridge, one
topic pair per body part. Needs the
enchanted_msgspackage from the Mirokai SDK. - The robot must be in User Control Mode with joints enabled, otherwise commands are silently ignored.
- Takes the joint-group mapping (
etc/miroki.yaml) throughrobot_interface.config_path.
Compatibility
uri interface only loads plugins built against the current driver ABI
(ROBOT_DRIVER_ABI_VERSION in RobotDriverTemplate.h, currently 3). A
driver must use the current create() signature and call
ROBOT_DRIVER_EXPORT_ABI_VERSION(). Otherwise it is refused with
"built against an incompatible interface".
As of this writing, only rtde_driver and ros2_control_driver do this.
kortex_driver, xarm_driver and triorb_driver still use the older
create(name, ip, port) signature. miroki_driver has the new signature but
does not export the ABI version. These drivers need that update before they
load with the current uri.