Universal_Robots_ROS_Driver: UR5 external control cannot connect to ROS. Issue: No route to host.

Summary

Introduction to the issue

Versions

  • ROS Driver version: Ubuntu 20.04, ROS noetic
  • Affected Robot Software Version(s): CB3
  • Affected Robot Hardware Version(s): UR5
  • URCaps Software version(s): externalcontrol-1.0.5.urcap

Impact

I cannot connect the UR5 robot that we have in our lab to ROS. As it seems the communication between the UR5 and ROS PC could not be established, thus we cannot continue with our experiments and building important demo for real costumers.

Issue details

When I run the UR cap for external control at TP it outputs: The connection to the remote PC at 192.160.0.100:5002 could not be established. Reason: No route to host. I am struggling with this for couple of days. As it seems I cannot establish connection between the UR5 robot and PC. The connection other way around works i.e. I can connect to the robot from PC, but I cannot make the UR cap for external control to connect to the PC thus I cannot control the UR robot from ROS PC.

Use Case and Setup

One UR5 robot and ROS PC. The use case is we are trying to control the UR5 robots with our own programs and python script we wrote. Ultimately we also want to control the UR robot by using Moveit.

Project status at point of discovered

I observe the issue as soon as come to a point where I want to control the UR5 robot.

Steps to Reproduce

I tried literately everything and spend a few days searching on the web some solution, but all I tried failed. Below are the steps what I have tried and tested.

IP address of ROS PC: 192.160.0.100, mask: 255.255.255.0 I wrote the same IP address inside the External Control UR cap. IP address of UR5 robot: 192.160.0.101, mask: 255.255.255.0

I connected the robot LAN cable directly to ROS PC, where Ubuntu is running (not a virtual machine).

First I wrote this line of command in Terminal: roslaunch ur_robot_driver ur5_bringup.launch robot_ip:=192.160.0.101 [reverse_port:=REVERSE_PORT] kinematics_config:=$(rospack find ur_calibration)/etc/ur5_fact_cl.yaml

It seemed that everting is fine. Here is the output from the terminal:

SUMMARY
========

