# micro_ros_platformio
**Repository Path**: AlbertCoder163/micro_ros_platformio
## Basic Information
- **Project Name**: micro_ros_platformio
- **Description**: micro-ROS library for Platform.IO
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 13
- **Created**: 2024-05-29
- **Last Updated**: 2024-05-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README


# micro-ROS for PlatformIO
This is a micro-ROS library for bare metal projects based on platformIO.
The build process for ROS 2 and micro-ROS is based on custom meta-build system tools and [CMake](https://cmake.org/).
PlatformIO will handle the full build process, including dependencies, compilation and linkage.
- [micro-ROS for PlatformIO](#micro-ros-for-platformio)
- [Supported boards](#supported-boards)
- [Requirements](#requirements)
- [How to add to your project](#how-to-add-to-your-project)
- [Library configuration](#library-configuration)
- [ROS 2 distribution](#ros-2-distribution)
- [Transport configuration](#transport-configuration)
- [Extra packages](#extra-packages)
- [Other configuration](#other-configuration)
- [Extend library targets](#extend-library-targets)
- [Transport implementation](#transport-implementation)
- [Time source](#time-source)
- [Using the micro-ROS Agent](#using-the-micro-ros-agent)
- [Examples](#examples)
- [Purpose of the Project](#purpose-of-the-project)
- [License](#license)
- [Known Issues/Limitations](#known-issueslimitations)
## Supported boards
Supported boards are:
| Board | Platform | Framework | Transports | Default meta file |
| -------------------------------------------- | ------------- | ----------- | -------------------------------- | ------------------------ |
| `portenta_h7_m7` | `ststm32` | `arduino` | `serial`
`wifi` | `colcon.meta` |
| `teensy41` | `teensy` | `arduino` | `serial`
`native_ethernet` | `colcon.meta` |
| `teensy40` | `teensy` | `arduino` | `serial` | `colcon.meta` |
| `teensy36`
`teensy35`
`teensy31` | `teensy` | `arduino` | `serial` | `colcon_lowmem.meta` |
| `due` | `atmelsam` | `arduino` | `serial` | `colcon_verylowmem.meta` |
| `zero` | `atmelsam` | `arduino` | `serial` | `colcon_verylowmem.meta` |
| `olimex_e407` | `ststm32` | `arduino` | `serial` | `colcon.meta` |
| `esp32dev` | `espressif32` | `arduino` | `serial`
`wifi` | `colcon.meta` |
| `nanorp2040connect` | `raspberrypi` | `arduino` | `serial`
`wifi_nina` | `colcon_verylowmem.meta` |
| `pico` | `raspberrypi` | `arduino` | `serial` | `colcon.meta`|
The community is encouraged to open pull request with custom use cases.
## Requirements
- PlatformIO [local installation](https://docs.platformio.org/en/stable/core/installation.html) or [PlatformIO IDE for VSCode](https://platformio.org/install/ide?install=vscode)
- PlatformIO Core version 6.1.0 or greater
- PlatformIO needs `git`, `cmake` and `pip3` to handle micro-ROS internal dependencies:
```bash
apt install -y git cmake python3-pip
```
## How to add to your project
The library can be included as a regular git library dependence on your `platform.ini` file:
```ini
...
lib_deps =
https://github.com/micro-ROS/micro_ros_platformio
```
Now to proceed with the PlatformIO workflow:
```bash
pio lib install # Install dependencies
pio run # Build the firmware
pio run --target upload # Flash the firmware
```
After the library is compiled for first time the build process will be skipped, to trigger a library build and apply [library modifications](#library-configuration) on your next platformIO build:
```bash
pio run --target clean_microros # Clean library
```
## Library configuration
This section details the different configuration parameters available on the project `platform.ini` file.
A explanation for adding custom targets is also present
### ROS 2 distribution
The target ROS 2 distribution can be configured with the `board_microros_distro = `, supported values are:
- `humble` *(default value)*
- `galactic`
- `rolling`
- `foxy`
### Transport configuration
The transport can be configured with the `board_microros_transport = `, supported values and configurations are:
- `serial` *(default value)*
```c
Serial.begin(115200);
set_microros_serial_transports(Serial);
```
- `wifi`
- `wifi_nina`
```c
IPAddress agent_ip(192, 168, 1, 113);
size_t agent_port = 8888;
char ssid[] = "WIFI_SSID";
char psk[]= "WIFI_PSK";
set_microros_wifi_transports(ssid, psk, agent_ip, agent_port);
```
- `native_ethernet`
```c
byte local_mac[] = { 0xAA, 0xBB, 0xCC, 0xEE, 0xDD, 0xFF };
IPAddress local_ip(192, 168, 1, 177);
IPAddress agent_ip(192, 168, 1, 113);
size_t agent_port = 8888;
set_microros_native_ethernet_transports(local_mac, local_ip, agent_ip, agent_port);
```
- `custom`
The user will need to write transport functions in app code and provide it to the micro-ROS library using [`rmw_uros_set_custom_transport()` API](https://micro.ros.org/docs/tutorials/advanced/create_custom_transports/)
```c
bool platformio_transport_open(struct uxrCustomTransport * transport) {...};
bool platformio_transport_close(struct uxrCustomTransport * transport) {...};
size_t platformio_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err) {...};
size_t platformio_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err) {...};
rmw_uros_set_custom_transport(
MICROROS_TRANSPORTS_FRAMING_MODE, // Set the MICROROS_TRANSPORTS_FRAMING_MODE or MICROROS_TRANSPORTS_PACKET_MODE mode accordingly
NULL,
platformio_transport_open,
platformio_transport_close,
platformio_transport_write,
platformio_transport_read
);
```
### Extra packages
Colcon packages can be added to the build process using this two methods:
- Package directories copied on the `/extra_packages` folder.
- Git repositories included on the `/extra_packages/extra_packages.repos` yaml file.
This should be used for example when adding custom messages types or custom micro-ROS packages.
### Other configuration
Library packages can be configured with a customized meta file on the project main folder: `board_microros_user_meta = `.
This allows the user to customize the library memory resources or activate optional functionality such as multithreading, including configuration of user [Extra packages](#extra-packages).
- Documentation on available parameters can be found [here](https://micro.ros.org/docs/tutorials/advanced/microxrcedds_rmw_configuration) and [here]([microxrcedds_rmw_configuration](https://micro-xrce-dds.docs.eprosima.com/en/latest/client.html)).
- Default configurations can be found on the [metas](./metas) folder.
*Note: the [common.meta](./metas/common.meta) file makes general adjustments to the library and shall not be modified by the user.*
## Extend library targets
This library can be easily adapted to different boards, transports or RTOS, to achieve this the user shall provide:
### Transport implementation
New transport implementations shall follow the signatures shown on [micro_ros_platformio.h](./platform_code/arduino/micro_ros_platformio.h), the [provided sources](./platform_code) can be used as reference along [this documentation](https://micro-xrce-dds.docs.eprosima.com/en/latest/transport.html#custom-transport). Contributed transport source code shall be added on the `./platform_code//` path. Example:
- `platform.ini`:
```ini
framework = arduino
board_microros_transport = wifi
```
- Transport source files: [platform_code/arduino/wifi](https://github.com/micro-ROS/micro_ros_platformio/tree/main/platform_code/arduino/wifi)
- Also, a `MICRO_ROS_TRANSPORT__` definition will be available:
https://github.com/micro-ROS/micro_ros_platformio/blob/de7a61c7e86fdd0186ed8b7d8ec320994e8ebcbf/ci/src/main.cpp#L3
*Note: `board_microros_transport = custom` should not be used, as it is used to add custom transports on user app code*
### Time source
micro-ROS needs a time source to handle executor spins and synchronize reliable communication. To achieve this, a `clock_gettime` [POSIX compliant](https://linux.die.net/man/3/clock_gettime) implementation is required, with a minimum resolution of 1 millisecond.
This method shall be included on a `clock_gettime.cpp` source file under the `./platform_code//` path, an example implementation can be found on [clock_gettime.cpp](./platform_code/arduino/clock_gettime.cpp)
## Using the micro-ROS Agent
It is possible to use a **micro-ROS Agent** just by using this docker command:
```bash
# UDPv4 micro-ROS Agent
docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO udp4 --port 8888 -v6
# Serial micro-ROS Agent
docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO serial --dev [YOUR BOARD PORT] -v6
# TCPv4 micro-ROS Agent
docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO tcp4 --port 8888 -v6
# CAN-FD micro-ROS Agent
docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO canfd --dev [YOUR CAN INTERFACE] -v6
```
For the supported transports, only the `serial` and `udp4` versions shall be used, although users can develop
and use the agent to test their own `tcp4` and `canfd` custom transports.
It is also possible to use custom transports on a `micro-XRCE Agent` instance. More info available [here](https://micro-xrce-dds.docs.eprosima.com/en/latest/agent.html#custom-transport-agent).
## Examples
A simple publisher project using serial transport is available on the [examples](./examples) directory, this examples is meant to be modified with the user board.
- More micro-ROS usage examples are available on [micro-ROS-demos/rclc](https://github.com/micro-ROS/micro-ROS-demos/tree/galactic/rclc).
- For a complete micro-ROS tutorial, check [Programming with rcl and rclc](https://micro.ros.org/docs/tutorials/programming_rcl_rclc/overview/) documentation.
## Purpose of the Project
This software is not ready for production use. It has neither been developed nor
tested for a specific use case. However, the license conditions of the
applicable Open Source licenses allow you to adapt the software to your needs.
Before using it in a safety relevant setting, make sure that the software
fulfills your requirements and adjust it according to any applicable safety
standards, e.g., ISO 26262.
## License
This repository is open-sourced under the Apache-2.0 license. See the [LICENSE](LICENSE) file for details.
For a list of other open-source components included in this repository,
see the file [3rd-party-licenses.txt](3rd-party-licenses.txt).
## Known Issues/Limitations
- For `wifi_nina` transport, the following versioning shall be used:
```ini
lib_deps =
arduino-libraries/WiFiNINA@^1.8.13
```
- For `nanorp2040connect` board with `serial` transport, the library dependency finder shall be set to `chain+`:
```ini
lib_ldf_mode = chain+
```
- For `pico` board with `serial` transport, the library dependency finder shall be set to `chain+`:
```ini
lib_ldf_mode = chain+
```