How to Name Everything
Package naming
Open Robotics (ROS developers) maintains a set of standards called REPs (Robotics Enhancement Proposals), defining many of the conventions that make the ROS ecosystem consistent and usable at scale.
REP-144
There is a standard for package naming in REP-144, please refer to it for more details.
In short REP-144 defines ROS package naming rules to maintain a flat, global OS-level namespace that remains readable and collision-free as the ecosystem grows:
Required rules:
- Use only lowercase letters (a-z), digits (0-9), and single underscores
- Start with a letter
- Avoid consecutive underscores
- Minimum 2 characters (recommend longer for clarity)
Recommended guidelines:
- Choose specific, descriptive names (avoid vague terms like
utils) - Don't include
rosin the name unless it's a core package or upstream binding (e.g.,opencv3_ros) - Check that the name isn't already taken
- Prefer prefixes when specialized for a project, hardware, robot, or organization (these can be dropped later if the package becomes canonical)
Common suffixes:
*_driver– hardware drivers*_msgs– message/service/action definitions*_<library>_plugins– plugins for a specific library*_description– URDF and mesh files*_bringup– robot startup launch files*_launch– general launch file collections*_tests– test-only packages*_tutorials– tutorial content*_demos– demonstration packages
Repository naming
While REP-144 governs package names strictly (used in package.xml), repository names have more flexibility since they're Git metadata rather than OS-level identifiers.
- Repository names can use hyphens (
wavefront-planner) for better readability on GitHub/GitLab - Repositories may contain multiple packages, so a 1:1 name match isn't always possible.
Best Practices
- Repository names can match package names when you have a 1:1 relationship (one package per repo), but it's not mandatory.
- Use project/organization prefixes to avoid ambiguity:
- Example: Generic names like
mission_coreappear global (all-company repository) and can cause confusion; instead useiroc_mission_coreto clearly indicate it's a project-specific repository.
- Example: Generic names like