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.
We provide a Docker image to simplify installation and ensure reproducibility.
Follow the official instructions:
- Docker Engine: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
- NVIDIA Container Toolkit: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#with-apt-ubuntu-debian
- Configure Docker to use NVIDIA runtime: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#configuring-docker
sudo docker pull kowndidocker/karl:v0sudo bash docker/run_container.sh # This will create a container with the name 'karl_container' and start it.If DISPLAY=:0 is lost:
sudo docker stop karl_container
sudo docker rm karl_container
sudo bash docker/run_container.shsudo docker start karl_container
sudo docker attach karl_containersudo docker exec -it karl_container bashsudo docker stop karl_containersudo docker rm karl_container<KARL_FOLDER_PATH> # Same as the path on your host machine, but inside the container.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
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
Located at:
visual_feedback_rl/assets/urdf/ur5e/meshes
Select:
gripper_earl
Ensure the following URCaps are installed:
- Robotiq
- External Control
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.
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
conda activate ros
source vsg_ws/setup.sh
cd vsg_tracking
python pub_act_jacob_ros_ur5e.py
cd vsg_tracking/r2d2
conda activate r2d2
python feature_server.py --model models/faster2d2_WASF_N16.pt --top-k 300
# (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
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
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
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
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
cd '/home/kowndi/Documents/iros25/karl/vsg_tracking'
conda activate pytracking
python live_demo_vis.py --log
Need to restart after each trial
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