EFMNode
February 13, 2026 ยท View on GitHub
EFMNode is a robot control node that integrates vision-language models (VLM) with robot action inference for real-time robot control via ROS2.
Table of Contents
Environment Setup
Recommanded Environment
we recommend using Docker for better experience
- pull the image
docker pull edp-image-registry-cn-beijing.cr.volces.com/infer-public/galaxea_infer
- start a container
docker run -itd \
--name galaxea \
--network host \
--gpus all \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix/X1:/tmp/.X11-unix/X11 \
edp-image-registry-cn-beijing.cr.volces.com/infer-public/galaxea_infer:latest
- execution with glx cli
docker exec -it galaxea bash
glx discovery 10.42.0.<ROBOT_PORT>
glx run <MODEL_DIR_NAME> # MODEL_DIR_NAME is the model directory under ~/.galaxea/models
- Usage for more usage, can try
glx help
Prerequisites
- CUDA-capable GPU (RTX 4090 with CUDA driver over 12.8 is recommended for TensorRT)
- ROS2 Humble
- Python 3.10
Installation Steps
- Clone the EFMNode repository:
git clone https://github.com/OpenGalaxea/EFMNode.git
cd EFMNode
- Clone and install the GalaxeaFM repository (if not already done):
git clone https://github.com/OpenGalaxea/GalaxeaVLA.git
cd GalaxeaFM
uv sync --index-strategy unsafe-best-match
uv pip install -e .
source .venv/bin/activate
cd ..
Model Weights and Configuration
Download Model Weights
- Download the model checkpoint directory from the provided source
- Extract it to your desired location (e.g.,
/path/to/model/checkpoint/)
The checkpoint directory should contain:
config.yaml- Model configuration filedataset_stats.json- Dataset statistics for preprocessing- Model weight files (
.pth,.pt, or TensorRT engine files)
Note for TensorRT users: When using TensorRT (use_trt = true), the TensorRT plugin gemma_rmsnorm.so should be placed in plugins/lib/ directory. The plugin path is automatically resolved relative to the project root.
Configure config.toml
Edit config.toml in the project root to match your setup:
[robot]
hardware = "R1_LITE" # or "R1_PRO"
[basic]
control_frequency = 15.0 # Control frequency in Hz
step_mode = "sync" # "sync" or "async"
action_steps = 32 # Number of action steps per inference
[model]
ckpt_dir = "/path/to/ckpt/dir" # Path to model checkpoint directory
use_trt = false # Set to true to use TensorRT acceleration
processor = "default" # Processor type
[instruction]
use_vlm = true # Enable VLM-based instructions
bbox_as_instruction = false # Use bounding boxes as instructions
image_condition_lang_prefix = true # Use image condition with language prefix
pp_lower_half = false # Post-process lower half
image_as_condition = true # Use image as condition
Important Configuration Notes:
- Set
ckpt_dirto the absolute path of your model checkpoint directory - Set
use_trt = trueif you have TensorRT engines available - Adjust
control_frequencybased on your hardware capabilities - Modify
hardwareto match your robot model
Running and Data Recording
Running the Node
- Ensure ROS2 is sourced:
source /opt/ros/humble/setup.bash # Adjust path for your ROS2 installation
- Run the node:
./scripts/run.sh
The script run.sh automatically:
- Sets up environment variables (HF_ENDPOINT, PYTHONPATH, LD_LIBRARY_PATH)
- Configures logging
- Runs the main script
Data Recording
To record ROS2 topics for later analysis or replay:
./scripts/record.sh <output_bag_directory>
Example:
./scripts/record.sh /path/to/recordings/my_recording
The recording script captures:
- Camera topics (head depth, left/right wrist cameras)
- Feedback topics (grippers, arms, torso, chassis)
- Control topics (arm, gripper, chassis, torso control)
- Motion target topics
- TF transforms
- Progress indicators
Note: If the output directory already exists, it will be deleted before recording starts.
Running with Custom Configuration
You can modify config.toml and restart the node to apply changes. The node will:
- Load the configuration from
config.toml - Load model configuration from
{ckpt_dir}/config.yaml - Initialize the inference engine and processor
- Connect to ROS2 topics
- Start the control loop
Troubleshooting
Common Issues
1. "No observation" messages
- Cause: ROS2 topics are not publishing or not connected
- Solution:
- Verify ROS2 is running:
ros2 topic list - Check if required topics are available
- Ensure the robot hardware is connected and publishing
- Verify ROS2 is running:
2. Model loading errors
- Cause: Incorrect checkpoint path or missing files
- Solution:
- Verify
ckpt_dirinconfig.tomlis correct - Ensure
config.yamlanddataset_stats.jsonexist in the checkpoint directory - Check file permissions
- Verify