ROS Package bob_flux2k
ROS 2 node for the FLUX.2-klein text-to-image and image-to-image models from Black Forest Labs.
This node supports both the 4B and 9B variants of the FLUX.2-klein family:
- FLUX.2-klein-4B: Optimized for speed and lower VRAM usage (Apache 2.0 license).
- FLUX.2-klein-9B: Higher quality and better prompt following (requires ~22GB VRAM, fits on RTX 4090).
Important
To use the 9B model, you must manually visit the model page, log in to Hugging Face, and agree to the terms and non-commercial license. You will also need to be logged in via huggingface-cli login on your machine for the node to download the weights.
You can switch models via the repo_id ROS parameter or the FLUX2K_REPO_ID environment variable.
cd ~/ros2_ws/src
git clone https://github.com/bob-ros2/bob_flux2k.gitIt is recommended to use a virtual environment.
pip install -r bob_flux2k/requirements.txtcd ~/ros2_ws
colcon build --packages-select bob_flux2k
source install/setup.bashYou can run the node directly or provide a configuration file.
Basic run:
ros2 run bob_flux2k tti --ros-args -p repo_id:=black-forest-labs/FLUX.2-klein-4BUsing a configuration file:
ros2 run bob_flux2k tti --ros-args --params-file src/bob_flux2k/config/tti.yamlros2 topic pub /prompt std_msgs/msg/String "{data: 'A futuristic city in the style of cyberpunk'}" --onceThe node automatically detects if a prompt is plain text or a JSON string. Using JSON allows you to specify an input image dynamically for a single request:
Format:
{
"content": "A high-quality photo of a cat",
"image_url": "file:///path/to/image.jpg"
}Features:
- Text-to-Image: Just send plain text or JSON without an
image_url. - Image-to-Image: Provide an
image_url. Supports:- Local files:
file:///home/user/image.png - Remote URLs:
https://example.com/image.jpg - Base64 encoded:
data:image/png;base64,...(Ideal for web-app integrations).
- Local files:
Example (CLI):
ros2 topic pub /prompt std_msgs/msg/String "{data: '{\"content\": \"a robot dog\", \"image_url\": \"file:///tmp/dog.jpg\"}'}" --onceThe node interacts with the following ROS 2 topics:
| Topic | Message Type | Direction | Description |
|---|---|---|---|
prompt |
std_msgs/msg/String |
Sub | The input prompt for text-to-image or image-conditioned generation. |
generated_image |
sensor_msgs/msg/Image |
Pub | The resulting image, published in bgr8 encoding. |
These can be adjusted while the node is running using the rqt_reconfigure GUI.
| Parameter | Env Variable | Default | Description |
|---|---|---|---|
keep_loaded |
FLUX2K_KEEP_LOADED |
true |
If true, keeps the model in memory. |
cpu_offload |
FLUX2K_CPU_OFFLOAD |
true |
If true, uses CPU offloading. |
num_inference_steps |
FLUX2K_NUM_STEPS |
4 |
Number of denoising steps. |
guidance_scale |
FLUX2K_GUIDANCE |
1.0 |
Prompt following strength. |
num_images_per_prompt |
FLUX2K_NUM_IMAGES |
1 |
Batch generation count. |
max_sequence_length |
FLUX2K_MAX_SEQ |
512 |
Max prompt length. |
frame_id |
FLUX2K_FRAME_ID |
flux2k |
The frame_id for the output. |
These are set at startup and cannot be changed while the node is running.
| Parameter | Env Variable | Default | Description |
|---|---|---|---|
repo_id |
FLUX2K_REPO_ID |
black-forest-labs/FLUX.2-klein-4B |
Model repository ID. |
model_dir |
FLUX2K_MODEL_DIR |
./models |
Cache directory. |
device |
FLUX2K_DEVICE |
cuda:0 |
Computing device. |
seed |
FLUX2K_SEED |
-1 |
Random seed (-1 for random). |
image_path |
FLUX2K_IMAGE_PATH |
'' |
Path for saving the output image. If empty, local saving is disabled. |
once |
FLUX2K_ONCE |
false |
Exit after first generation if true. |
height |
FLUX2K_HEIGHT |
1024 |
Image height. |
width |
FLUX2K_WIDTH |
1024 |
Image width. |
To start the configuration GUI and adjust the dynamic parameters, run:
ros2 run rqt_reconfigure rqt_reconfigureAn example configuration file is provided at config/tti.yaml. This file contains all parameters with descriptions and can be used to set the initial behavior of the node without providing long command-line arguments.
The node is optimized for NVIDIA consumer GPUs (like the RTX 4090) using torch.bfloat16. It also utilizes enable_model_cpu_offload() to ensure memory efficiency, allowing it to coexist with other GPU-intensive nodes.