PARAMETERS
 * /controller_stopper/consistent_controllers: ['joint_state_con...
 * /force_torque_sensor_controller/publish_rate: 125
 * /force_torque_sensor_controller/type: force_torque_sens...
 * /hardware_control_loop/loop_hz: 125
 * /joint_group_vel_controller/joints: ['shoulder_pan_jo...
 * /joint_group_vel_controller/type: velocity_controll...
 * /joint_state_controller/publish_rate: 125
 * /joint_state_controller/type: joint_state_contr...
 * /pos_joint_traj_controller/action_monitor_rate: 20
 * /pos_joint_traj_controller/constraints/elbow_joint/goal: 0.1
 * /pos_joint_traj_controller/constraints/elbow_joint/trajectory: 0.2
 * /pos_joint_traj_controller/constraints/goal_time: 0.6
 * /pos_joint_traj_controller/constraints/shoulder_lift_joint/goal: 0.1
 * /pos_joint_traj_controller/constraints/shoulder_lift_joint/trajectory: 0.2
 * /pos_joint_traj_controller/constraints/shoulder_pan_joint/goal: 0.1
 * /pos_joint_traj_controller/constraints/shoulder_pan_joint/trajectory: 0.2
 * /pos_joint_traj_controller/constraints/stopped_velocity_tolerance: 0.05
 * /pos_joint_traj_controller/constraints/wrist_1_joint/goal: 0.1
 * /pos_joint_traj_controller/constraints/wrist_1_joint/trajectory: 0.2
 * /pos_joint_traj_controller/constraints/wrist_2_joint/goal: 0.1
 * /pos_joint_traj_controller/constraints/wrist_2_joint/trajectory: 0.2
 * /pos_joint_traj_controller/constraints/wrist_3_joint/goal: 0.1
 * /pos_joint_traj_controller/constraints/wrist_3_joint/trajectory: 0.2
 * /pos_joint_traj_controller/joints: ['shoulder_pan_jo...
 * /pos_joint_traj_controller/state_publish_rate: 125
 * /pos_joint_traj_controller/stop_trajectory_duration: 0.5
 * /pos_joint_traj_controller/type: position_controll...
 * /robot_description: <?xml version="1....
 * /robot_status_controller/handle_name: industrial_robot_...
 * /robot_status_controller/publish_rate: 10
 * /robot_status_controller/type: industrial_robot_...
 * /rosdistro: noetic
 * /rosversion: 1.15.11
 * /scaled_pos_joint_traj_controller/action_monitor_rate: 20
 * /scaled_pos_joint_traj_controller/constraints/elbow_joint/goal: 0.1
 * /scaled_pos_joint_traj_controller/constraints/elbow_joint/trajectory: 0.2
 * /scaled_pos_joint_traj_controller/constraints/goal_time: 0.6
 * /scaled_pos_joint_traj_controller/constraints/shoulder_lift_joint/goal: 0.1
 * /scaled_pos_joint_traj_controller/constraints/shoulder_lift_joint/trajectory: 0.2
 * /scaled_pos_joint_traj_controller/constraints/shoulder_pan_joint/goal: 0.1
 * /scaled_pos_joint_traj_controller/constraints/shoulder_pan_joint/trajectory: 0.2
 * /scaled_pos_joint_traj_controller/constraints/stopped_velocity_tolerance: 0.05
 * /scaled_pos_joint_traj_controller/constraints/wrist_1_joint/goal: 0.1
 * /scaled_pos_joint_traj_controller/constraints/wrist_1_joint/trajectory: 0.2
 * /scaled_pos_joint_traj_controller/constraints/wrist_2_joint/goal: 0.1
 * /scaled_pos_joint_traj_controller/constraints/wrist_2_joint/trajectory: 0.2
 * /scaled_pos_joint_traj_controller/constraints/wrist_3_joint/goal: 0.1
 * /scaled_pos_joint_traj_controller/constraints/wrist_3_joint/trajectory: 0.2
 * /scaled_pos_joint_traj_controller/joints: ['shoulder_pan_jo...
 * /scaled_pos_joint_traj_controller/state_publish_rate: 125
 * /scaled_pos_joint_traj_controller/stop_trajectory_duration: 0.5
 * /scaled_pos_joint_traj_controller/type: position_controll...
 * /scaled_vel_joint_traj_controller/action_monitor_rate: 20
 * /scaled_vel_joint_traj_controller/constraints/elbow_joint/goal: 0.1
 * /scaled_vel_joint_traj_controller/constraints/elbow_joint/trajectory: 0.1
 * /scaled_vel_joint_traj_controller/constraints/goal_time: 0.6
 * /scaled_vel_joint_traj_controller/constraints/shoulder_lift_joint/goal: 0.1
 * /scaled_vel_joint_traj_controller/constraints/shoulder_lift_joint/trajectory: 0.1
 * /scaled_vel_joint_traj_controller/constraints/shoulder_pan_joint/goal: 0.1
 * /scaled_vel_joint_traj_controller/constraints/shoulder_pan_joint/trajectory: 0.1
 * /scaled_vel_joint_traj_controller/constraints/stopped_velocity_tolerance: 0.05
 * /scaled_vel_joint_traj_controller/constraints/wrist_1_joint/goal: 0.1
 * /scaled_vel_joint_traj_controller/constraints/wrist_1_joint/trajectory: 0.1
 * /scaled_vel_joint_traj_controller/constraints/wrist_2_joint/goal: 0.1
 * /scaled_vel_joint_traj_controller/constraints/wrist_2_joint/trajectory: 0.1
 * /scaled_vel_joint_traj_controller/constraints/wrist_3_joint/goal: 0.1
 * /scaled_vel_joint_traj_controller/constraints/wrist_3_joint/trajectory: 0.1
 * /scaled_vel_joint_traj_controller/gains/elbow_joint/d: 0.1
 * /scaled_vel_joint_traj_controller/gains/elbow_joint/i: 0.05
 * /scaled_vel_joint_traj_controller/gains/elbow_joint/i_clamp: 1
 * /scaled_vel_joint_traj_controller/gains/elbow_joint/p: 5.0
 * /scaled_vel_joint_traj_controller/gains/shoulder_lift_joint/d: 0.1
 * /scaled_vel_joint_traj_controller/gains/shoulder_lift_joint/i: 0.05
 * /scaled_vel_joint_traj_controller/gains/shoulder_lift_joint/i_clamp: 1
 * /scaled_vel_joint_traj_controller/gains/shoulder_lift_joint/p: 5.0
 * /scaled_vel_joint_traj_controller/gains/shoulder_pan_joint/d: 0.1
 * /scaled_vel_joint_traj_controller/gains/shoulder_pan_joint/i: 0.05
 * /scaled_vel_joint_traj_controller/gains/shoulder_pan_joint/i_clamp: 1
 * /scaled_vel_joint_traj_controller/gains/shoulder_pan_joint/p: 5.0
 * /scaled_vel_joint_traj_controller/gains/wrist_1_joint/d: 0.1
 * /scaled_vel_joint_traj_controller/gains/wrist_1_joint/i: 0.05
 * /scaled_vel_joint_traj_controller/gains/wrist_1_joint/i_clamp: 1
 * /scaled_vel_joint_traj_controller/gains/wrist_1_joint/p: 5.0
 * /scaled_vel_joint_traj_controller/gains/wrist_2_joint/d: 0.1
 * /scaled_vel_joint_traj_controller/gains/wrist_2_joint/i: 0.05
 * /scaled_vel_joint_traj_controller/gains/wrist_2_joint/i_clamp: 1
 * /scaled_vel_joint_traj_controller/gains/wrist_2_joint/p: 5.0
 * /scaled_vel_joint_traj_controller/gains/wrist_3_joint/d: 0.1
 * /scaled_vel_joint_traj_controller/gains/wrist_3_joint/i: 0.05
 * /scaled_vel_joint_traj_controller/gains/wrist_3_joint/i_clamp: 1
 * /scaled_vel_joint_traj_controller/gains/wrist_3_joint/p: 5.0
 * /scaled_vel_joint_traj_controller/joints: ['shoulder_pan_jo...
 * /scaled_vel_joint_traj_controller/state_publish_rate: 125
 * /scaled_vel_joint_traj_controller/stop_trajectory_duration: 0.5
 * /scaled_vel_joint_traj_controller/type: velocity_controll...
 * /scaled_vel_joint_traj_controller/velocity_ff/elbow_joint: 1.0
 * /scaled_vel_joint_traj_controller/velocity_ff/shoulder_lift_joint: 1.0
 * /scaled_vel_joint_traj_controller/velocity_ff/shoulder_pan_joint: 1.0
 * /scaled_vel_joint_traj_controller/velocity_ff/wrist_1_joint: 1.0
 * /scaled_vel_joint_traj_controller/velocity_ff/wrist_2_joint: 1.0
 * /scaled_vel_joint_traj_controller/velocity_ff/wrist_3_joint: 1.0
 * /speed_scaling_state_controller/publish_rate: 125
 * /speed_scaling_state_controller/type: ur_controllers/Sp...
 * /ur_hardware_interface/headless_mode: False
 * /ur_hardware_interface/input_recipe_file: /home/andrija/cat...
 * /ur_hardware_interface/joints: ['shoulder_pan_jo...
 * /ur_hardware_interface/kinematics/forearm/pitch: 3.140966958583772
 * /ur_hardware_interface/kinematics/forearm/roll: 3.140766012372153
 * /ur_hardware_interface/kinematics/forearm/x: -0.4250232064816376
 * /ur_hardware_interface/kinematics/forearm/y: 0
 * /ur_hardware_interface/kinematics/forearm/yaw: -3.141558073414095
 * /ur_hardware_interface/kinematics/forearm/z: 0
 * /ur_hardware_interface/kinematics/hash: calib_15562149975...
 * /ur_hardware_interface/kinematics/shoulder/pitch: 0
 * /ur_hardware_interface/kinematics/shoulder/roll: 0
 * /ur_hardware_interface/kinematics/shoulder/x: 0
 * /ur_hardware_interface/kinematics/shoulder/y: 0
 * /ur_hardware_interface/kinematics/shoulder/yaw: 5.509168383401677...
 * /ur_hardware_interface/kinematics/shoulder/z: 0.08941756773522792
 * /ur_hardware_interface/kinematics/upper_arm/pitch: 0
 * /ur_hardware_interface/kinematics/upper_arm/roll: 1.570911651176805
 * /ur_hardware_interface/kinematics/upper_arm/x: 3.448420664022537...
 * /ur_hardware_interface/kinematics/upper_arm/y: 0
 * /ur_hardware_interface/kinematics/upper_arm/yaw: 6.107022279859953...
 * /ur_hardware_interface/kinematics/upper_arm/z: 0
 * /ur_hardware_interface/kinematics/wrist_1/pitch: 3.139957775716456
 * /ur_hardware_interface/kinematics/wrist_1/roll: 3.138030294417769
 * /ur_hardware_interface/kinematics/wrist_1/x: -0.3921585556258441
 * /ur_hardware_interface/kinematics/wrist_1/y: 0.000394405532511...
 * /ur_hardware_interface/kinematics/wrist_1/yaw: -3.141565600392387
 * /ur_hardware_interface/kinematics/wrist_1/z: 0.110714233202358
 * /ur_hardware_interface/kinematics/wrist_2/pitch: 0
 * /ur_hardware_interface/kinematics/wrist_2/roll: 1.569896799943622
 * /ur_hardware_interface/kinematics/wrist_2/x: 2.858449724536412...
 * /ur_hardware_interface/kinematics/wrist_2/y: -0.0948068975076615
 * /ur_hardware_interface/kinematics/wrist_2/yaw: 1.58545818336371e-05
 * /ur_hardware_interface/kinematics/wrist_2/z: 8.52813729959953e-05
 * /ur_hardware_interface/kinematics/wrist_3/pitch: 3.141592653589793
 * /ur_hardware_interface/kinematics/wrist_3/roll: 1.571273141565707
 * /ur_hardware_interface/kinematics/wrist_3/x: 5.656872741222997...
 * /ur_hardware_interface/kinematics/wrist_3/y: 0.0827162024974003
 * /ur_hardware_interface/kinematics/wrist_3/yaw: -3.141564044931817
 * /ur_hardware_interface/kinematics/wrist_3/z: 3.944031012504986...
 * /ur_hardware_interface/output_recipe_file: /home/andrija/cat...
 * /ur_hardware_interface/reverse_port: 50001
 * /ur_hardware_interface/robot_ip: 192.160.0.101
 * /ur_hardware_interface/script_file: /home/andrija/cat...
 * /ur_hardware_interface/script_sender_port: 50002
 * /ur_hardware_interface/servoj_gain: 2000
 * /ur_hardware_interface/servoj_lookahead_time: 0.03
 * /ur_hardware_interface/tf_prefix: 
 * /ur_hardware_interface/tool_baud_rate: 115200
 * /ur_hardware_interface/tool_parity: 0
 * /ur_hardware_interface/tool_rx_idle_chars: 1.5
 * /ur_hardware_interface/tool_stop_bits: 1
 * /ur_hardware_interface/tool_tx_idle_chars: 3.5
 * /ur_hardware_interface/tool_voltage: 0
 * /ur_hardware_interface/use_tool_communication: False
 * /vel_joint_traj_controller/action_monitor_rate: 20
 * /vel_joint_traj_controller/constraints/elbow_joint/goal: 0.1
 * /vel_joint_traj_controller/constraints/elbow_joint/trajectory: 0.1
 * /vel_joint_traj_controller/constraints/goal_time: 0.6
 * /vel_joint_traj_controller/constraints/shoulder_lift_joint/goal: 0.1
 * /vel_joint_traj_controller/constraints/shoulder_lift_joint/trajectory: 0.1
 * /vel_joint_traj_controller/constraints/shoulder_pan_joint/goal: 0.1
 * /vel_joint_traj_controller/constraints/shoulder_pan_joint/trajectory: 0.1
 * /vel_joint_traj_controller/constraints/stopped_velocity_tolerance: 0.05
 * /vel_joint_traj_controller/constraints/wrist_1_joint/goal: 0.1
 * /vel_joint_traj_controller/constraints/wrist_1_joint/trajectory: 0.1
 * /vel_joint_traj_controller/constraints/wrist_2_joint/goal: 0.1
 * /vel_joint_traj_controller/constraints/wrist_2_joint/trajectory: 0.1
 * /vel_joint_traj_controller/constraints/wrist_3_joint/goal: 0.1
 * /vel_joint_traj_controller/constraints/wrist_3_joint/trajectory: 0.1
 * /vel_joint_traj_controller/gains/elbow_joint/d: 0.1
 * /vel_joint_traj_controller/gains/elbow_joint/i: 0.05
 * /vel_joint_traj_controller/gains/elbow_joint/i_clamp: 1
 * /vel_joint_traj_controller/gains/elbow_joint/p: 5.0
 * /vel_joint_traj_controller/gains/shoulder_lift_joint/d: 0.1
 * /vel_joint_traj_controller/gains/shoulder_lift_joint/i: 0.05
 * /vel_joint_traj_controller/gains/shoulder_lift_joint/i_clamp: 1
 * /vel_joint_traj_controller/gains/shoulder_lift_joint/p: 5.0
 * /vel_joint_traj_controller/gains/shoulder_pan_joint/d: 0.1
 * /vel_joint_traj_controller/gains/shoulder_pan_joint/i: 0.05
 * /vel_joint_traj_controller/gains/shoulder_pan_joint/i_clamp: 1
 * /vel_joint_traj_controller/gains/shoulder_pan_joint/p: 5.0
 * /vel_joint_traj_controller/gains/wrist_1_joint/d: 0.1
 * /vel_joint_traj_controller/gains/wrist_1_joint/i: 0.05
 * /vel_joint_traj_controller/gains/wrist_1_joint/i_clamp: 1
 * /vel_joint_traj_controller/gains/wrist_1_joint/p: 5.0
 * /vel_joint_traj_controller/gains/wrist_2_joint/d: 0.1
 * /vel_joint_traj_controller/gains/wrist_2_joint/i: 0.05
 * /vel_joint_traj_controller/gains/wrist_2_joint/i_clamp: 1
 * /vel_joint_traj_controller/gains/wrist_2_joint/p: 5.0
 * /vel_joint_traj_controller/gains/wrist_3_joint/d: 0.1
 * /vel_joint_traj_controller/gains/wrist_3_joint/i: 0.05
 * /vel_joint_traj_controller/gains/wrist_3_joint/i_clamp: 1
 * /vel_joint_traj_controller/gains/wrist_3_joint/p: 5.0
 * /vel_joint_traj_controller/joints: ['shoulder_pan_jo...
 * /vel_joint_traj_controller/state_publish_rate: 125
 * /vel_joint_traj_controller/stop_trajectory_duration: 0.5
 * /vel_joint_traj_controller/type: velocity_controll...
 * /vel_joint_traj_controller/velocity_ff/elbow_joint: 1.0
 * /vel_joint_traj_controller/velocity_ff/shoulder_lift_joint: 1.0
 * /vel_joint_traj_controller/velocity_ff/shoulder_pan_joint: 1.0
 * /vel_joint_traj_controller/velocity_ff/wrist_1_joint: 1.0
 * /vel_joint_traj_controller/velocity_ff/wrist_2_joint: 1.0
 * /vel_joint_traj_controller/velocity_ff/wrist_3_joint: 1.0

NODES
  /
    controller_stopper (controller_stopper/node)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)
    ros_control_controller_spawner (controller_manager/spawner)
    ros_control_stopped_spawner (controller_manager/spawner)
    ur_hardware_interface (ur_robot_driver/ur_robot_driver_node)
  /ur_hardware_interface/
    ur_robot_state_helper (ur_robot_driver/robot_state_helper)

auto-starting new master
process[master]: started with pid [8046]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 8e32b3ac-0b45-11ec-b884-03e57e6855a5
process[rosout-1]: started with pid [8063]
started core service [/rosout]
process[robot_state_publisher-2]: started with pid [8070]
process[ur_hardware_interface-3]: started with pid [8071]
process[ros_control_controller_spawner-4]: started with pid [8072]
process[ros_control_stopped_spawner-5]: started with pid [8079]
process[controller_stopper-6]: started with pid [8086]
[ INFO] [1630515393.109889916]: Initializing dashboard client
process[ur_hardware_interface/ur_robot_state_helper-7]: started with pid [8088]
[ INFO] [1630515393.131052118]: Waiting for controller manager service to come up on /controller_manager/switch_controller
[ INFO] [1630515393.131264092]: Initializing urdriver
Warning: No realtime capabilities found. Consider using a realtime system for better performance
         at line 396 in /tmp/binarydeb/ros-noetic-ur-client-library-0.3.1/include/ur_client_library/comm/pipeline.h
[ INFO] [1630515393.133895022]: waitForService: Service [/controller_manager/switch_controller] has not been advertised, waiting...
[INFO] [1630515393.592836]: Controller Spawner: Waiting for service controller_manager/load_controller
[INFO] [1630515393.602599]: Controller Spawner: Waiting for service controller_manager/load_controller
Warning: DEPRECATION NOTICE: Passing the calibration_checksum to the UrDriver's constructor has been deprecated. Instead, use the checkCalibration(calibration_checksum) function separately. This notice is for application developers using this library. If you are only using an application using this library, you can ignore this message.
         at line 179 in /tmp/binarydeb/ros-noetic-ur-client-library-0.3.1/src/ur/ur_driver.cpp
Warning: No realtime capabilities found. Consider using a realtime system for better performance
         at line 396 in /tmp/binarydeb/ros-noetic-ur-client-library-0.3.1/include/ur_client_library/comm/pipeline.h
Warning: No realtime capabilities found. Consider using a realtime system for better performance
         at line 396 in /tmp/binarydeb/ros-noetic-ur-client-library-0.3.1/include/ur_client_library/comm/pipeline.h
[ INFO] [1630515395.291135591]: Loaded ur_robot_driver hardware_interface
[ INFO] [1630515395.360453247]: waitForService: Service [/controller_manager/switch_controller] is now available.
[ INFO] [1630515395.360528267]: Service available.
[ INFO] [1630515395.360605902]: Waiting for controller list service to come up on /controller_manager/list_controllers
[ INFO] [1630515395.361951963]: Service available.
[INFO] [1630515395.409079]: Controller Spawner: Waiting for service controller_manager/switch_controller
[INFO] [1630515395.414123]: Controller Spawner: Waiting for service controller_manager/unload_controller
[INFO] [1630515395.418393]: Loading controller: joint_state_controller
[INFO] [1630515395.421557]: Controller Spawner: Waiting for service controller_manager/switch_controller
[INFO] [1630515395.426044]: Controller Spawner: Waiting for service controller_manager/unload_controller
[INFO] [1630515395.431272]: Loading controller: pos_joint_traj_controller
[INFO] [1630515395.433207]: Loading controller: scaled_pos_joint_traj_controller
[INFO] [1630515395.489461]: Loading controller: joint_group_vel_controller
[ INFO] [1630515395.539945868]: Robot mode is now RUNNING
[ INFO] [1630515395.541400045]: Robot's safety mode is now NORMAL
[INFO] [1630515395.545190]: Loading controller: speed_scaling_state_controller
[INFO] [1630515395.561067]: Controller Spawner: Loaded controllers: pos_joint_traj_controller, joint_group_vel_controller
[INFO] [1630515395.569071]: Loading controller: force_torque_sensor_controller
[INFO] [1630515395.585059]: Controller Spawner: Loaded controllers: joint_state_controller, scaled_pos_joint_traj_controller, speed_scaling_state_controller, force_torque_sensor_controller
[INFO] [1630515395.592995]: Started controllers: joint_state_controller, scaled_pos_joint_traj_controller, speed_scaling_state_controller, force_torque_sensor_controller

After this I have run the external control UR cap from TP, and it could not connect to ROS PC, there is a message saying: The connection to the remote PC at 192.160.0.100:5002 could not be established. Reason: No route to host.

Then I read somewhere that I should try to test out to see if there is a communication between the ROS computer and robot thought the selected port so I tested the following: nc 192.160.0.100 50002 then typed request_program

and this is the output

# HEADER_BEGIN

steptime = get_steptime()

textmsg("ExternalControl: steptime=", steptime)
MULT_jointstate = 1000000

#Constants
SERVO_UNINITIALIZED = -1
SERVO_IDLE = 0
SERVO_RUNNING = 1

MODE_STOPPED = -2
MODE_UNINITIALIZED = -1
MODE_IDLE = 0
MODE_SERVOJ = 1
MODE_SPEEDJ = 2

#Global variables are also showed in the Teach pendants variable list
global cmd_servo_state = SERVO_UNINITIALIZED
global cmd_servo_qd = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
global cmd_servo_q = get_actual_joint_positions()
global cmd_servo_q_last = get_actual_joint_positions()
global extrapolate_count = 0
global extrapolate_max_count = 0
global control_mode = MODE_UNINITIALIZED
cmd_speedj_active = True

def set_servo_setpoint(q):
  cmd_servo_state = SERVO_RUNNING
  cmd_servo_q_last = cmd_servo_q
  cmd_servo_q = q
end

def extrapolate():
  diff = [cmd_servo_q[0] - cmd_servo_q_last[0], cmd_servo_q[1] - cmd_servo_q_last[1], cmd_servo_q[2] - cmd_servo_q_last[2], cmd_servo_q[3] - cmd_servo_q_last[3], cmd_servo_q[4] - cmd_servo_q_last[4], cmd_servo_q[5] - cmd_servo_q_last[5]]
  cmd_servo_q_last = cmd_servo_q
  cmd_servo_q = [cmd_servo_q[0] + diff[0], cmd_servo_q[1] + diff[1], cmd_servo_q[2] + diff[2], cmd_servo_q[3] + diff[3], cmd_servo_q[4] + diff[4], cmd_servo_q[5] + diff[5]]

  return cmd_servo_q
end

thread servoThread():
  textmsg("ExternalControl: Starting servo thread")
  state = SERVO_IDLE
  while control_mode == MODE_SERVOJ:
    enter_critical
    q = cmd_servo_q
    do_extrapolate = False
    if (cmd_servo_state == SERVO_IDLE):
      do_extrapolate = True
    end
    state = cmd_servo_state
    if cmd_servo_state > SERVO_UNINITIALIZED:
      cmd_servo_state = SERVO_IDLE
    end

    if do_extrapolate:
      extrapolate_count = extrapolate_count + 1
      if extrapolate_count > extrapolate_max_count:
        extrapolate_max_count = extrapolate_count
      end

      q = extrapolate()
      servoj(q, t=steptime, lookahead_time=0.03, gain=2000)

    elif state == SERVO_RUNNING:
      extrapolate_count = 0
      servoj(q, t=steptime, lookahead_time=0.03, gain=2000)
    else:
      extrapolate_count = 0
      sync()
    end
    exit_critical
  end
  textmsg("ExternalControl: servo thread ended")
  stopj(4.0)
end

# Helpers for speed control
def set_speed(qd):
  cmd_servo_qd = qd
  control_mode = MODE_SPEEDJ
end

thread speedThread():
  textmsg("ExternalControl: Starting speed thread")
  while control_mode == MODE_SPEEDJ:
    qd = cmd_servo_qd
    speedj(qd, 40.0, steptime)
  end
  textmsg("ExternalControl: speedj thread ended")
  stopj(5.0)
end

# HEADER_END

# NODE_CONTROL_LOOP_BEGINS

socket_open("192.160.0.100", 50001, "reverse_socket")

control_mode = MODE_UNINITIALIZED
thread_move = 0
global keepalive = -2
params_mult = socket_read_binary_integer(1+6+1, "reverse_socket", 0)
textmsg("ExternalControl: External control active")
keepalive = params_mult[1]
while keepalive > 0 and control_mode > MODE_STOPPED:
  enter_critical
  params_mult = socket_read_binary_integer(1+6+1, "reverse_socket", 0.02) # steptime could work as well, but does not work in simulation
  if params_mult[0] > 0:
    keepalive = params_mult[1]
    if control_mode != params_mult[8]:
      control_mode = params_mult[8]
      join thread_move
      if control_mode == MODE_SERVOJ:
        thread_move = run servoThread()
      elif control_mode == MODE_SPEEDJ:
        thread_move = run speedThread()
      end
    end
    if control_mode == MODE_SERVOJ:
      q = [params_mult[2] / MULT_jointstate, params_mult[3] / MULT_jointstate, params_mult[4] / MULT_jointstate, params_mult[5] / MULT_jointstate, params_mult[6] / MULT_jointstate, params_mult[7] / MULT_jointstate]
      set_servo_setpoint(q)
    elif control_mode == MODE_SPEEDJ:
      qd = [params_mult[2] / MULT_jointstate, params_mult[3] / MULT_jointstate, params_mult[4] / MULT_jointstate, params_mult[5] / MULT_jointstate, params_mult[6] / MULT_jointstate, params_mult[7] / MULT_jointstate]
      set_speed(qd)
    end
  else:
    keepalive = keepalive - 1
  end
  exit_critical
end

textmsg("ExternalControl: Stopping communication and control")
control_mode = MODE_STOPPED
join thread_move
textmsg("ExternalControl: All threads ended")
socket_close("reverse_socket")

# NODE_CONTROL_LOOP_ENDS

Don’t know if someone can spot that something is wrong? But it seems to me that communication works, but still I could not make that external control UR cap connects to a ROS PC.

I also tested this ss -atnp | grep 5000

and got this:

LISTEN      0        1                  0.0.0.0:50001            0.0.0.0:*       users:(("ur_robot_driver",pid=8238,fd=18))                                     
LISTEN      0        1                  0.0.0.0:50002            0.0.0.0:*       users:(("ur_robot_driver",pid=8238,fd=12))                                     
LISTEN      0        1                  0.0.0.0:50003            0.0.0.0:*       users:(("ur_robot_driver",pid=8238,fd=21))                                     
TIME-WAIT   0        0            192.160.0.100:34446      192.160.0.100:50002 

I am not sure what all this means.

Then I thought maybe a firewall is blocking some ports, but this is not the case. I tested the firewall: sudo ufw status and it output this inactive

Then I tired different IP address like:

ROS PC: 192.168.0.77 mask: 255.255.255.0
UR5: 192.168.0.100 mask: 255.255.255.0

didn’t work.

Then I also tried:

ROS PC: 192.168.2.13 mask: 255.255.0.0
UR5: 192.168.2.11 mask: 255.255.0.0

didn’t work.

No matter what I tired I could not make to work. I hope someone can help me. I am really struggling with this. Many thanks!

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 27 (7 by maintainers)

Most upvoted comments

Hi @urrsk ,

Thanks for the question. Yes that is exactly what I did. When I disabled the firewall using the command I posted above, my Ubuntu computer, running the UR ROS Driver worked. And all worked nicely since then. I never had a problem after that or when I turned off the firewall.

@hf-zhao Nice that you made it work! Sorry for not answering your messages before.