Quickstart

Table of contents

Build Instructions

Supported Operating Systems

  • Linux (x86-64) - tested on Red Hat Enterprise Linux (RHEL) 9. Other distributions may work but have not been tested

Dependencies

  • EPICS Base
  • asyn
  • Boost
  • A C++17-capable C++ compiler (GCC 5+)

This library has been tested with synApps 6-2-1 (EPICS base 7.0.4.1, asyn R4-42), and synApps 6-3 (EPICS Base 7.0.8, asyn R4-44-2). Other versions may work but have not been sufficiently tested.

The ur_rtde and spdlog libraries are included as git submodules and built automatically.

Build

  1. Clone the repository with submodules:
    git clone --recursive https://github.com/epics-modules/urRobot
    

    Or if already cloned without submodules:

    git submodule update --init --recursive
    
  2. Edit configure/RELEASE to correct the paths to EPICS_BASE and ASYN
  3. make

Adding urRobot support to an IOC

See iocs/urExample for a complete example

IOC Dependencies

IOCs using urRobot depend on these additional EPICS modules for full functionality:

  • asyn
  • calc
  • lua (optional) for waypoints/paths
  • std (optional) for waypoints/paths
  • busy (optional) for waypoints/paths
  • motor (optional) for soft motor support
  • areaDetector/ADURL (optional) for Robotiq wrist camera support

1. Add the path to the urRobot support in configure/RELEASE

# file: configure/RELEASE
URROBOT=/path/to/urRobot

2. Add rules in xxxApp/src/Makefile

# file: xxxApp/src/Makefile
ifdef URROBOT
  $(DBD_NAME)_DBD += urRobotSupport.dbd
  $(PROD_NAME)_LIBS := urRobot $($(PROD_NAME)_LIBS)
endif

3. In your startup script, load the example script making sure to fill in the correct IP address for your robot.

# file: iocBoot/iocxxx/st.cmd.Linux
iocshLoad("$(URROBOT)/urRobotApp/iocsh/urRobot.iocsh", "PREFIX=$(PREFIX), IP=127.0.0.1")

4. If you would like to add support for waypoints and paths, load paths.iocsh. Note the additional dependencies for waypoint and path functionality (lua, std, busy).

# file: iocBoot/iocxxx/st.cmd.Linux
iocshLoad("$(URROBOT)/urRobotApp/iocsh/paths.iocsh", "PREFIX=$(PREFIX)")

The number of waypoints, actions, and paths loaded can be controlled with optional macros: N_WP (default 30), N_ACTIONS (default 10), N_PATH (default 10), N_PATH_WP (default 30).

For advanced use, you can copy urRobot.iocsh to your IOC and load only the specific interfaces you need. Note that the RTDE Control interface depends on both the Dashboard and RTDE Receive interfaces being active, and the Gripper interface depends on the Dashboard interface. The Dashboard, Receive, and I/O interfaces can be loaded independently.

5. Before starting the IOC, using the teach pendant, make sure the robot is powered on, brakes released, in Automatic mode, and in Remote Control mode. Note, if you are not using the RTDE control interface, all you need to do is make sure the robot controller is powered on.

At this point you should be able to start the IOC. If all went well, your IOC console should report messages (beginning with “[info]”) saying each interface to the robot was successfully connected:

# Load robot support with waypoint and path support
iocshLoad("urRobot.iocsh", "PREFIX=bcur:, IP=164.54.104.148")
# Set up UR Dashboard server
URDashboardConfig("dash", "164.54.104.148", "0.1")
[2026-03-05 12:46:05.750] [info] Connected to UR Dashboard server
dbLoadRecords("/net/s100dserv/xorApps/epics/synApps_6_3/support/urRobot/db/dashboard.db", "P=bcur:, PORT=dash")
# Set up UR RTDE Receive interface
RTDEReceiveConfig("rtde_recv", "164.54.104.148", "0.02")
[2026-03-05 12:46:06.331] [info] Connected to UR RTDE Receive interface
dbLoadRecords("/net/s100dserv/xorApps/epics/synApps_6_3/support/urRobot/db/rtde_receive.db", "P=bcur:, PORT=rtde_recv")
# Set up UR RTDE I/O interface
RTDEInOutConfig("rtde_io", "164.54.104.148", "0.1")
[2026-03-05 12:46:07.134] [info] Connected to UR RTDE IO interface
dbLoadRecords("/net/s100dserv/xorApps/epics/synApps_6_3/support/urRobot/db/rtde_io.db", "P=bcur:, PORT=rtde_io")
# Set up UR RTDE Control interface
RTDEControlConfig("rtde_ctrl", "dash", "rtde_recv", "0.02")
[2026-03-05 12:46:08.405] [info] Connected to UR RTDE Control interface
dbLoadRecords("/net/s100dserv/xorApps/epics/synApps_6_3/support/urRobot/db/rtde_control.db", "P=bcur:, PORT=rtde_ctrl")
# Set up Robotiq Gripper
URGripperConfig("gripper", "dash", "0.02")
[2026-03-05 12:46:09.012] [info] Connected to gripper
dbLoadRecords("/net/s100dserv/xorApps/epics/synApps_6_3/support/urRobot/db/robotiq_gripper.db", "P=bcur:, MIN_POS=3, MAX_POS=248, AUTO_ACTIVATE=YES, PORT=gripper")

If something went wrong, you will see messages in the console (beginning with “[error]”) which should explain the issue. The most common problems are an incorrect IP address or the robot not being powered on and brakes released (if using RTDE control interface).

6. To start the provided GUIs, use the example urRobot/iocs/urExample/start_urRobot_gui script. You may need to adjust the paths to the display manager executables in this script.