
Thanks — I crawled your articubot_one dev branch and reviewed the repo structure and key files. Below is a concise but deep characterization of how you approach supporting multiple robots with shared code + per-robot peculiarities, plus a few practical observations and suggestions. I’ve cited the repository pages I inspected so you can jump to the source quickly.
Single package contains multiple robots
The repository is organized as one main ROS package (articubot_one) that contains a robots/ directory with one folder per robot (e.g., seggy, turtle, plucky). The README explicitly describes the intent: each robot folder is a small variation (copy/rename) of a template so adding a new robot is mostly copying and tweaking per-robot files. This is a straightforward, pragmatic approach for small fleets and experimentation. GitHub+1
Shared runtime code + per-robot config/launch/description
You keep the common runtime code and ROS node implementations at package root (CMakeLists/package.xml etc.), while per-robot differences live under each robot directory (config files, URDF/description, launch fragments). This pattern minimizes duplication of logic while keeping hardware differences isolated. GitHub+1
Configuration-driven customization
Per-robot config/*.yaml files (examples visible in robots/seggy/config) are used to tune behavior: PID/limits, smoothing frequency, sensor/driver parameters. Launch files pick the appropriate YAMLs so the same launch logic can be reused across robots simply by pointing to different param files. This yields a composable workflow: code = shared; config = robot unique. GitHub
Launch + simulation parity
The README and launch layout show you run the same stacks in simulation (Gazebo) and on hardware; simulation launch files are included so you can validate changes before deploying to a Raspberry Pi-based robot. That helps keep your “island of stability” reproducible. GitHub
Pragmatic template/copy pattern
You explicitly encourage copying an existing robot folder to create a new robot. That’s fast and low-friction for a small number of platforms with modest differences (sensors, wheel encoders, comms). It trades a bit of duplication for developer speed and clarity in each robot’s directory. GitHub
Per-robot configs: robots/<robot>/config/* contain tuned parameters (e.g., velocity_smoother settings for Seggy). This is where robot-specific PID, smoothing, and sensor parameters live. Keeping these in YAML means launch-time parameterization (swap YAML → different robot behavior). GitHub
Per-robot launch and description: each robot has its own launch/ and description/ fragments (URDF or xacro) allowing you to swap hardware descriptions without changing shared nodes. This makes it easy to re-use the same navigation stack or node graph across robots.
One package, one build: The package-level CMakeLists.txt and package.xml indicate you build one artifact and install multiple runtime assets. That keeps the build simple for a small robot family while still supporting per-robot runtime selection. GitHub+1
Simulator parity: simulation launch files are present and linked in README; you run the same high-level launch stacks in sim and on-robot, which is good for testing changes before flashing to hardware. GitHub
Low cognitive overhead — developers can clone and tweak a robot folder to create a new robot quickly.
High reuse of logic — common nodes, controllers and libraries are centralized so fixes/improvements benefit all robots.
Config-driven tuning — YAML-based parameters and per-robot config files allow per-robot tuning without code changes.
Good sim/hw parity — having simulation launch files reduces surprises when moving to hardware.
Practical for small fleets and rapid experimentation — fits your goal of building a shareable codebase people can drop onto their own platform.
Copy-and-paste drift
Risk: Robot folders copied and modified diverge; fixes in shared behavior may not propagate if people edit robot copies.
Mitigation: Consider templating per-robot folders (e.g. a robots/template with a small generator script that fills in robot-specific values) or a thin layer of “robot metadata” (one YAML per robot) used by generic launch files rather than literal code copies.
Scaling pain
Risk: If you scale to many robots with many permutations of sensors/wheels/protocols, the copy approach becomes brittle.
Mitigation: Add a small abstraction layer: a robot_description package that consumes a robot meta-YAML and exposes parameters/URDF/driver selection. Use composition instead of duplication.
Hard-to-automate compatibility
Risk: Different robots may require different driver installs (e.g., custom kernel modules, libcreate variants). Managing those differences across multiple deployments can cause drift.
Mitigation: Document per-robot installation steps in each robot folder and consider small setup_<robot>.sh helpers. For more automation, provide a declarative rosdep/Ansible script per robot.
Testing coverage
Risk: Unit tests / CI that run on the shared code might miss robot-specific misconfigurations.
Mitigation: Add small, fast integration tests that load each robot’s launch with use_sim_time:=true to ensure param files and node graphs are valid (can be run on CI).
Robot metadata file
Create robots/<name>/robot.yaml with keys: frame_id, base_type, wheel_type, encoder_ticks, sensor_list, launch_aliases. Then write small shared launch files that accept a robot argument and load the matching metadata. This reduces folder copying while keeping per-robot uniqueness.
Templated launch composition
Instead of many near-duplicate launch files, have a few generic launches that accept a robot parameter and include robot-specific fragments. Keep robot folders with only the fragments (URDF, YAML, maybe small driver node remappings).
Driver abstraction layer
For different base communication protocols (e.g., serial, CAN, custom driver board), expose a small common driver interface (topics/services) and implement adapters per base. This keeps navigation and higher layers driver-agnostic.
Central tuning repository
Keep a tuning/ folder with reference parameter sets and performance notes for each robot to make it easier to reproduce stable configurations (you already have such param files — centralizing them and linking to docs helps).
Add smoke tests
Add a small test that launches each robot’s launch file in sim for a few seconds and checks that required topics and nodes come up — very cheap CI coverage.
Your robots/seggy/config/velocity_smoother.yaml demonstrates sensible per-robot tuning: the smoothing frequency is explicitly tuned and recorded (experimental notes). Keep that style — explicit comments and links in the YAML are very helpful. GitHub
README already documents the “copy folder” workflow — that’s great for onboarding contributors. Consider adding a short “how to add a robot” checklist linking to the per-robot metadata idea. GitHub
You use a single-package, config-driven approach: centralize shared code (nodes, controllers, launches) in one package, and express robot differences through per-robot folders (URDF/config/launch fragments). It’s pragmatic, easy to understand, and excellent for small fleets and active experimentation — with straightforward steps to scale toward more formal abstractions if you need them. GitHub+1
--
You received this message because you are subscribed to the Google Groups "HomeBrew Robotics Club" group.
To unsubscribe from this group and stop receiving emails from it, send an email to hbrobotics+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/3DC714C5-D6D3-43AA-8E80-72C266DE8EEB%40gmail.com.
Use clear directory separation
You keep per-robot launch files in each robot’s own folder, isolating differences in hardware and configuration. That prevents a single, sprawling launch tree filled with conditionals.
Favor explicit inclusion over logic-heavy composition
Each launch file is a straightforward list of nodes and parameter file inclusions — not a maze of conditionals or substitutions. You rely on the filesystem hierarchy to express variation, not runtime branching.
Reuse base launch templates
Shared or simulation launches live at the package root and are reused by multiple robots, maintaining consistency without duplication of node definitions.
Keep parameter files external
Most tuning (topics, rates, limits) is offloaded into YAMLs, so launches remain short and declarative. This keeps launches focused on “what to start” rather than “how to configure”.
Document the pattern
Your README and file organization explain how to copy or adapt launches for new robots. That documentation itself enforces hygiene — new launches are built by example, not improvisation.
In short, you manage launch-file complexity by structuring for clarity, isolating differences, and externalizing configuration, turning what’s often a tangled web into a clean, reproducible hierarchy.
Pito,
As a relative novice in robotics (despite many years of floundering) I appreciate your confusion!
"I am only an egg." {can you place the quote?}
"Robotics is HARD!"
ROS(-2) is what takes robotics from absolutely impossible, to merely hard.
It takes a village to make a robot.
Every one of the over 30,000 ROS2 packages (per Google AI overview) was written by someone(s).
Then someone(s) else (often one of us) thinks they can do better and does.
If a giraffe is "an animal built by committee", it's got nothing on our robots!
Launch files are the seat of customization. That's why they vary so much.
It's where you adapt the cut and paste modules to your particular robot and mission.
I have, finally, just succeeded in getting Nav2 to take my Stormy the Stingray robot from my study to the living room and back!
https://www.youtube.com/watch?v=Kj8ijCCRR4o for iPhone piggyback video
https://www.youtube.com/watch?v=YAfdKwbhIpI for Rviz2 screencast of the trip
For this, I wanted just the bare minimum of accessories - just motor encoders, LIDAR and, for a trial, IMU.
No camera, no depthcamera pointcloud. No edge distance sensors or sonar (as if I had any).
For this I 'uncommented' the statement that activated the BNO055 IMU and left 'commented out' the OAK-D camera.
Some other time I'll try the camera.
Different 'expert' roboticists in HBRC (and we have MANY) do launch files differently.
Sergei likes to bundle the activation code lines at the end, handy to comment out or in.
Michael likes to put them at the end of each module.
Camp eschews launch files and likes to run each module manually in turn so he's clear on what's happening.
What are the 'best practices' of robotics?
How should you organize your directories?
What's the best overall layout for a launch file?
I, too, wish there were a Strunk and White The Elements of Style for robotics!
Maybe we could get an AI to write it for us but, given the bogus directions they've given me so far, NOT!
So, you talk to your colleagues here and at your local robotics coven. Ask the big picture questions.
Some can look down from the upper slopes of the 'learning curve', see you struggling near the bottom, remember being there, and tell you where to place your foot for the next step. Some cannot.
Fortunately, we have many in HBRC who can.
Come to the ROS Special Interest Group Zooms Tues 19:00 Pacific. (21:00 my time but worth staying up for)
Listen to the 'experts' troubleshoot each other's problems.
Never be ashamed of your ignorance. NOBODY knows it all, not even these guys.
Which makes me feel just a little less so.
James
James H Phelan "Nihil est sine ratione cur potius sit quam non sit" Leibniz
Pito,
"Oy!" Exactly!
James H Phelan "Nihil est sine ratione cur potius sit quam non sit" Leibniz
Pito,
I'm all for a better mousetrap, but 'community support' is critical.
Although launch files can be (ARE) a nightmare, your colleagues will be familiar with them and can help.
But they won't be familiar with Better Launch so you'll be on your own when (not if) you run into problems.
There's hope that the greater ROS community will catch wind of Better Launch and start to incorporate the idea into the standard.
But as for myself, I'll seek safety in the herd.
James
James H Phelan "Nihil est sine ratione cur potius sit quam non sit" Leibniz
--
You received this message because you are subscribed to the Google Groups "HomeBrew Robotics Club" group.
To unsubscribe from this group and stop receiving emails from it, send an email to hbrobotics+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/67DC32A5-CE8D-41C0-A854-792C5DB6019F%40gmail.com.
*_driver.launch.py (the small per-robot include this file expects)? It can follow the same style and be ready to drop into each robot’s launch/ folder."To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/F7021555-7844-4828-87EC-7ACBF58950D4%40gmail.com.
Sergei,
Leave it to you to find the "right way" to do things!
I think we can all benefit from the resulting 'style sheet' for better exchange.
I'm going to put them with my other 'cheat sheets'.
James
James H Phelan "Nihil est sine ratione cur potius sit quam non sit" Leibniz
To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/CA%2BKVXVOb7bgaWBhWZTR-baLU9SNk3m5cDTqGFWezy4%3Dgbrs%2Biw%40mail.gmail.com.
On Nov 11, 2025, at 6:18 PM, camp . <ca...@camppeavy.com> wrote:
To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/34298782.7145121.1762913889382%40mail.yahoo.com.