Skip to content
arc-lPublic

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 watching

Forks

Repository files navigation

KARL

Official Implementation of KARL: Kalman-Filter Assisted Reinforcement Learner for Dynamic Object Tracking and Grasping

By Kowndinya Boyalakuntla, Abdeslam Boularias, Jingjin Yu (Rutgers University)

Published at: International Conference on Intelligent Robots and Systems (IROS) 2025


Abstract. We present Kalman-Filter Assisted Reinforcement Learner (KARL) for dynamic object tracking and grasping over eye-on-hand (EoH) systems, significantly expanding such systems’ capabilities in challenging, realistic environments. In comparison to the previous state-of-the-art, KARL (1) incorporates a novel six-stage RL curriculum that doubles the system’s motion range, thereby greatly enhancing the system’s grasping performance, (2) integrates a robust Kalman filter layer between the perception and reinforcement learning (RL) control modules, enabling the system to maintain an uncertain but continuous 6D pose estimate even when the target object temporarily exits the camera’s field-of-view or undergoes rapid, unpredictable motion, and (3) introduces mechanisms to allow retries to gracefully recover from unavoidable policy execution failures. Extensive evaluations conducted in both simulation and real-world experiments qualitatively and quantitatively corroborate KARL’s advantage over earlier systems, achieving higher grasp success rates and faster robot execution speed.


PDF  •  5 MIN VIDEO

Getting Started

We provide a Docker image to simplify installation and ensure reproducibility.

1. Install Docker (skip if already installed)

Follow the official instructions:


2. Pull the Docker Image

sudo docker pull kowndidocker/karl:v0

3. Run the Container

sudo bash docker/run_container.sh # This will create a container with the name 'karl_container' and start it.

Container Management

Restart (Fix display issues)

If DISPLAY=:0 is lost:

sudo docker stop karl_container
sudo docker rm karl_container
sudo bash docker/run_container.sh

Start an Existing Container

sudo docker start karl_container
sudo docker attach karl_container

Open a New Terminal in the Container

sudo docker exec -it karl_container bash

Stop the Container

sudo docker stop karl_container

Remove the Container

sudo docker rm karl_container

Code Location Inside Container

<KARL_FOLDER_PATH> # Same as the path on your host machine, but inside the container.

UR5e + Intel L515 Hardware Setup

Camera Calibration

If the camera mount has not been modified, calibration is typically unnecessary as the error is negligible.

Otherwise, follow the MoveIt hand-eye calibration tutorial: https://ros-planning.github.io/moveit_tutorials/doc/hand_eye_calibration/hand_eye_calibration_tutorial.html

Relevant package:

vsg_real_robot/vsg_ws/src/moveit_calibration

Required Configuration

Ensure the joint zdummy_gripper_zcamera_joint is properly defined with calibrated values:

  • Real Robot URDF:
vsg_real_robot/vsg_ws/src/universal_robot/ur_description/urdf/inc/my_ur_macro.xacro
  • Simulation URDF:
visual_feedback_rl/assets/urdf/ur5e/ur5e_simplified_gripper.urdf

Camera Mount Mesh

Located at:

visual_feedback_rl/assets/urdf/ur5e/meshes

Robot Pendant Configuration

Select:

gripper_earl

Ensure the following URCaps are installed:

  • Robotiq
  • External Control

KARL's Real-Robot Execution (UR5e)

You need open 9 terminals to run the full system inside the created karl_container. In each of these terminals, you need to navigate to the KARL code directory before running the below respective commands.

terminal 1 (ros - ur5 and camera)

conda activate ros
source vsg_ws/setup.sh
roslaunch ur_robot_driver my_ur5e_bringup_vel.launch robot_ip:=172.17.139.103 json_file_path:=<KARL_FOLDER_PATH>/vsg_ws/l515.json

terminal 2 (python - publish robot info)

conda activate ros
source vsg_ws/setup.sh
cd vsg_tracking
python pub_act_jacob_ros_ur5e.py

terminal 3 (python - R2D2 Feature extraction)

cd vsg_tracking/r2d2
conda activate r2d2
python feature_server.py --model models/faster2d2_WASF_N16.pt --top-k 300

terminal 4 (python - contact graspnet)

# (before running sudo docker exec -it earl bash)
xhost + 
conda activate contact_graspnet_env
source vsg_ws/setup.sh
cd vsg_tracking/contact_graspnet
python contact_graspnet/inference_zmq.py --local_regions --filter_grasps --z_range='[0.2,2.0]'

Before restarting the system after each trial, run the following command to free up the port:

kill -9 $(lsof -i :5558)

Need to restart after each trial

terminal 5 (python - Foundationpose)

docker start foundationpose
docker exec -it foundationpose bash

cd /home/kowndi/Documents/iros25/karl/vsg_tracking/foundationpose
python earl_pose_server.py

Before restarting the system after each trial, run the following command to free up the port:

kill -9 $(lsof -i :8900)

Need to restart after each trial

terminal 5 (BundleTrack)

cd vsg_tracking/BundleTrack
python scripts/run_ycblive.py 

Before restarting the system after each trial, run the following command to free up the port:

kill -9 $(lsof -i :5556)

Need to restart after each trial

terminal 6 (RL policy)

source vsg_ws/setup.sh
conda activate rlgpu
cd visual_feedback_rl/isaacgymenvs
export LD_LIBRARY=$LD_LIBRARY:/opt/conda/envs/rlgpu/lib
# EARL RL Policy
<!-- python real_robot_policy.py task=UR5VSGTaskTest test=True num_envs=2 checkpoint=UR5VSGTask.pth headless=True -->
# KARL RL Policy
python real_robot_policy.py task=UR5VSGTaskTest test=True num_envs=2 checkpoint=UR5VSGTask_UR5VSGTask-19-08-03-06.pth headless=True

terminal 7 (2D tracking)

cd '/home/kowndi/Documents/iros25/karl'
source vsg_ws/setup.sh
conda activate test2
cd vsg_tracking
python live_demo_ros.py --show


Need to restart after each trial

terminal 8 (GUI)

cd '/home/kowndi/Documents/iros25/karl/vsg_tracking'
conda activate pytracking
python live_demo_vis.py --log


Need to restart after each trial

terminal 9 (main loop)

conda activate ros
source vsg_ws/setup.sh
cd vsg_tracking
python real_robot_demo_ur5e.py -m 'rl'

Before restarting the system after each trial, run the following command to free up the port:

kill -9 $(lsof -i :5559)

Need to restart after each trial

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages