This repository provides a modular framework for training reinforcement learning (RL) agents on the Kinova Gen3 robot using Isaac Lab, and deploying trained models either in Isaac Sim, or on the real robot via ROS2.
Built as a standalone Isaac Lab extension, it allows isolated development.
Important
The Sim2Real pipeline runs entirely with ROS2 and does not require Isaac Lab or Isaac Sim to be installed. And for convenience, pre-trained models are provided so you can get started immediately without training.
| Section | What you’ll find |
|---|---|
| 🛠️ Installation | How to install Isaac Lab, clone this repo, and install the Python package. |
| 🚀 Training & Basic Testing | Commands to train a reach-task policy with rsl_rl or rl_games and replay it in Isaac Lab. |
| 🤖 Sim-to-Real Deployment (ROS 2) | Step-by-step instructions to test on fake hardware, then execute the exact same policy on the physical Kinova Gen3. |
| 🌟 Acknowledgements | Credits to Isaac Lab, Kinova, community help, and INIT Lab. |
| 📚 Citation | BibTeX citation |
kinova_demo.mp4
- Install Isaac Lab by following the official installation guide (conda recommended).
- Clone this repo outside the
IsaacLabdirectory. - Install from the repository:
python -m pip install -e source/gen3You can train a policy on the Kinova Gen3 Reach Task using either rsl_rl or rl_games library:
python scripts/rsl_rl/train.py --task Gen3-Reach-v0After training, a quick way to validate the behavior is to use play.py:
python scripts/rsl_rl/play.py --task Gen3-Reach-v0This helps confirm that the learned policy performs as expected in Isaac Lab before attempting transfer.
The Sim2Real pipeline focuses on deploying trained reinforcement learning policies directly onto the real Kinova Gen3 robot using a minimal ROS2-based interface, with no dependency on Isaac Lab or Isaac Sim at runtime.
You can first try to simulate the Kinova Gen3 in ROS2 using fake hardware mode:
ros2 launch kortex_bringup gen3.launch.py robot_ip:=yyy.yyy.yyy.yyy use_fake_hardware:=trueTo test movement commands, send a simple joint trajectory:
ros2 topic pub /joint_trajectory_controller/joint_trajectory trajectory_msgs/JointTrajectory "{
joint_names: [joint_1, joint_2, joint_3, joint_4, joint_5, joint_6, joint_7],
points: [
{ positions: [0, 0, 0, 0, 0, 0, 0], time_from_start: { sec: 1 } },
]
}" -1Run the Reach Task with the trained policy to go to a certain predefined position:
python3 scripts/sim2real/run_task_reach.pyThe next step is to connect the same interface to the real Kinova Gen3 and execute the learned Reach Task in real-world conditions — using the exact same model and runtime logic validated in simulation.
For that you'll run:
ros2 launch kortex_bringup gen3_lite.launch.py robot_ip:=192.168.1.10And in the same way as simulation, in another terminal:
python3 scripts/sim2real/run_task_reach.pyNow your robot should be alternating between three positions.
- Isaac Lab team & contributors
- Johnson Sun
- Kinova Robotics
- INIT Lab
- Website
- David St-Onge
- Augustin Nguon
If you use this work, please cite it as:
@software{Le_Lay_Kinova_Gen3_RL_2025,
author = {Le Lay, Louis},
doi = {https://doi.org/10.5281/zenodo.16530856},
license = {MIT},
month = jul,
title = {Kinova Gen3 RL \& Sim2Real Toolkit},
url = {https://github.com/louislelay/kinova_isaaclab_sim2real},
version = {v1.0.0},
year = {2025}
}