ros2em - ROS2 Environment Manager
ros2em is a CLI tool to create and manage isolated ROS2 environments.
Whether you're a robotics developer, student, or researcher, ros2em makes it easy to:
- 🧠 Spin up clean, persistent ROS 2 environments
- 🐳 Use Docker based containers
- 🖥 Access GUIs like Rviz or Gazebo via browser
- ✅ Support both
amd64andarm64architectures
🚀 Features
- ⚡ One-line ROS 2 environment creation and access
- 🖥 Web-based GUI using tiryoh/ros2-desktop-vnc
- 🖥 GUI access using browser
- 🔐 No system pollution – nothing touches your host machine
- 💡 Powered by Typer (CLI) and Rich (colored output)
🔧 Prerequisites
Before using ros2em, make sure you have Docker installed on your system:
🪟 Windows
- Install Docker Desktop from https://www.docker.com/products/docker-desktop
- Ensure WSL 2 is installed and configured (Docker Desktop will guide you).
- After install, verify Docker is working
docker version.
🍎 macOS
- Install Docker Desktop from https://www.docker.com/products/docker-desktop
- After installation, open Docker Desktop once to initialize.
- After install, verify Docker is working
docker version.
🐧 Linux (Ubuntu/Debian)
sudo apt update
sudo apt install -y docker.io docker-compose
sudo usermod -aG docker $USER
newgrp docker
Then test it docker version.
📦 Installation
Recommended (via pipx)
pipx install ros2em
Or using pip
pip install ros2em
🛠 Commands
🐣 Create a new environment
ros2em init myenv --distro humble
Creates a .ros2em/myenv/ folder with a default docker-compose.yml, metadata, and port configuration.
⚙️ Options
You can customize it with advanced options.
| Option | Type | Default | Description |
|---|---|---|---|
--ports |
list[str] | None | Extra port mappings in host:container format (e.g., 9000:9000) |
--context |
str | "default" | Docker context to use (useful for remote or wsl contexts) |
Example:
ros2em init turtlebot4 humble --ports 11311:11311 --context wsl
🚀 Start or resume the container
ros2em up myenv
Starts the container if it exists, or creates it if not.
🧹 Stop the container
ros2em stop myenv
Stops the running container but retains it, including all manually installed packages.
❌ Delete an environment
ros2em delete myenv
Stops and removes the container. As well deletes .ros2em/myenv/ folder and all metadata.
🖥 Accessing the Desktop GUI
ros2em open myenv
Click on the link that looks something like this in the output: http://localhost:6080.
🧩 Contributing
We welcome contributions, ideas, and feedback.
- Open issues for bugs and enhancements
- Fork and submit a pull request
- Share your use case via Discussions
📄 License
Apache 2.0 — © 2025 Kodo Robotics
Metadata
Release files for ros2em 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ros2em-0.2.0.tar.gz | 16.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ros2em-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.0 kB
Release files / ros2em-0.2.0.tar.gz
| Download URL | ros2em-0.2.0.tar.gz |
|---|---|
| Size | 16.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b29a59ed023cfdfd5bf59d5a44dea087e1522bb407ae2b9b9037f49af00ec1d1
|
|
BLAKE2b-256 checksum How to use checksums |
3ad724ae037c45417682b7976677b173c3018a8d8c0d9c1931768afc71242632
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.18
|
Release files / ros2em-0.2.0-py3-none-any.whl
| Download URL | ros2em-0.2.0-py3-none-any.whl |
|---|---|
| Size | 22.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
faf46ad3efaa38e505b6295c56ffaff6a213236e141da1eb14c642d3be770545
|
|
BLAKE2b-256 checksum How to use checksums |
939a579c2ed499d0821124523b8d7afb2dc5cfe87bfeb7be9f45aa24dc9ba793
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.18
|