
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.
I'm NOT writing a book. Just documenting my journey so I can know what I did the last time I had this problem.
James H Phelan "Nihil est sine ratione cur potius sit quam non sit" Leibniz
I didn't know you and Sergei were collaborating on a ROS book.
I you guys can agree on the Right Way to do ROS, I'm willing to pay money for that book!
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/8fbd6569-46bc-409a-8bf1-0ad3424bcb6a%40hal-pc.org.
I didn't know you and Sergei were collaborating on a ROS book.
I you guys can agree on the Right Way to do ROS, I'm willing to pay money for that book!
On Nov 18, 2025, at 11:31 PM, Thomas Messerschmidt <thomas...@gmail.com> wrote:
When I catch up to things, I’m gonna write a real, real, real, simple book on ROS2 and artificial intelligence that even a 12 year old could follow.
To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/268DC4E2-0745-4BF9-BB74-68FC638AAFEC%40gmail.com.
To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/723DFBF8-C1A9-4F84-95E1-2A510F31B009%40gmail.com.
To view this discussion visit https://groups.google.com/d/msgid/hbrobotics/179651985.687074.1763657854533%40connect.xfinity.com.
That's why it would have to be an on-line wiki kind of boot.
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/CAG61pbdK2QemwnWK-nL%2BTJJu2CGp0X7GwdecOxEiij72-%2Be9Eg%40mail.gmail.com.
Get an AI to re-write it for ROS2?
I'll ask the author if we (or he if he's so inclined) can try the AI update.
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/2018983949.10157536.1763598605706%40mail.yahoo.com.
On Wed, 19 Nov 2025 at 11:42, 'James H Phelan' via HomeBrew Robotics Club <hbrob...@googlegroups.com> wrote:I didn't know you and Sergei were collaborating on a ROS book.
I you guys can agree on the Right Way to do ROS, I'm willing to pay money for that book!
Robotics, and ROSn in particular, is 'not a destination, it's a journey'.
[@#$%& what a journey! "We do these things, not..."]
Agree? A half-assed middle of the road compromise? Hell no.
Instead, a path from moonshine to Iron Dram*.
A vision from 'Good enough is good enough' to 'Perfection is only the beginning'.
A road from shack to skyscraper.
"First, make it work".
How to organize a workspace from the beginning with the idea that your first will not be your last robot.
A launch file with just enough for a Level I Tablebot Challenge but which anticipates a future Jawas' junkyard of your creations playing together.
"Then make it better."
Safety first. Too often only considered 'by accident'. Prioritize. First, don't fall off the table. Range Safety Officer remote kill switch. Heartbeats. E-stop watchdogs. System monitoring to rival the autonomic nervous system.
Self-testing. Mentioned, then skipped, in most launch file tutorials. What's a test node? A 'smoke test'? How do you make one? Why would you want/need one in a simple Tablebot? How to expand with your robot's abilities?
ROS3? Who's in charge here? Not our job, but I'm confident our members could. But we could certainly influence the next generation by our considered analysis. We could ask Chat-N.n how it would do it....
"Be careful what you ask for, you may get it."
Well, I did and here is its answer:
My prompt: You're a robotics expert, well versed in the latest Ubuntu OS (current LTS is jazzy) and ROS / ROS2 the Robot Operating System. You're aware of the changes from ROS to ROS2 and what a marvelous but frustrating mess ROS2 is. Understanding both the improvements and pitfalls of ROS2 give me an outline of how you would improve ROS3?
https://poe.com/s/449kIxgzmoGBiTs0Gt34
I also asked, this time Claude-Sonnet-4.5, to re-write Jason O'Kane's A Gentle Introduction to ROS for ROS2:
I received permission from the author of this book "A Gentle Introduction to ROS" to try to use AI to update it from ROS-1 to ROS-2. Attached in .pdf format is Chapter 3 where it starts to get into the meat of it. Re-write this chapter to be up to date with ROS2 jazzy. If it works out, we can take on more. Its original author, as well as you, will be given full credit. Are you game? Please output in PLAIN TEXT. No Markdown formatting for easy copy/paste to other formats.
Here is the result for Chapter 3:
https://poe.com/s/7muDPQ3BcFKLdAL7nbxX
* Iron Dram
Me: Come up with a name for a single malt scotch that evokes robotics.
GPT-4o "Iron Dram"
This name combines the metallic, futuristic feel of robotics
with the traditional term for a serving of Scotch whisky,
evoking a blend of craftsmanship, precision, and innovation."
[HBRC Private Label? I may have a talk with my local Old Humble Distillery.]
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/8C8F91AE-C7F8-488F-9B56-C44F86540BB3%40gmail.com.