# Creating a new package

## Naming

In order to create a new ROS package for one of the repositories some rules need to be considered:

1. The package name has always the following format:

   ```
    prefix_my_package_name
   ```
2. Use the right prefix for every repository: a. `mas_domestic_robotics`: `mdr_` b. `mas_industrial_robotics`: `mir_` c. `mas_common_robotics`: `mcr_`
3. Use lowercase.
4. Separate words in the package name by underscores ( \_ ).

Examples for creating packages according to the above described rules are as follows:

```
catkin create_pkg mdr_grasp_planning
catkin create_pkg mir_whole_body_control
catkin create_pkg mcr_object_detection
```

## Folder structure

Every ROS package within our repositories has to strictly match the following structure:

```
.
├── common
│   ├── config
│   ├── include
│   │   └── <package_name>
│   ├── src
│   │   └── <package_name>
│   ├── test
│   └── tools
├── ros
│   ├── config
│   ├── include
│   │   └── <package_name>
│   ├── launch
│   │   |— <package_name>.launch
│   ├── rviz
│   │   |— <package_name>.rviz
│   ├── scripts
│   │   └── <package_name>
│   ├── src
│   │   └── <package_name>_node
│   ├── test
│   └── tools
├── CMakeLists.txt
├── package.xml
├── setup.py
└── README.md
```

In short:

* ROS-independent code goes into the `common` folder
* the `ros` folder contains a ROS-wrapper for the functionality you are adding

### Meta-packages

If the package you are creating is meant to contain other packages inside of it, it needs to have instead the following structure:

```
./<meta_package_name>
└── <meta_package_name>
    ├── CMakeLists.txt
    ├── package.xml
    └── README.md
```

## Adding the dependencies to the `package.xml`

It is **extremely** important to maintain your `package.xml` up to date with its dependencies. Not doing so results in the need of specialized tools or manual inspection of launch files and source code to discover your package dependencies.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://b-it-bots.gitbook.io/wiki/home/_conventions/ros/package-name-and-structure.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
