diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a34a0812..0752690e 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,51 +2,44 @@ name: CI on: pull_request: + push: branches: - - '**' + - humble + - jazzy + - kilted + - rolling + workflow_call: + inputs: + branch: + description: 'Branch to checkout' + required: false + type: string + default: 'rolling' + workflow_dispatch: jobs: - micro_ros_idf: runs-on: ubuntu-latest strategy: fail-fast: false matrix: - idf_target: [ esp32, esp32s2, esp32s3, esp32c3, esp32c6] - idf_version: [ "espressif/idf:release-v5.2" ] - exclude: - # Skip IDF v4 + ESP32C6 combination - - idf_target: esp32c6 - idf_version: espressif/idf:release-v4.4 + idf_target: [esp32, esp32s2, esp32s3, esp32c3, esp32c6] + idf_version: [v5.2, v5.3, v5.4, v5.5] container: - image: ${{ matrix.idf_version }} + image: 'espressif/idf:release-${{ matrix.idf_version }}' steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 with: path: micro_ros_espidf_component + ref: ${{ inputs.branch || github.ref }} - name: Dependencies shell: bash - run: | - apt update - export DEBIAN_FRONTEND=noninteractive - apt install -y git python3-pip - . $IDF_PATH/export.sh - pip3 install catkin_pkg lark-parser colcon-common-extensions - # This line avoids the error when using Python < 3.7 https://importlib-resources.readthedocs.io/en/latest/ - pip3 install importlib-resources - # this installs the modules also for global python interpreter, needed for IDF v5 - /usr/bin/pip3 install catkin_pkg lark-parser colcon-common-extensions importlib-resources - - # This line can be removed when https://github.com/colcon/colcon-python-setup-py/issues/56 is solved - - name: Patch setuptools - shell: bash - if: matrix.idf_version == 'espressif/idf:release-v4.4' run: | . $IDF_PATH/export.sh - pip3 install setuptools==68.1.2 + pip install catkin_pkg colcon-common-extensions lark - name: Build sample - int32_publisher shell: bash @@ -86,7 +79,7 @@ jobs: - name: Build sample - int32_publisher_custom_transport_usbcdc shell: bash - if: (matrix.idf_target == 'esp32s2' || matrix.idf_target == 'esp32s3') && matrix.idf_version == 'espressif/idf:release-v5.2' + if: matrix.idf_target == 'esp32s2' || matrix.idf_target == 'esp32s3' run: | . $IDF_PATH/export.sh cd micro_ros_espidf_component/examples/int32_publisher_custom_transport_usbcdc diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 5763476d..129bf167 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -1,117 +1,16 @@ name: Nightly on: - workflow_dispatch: - inputs: - name: - description: "Manual trigger" schedule: - - cron: '0 4 * * *' + - cron: '0 4 * * *' + workflow_dispatch: jobs: micro_ros_idf: - runs-on: ubuntu-latest strategy: fail-fast: false matrix: - branch: [rolling, jazzy, humble] - idf_target: [ esp32, esp32s2, esp32c3, esp32s3, esp32c6] - idf_version: [ "espressif/idf:release-v4.4", "espressif/idf:release-v5.2" ] - exclude: - # Skip IDF v4 + ESP32C6 combination - - idf_target: esp32c6 - idf_version: espressif/idf:release-v4.4 - # Skip IDF v4 for rolling and kilted - - branch: rolling - idf_version: espressif/idf:release-v4.4 - - branch: kilted - idf_version: espressif/idf:release-v4.4 - - - container: - image: ${{ matrix.idf_version }} - - steps: - - uses: actions/checkout@v2 - with: - path: micro_ros_espidf_component - ref: ${{ matrix.branch }} - - - name: Dependencies - shell: bash - run: | - apt update - export DEBIAN_FRONTEND=noninteractive - apt install -y git python3-pip - . $IDF_PATH/export.sh - pip3 install catkin_pkg lark-parser empy==3.3.4 colcon-common-extensions - # This line avoids the error when using Python < 3.7 https://importlib-resources.readthedocs.io/en/latest/ - pip3 install importlib-resources - # this installs the modules also for global python interpreter, needed for IDF v5 - /usr/bin/pip3 install catkin_pkg lark-parser empy==3.3.4 colcon-common-extensions importlib-resources - - # This line can be removed when https://github.com/colcon/colcon-python-setup-py/issues/56 is solved - - name: Patch setuptools - shell: bash - if: matrix.idf_version == 'espressif/idf:release-v4.4' - run: | - . $IDF_PATH/export.sh - pip3 install setuptools==68.1.2 - - - name: Build sample - int32_publisher - shell: bash - run: | - . $IDF_PATH/export.sh - cd micro_ros_espidf_component/examples/int32_publisher - idf.py set-target ${{ matrix.idf_target }} - idf.py build - - - name: Build sample - low_consumption - shell: bash - if: matrix.idf_target != 'esp32c3' && matrix.idf_target != 'esp32s3' && matrix.idf_target != 'esp32c6' - run: | - . $IDF_PATH/export.sh - cd micro_ros_espidf_component/examples/low_consumption - idf.py set-target ${{ matrix.idf_target }} - idf.py build - - - name: Build sample - handle_static_types - shell: bash - run: | - . $IDF_PATH/export.sh - cd micro_ros_espidf_component/examples/handle_static_types - idf.py set-target ${{ matrix.idf_target }} - idf.py build - - - name: Build sample - int32_publisher_custom_transport - shell: bash - run: | - . $IDF_PATH/export.sh - cd micro_ros_espidf_component - make -f libmicroros.mk clean - sed -i 's/DRMW_UXRCE_TRANSPORT=udp/DRMW_UXRCE_TRANSPORT=custom/' colcon.meta - cd examples/int32_publisher_custom_transport - idf.py set-target ${{ matrix.idf_target }} - idf.py build - - - name: Build sample - multithread_publisher - shell: bash - run: | - . $IDF_PATH/export.sh - cd micro_ros_espidf_component - make -f libmicroros.mk clean - sed -i 's/DRMW_UXRCE_TRANSPORT=udp/DRMW_UXRCE_TRANSPORT=custom/' colcon.meta - cd examples/multithread_publisher - idf.py set-target ${{ matrix.idf_target }} - idf.py build - - - name: EmbeddedRTPS - if: ${{ matrix.branch == 'humble' }} - shell: bash - run: | - . $IDF_PATH/export.sh - cd micro_ros_espidf_component - make -f libmicroros.mk clean - cd examples/int32_publisher_embeddedrtps - idf.py set-target ${{ matrix.idf_target }} - idf.py build + branch: [humble, jazzy, kilted, rolling] + uses: ./.github/workflows/ci.yml + with: + branch: ${{ matrix.branch }} diff --git a/README.md b/README.md index c91fb890..8e53dafa 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,7 @@ # micro-ROS component for ESP-IDF -This component has been tested in ESP-IDF v5.2 with ESP32, ESP32-S2, ESP32-S3, ESP32-C3 and ESP32-C6. - -_Note: ESP-IDF v4.4 is supported only in ROS 2 Humble and Jazzy due to Python version incompatibilities._ +This component has been tested in ESP-IDF v5.2, v5.3, and v5.4 with ESP32, ESP32-S2, ESP32-S3, ESP32-C3 and ESP32-C6. ## Dependencies @@ -13,16 +11,18 @@ This component needs `colcon` and other Python 3 packages inside the IDF virtual ```bash . $IDF_PATH/export.sh -pip3 install catkin_pkg lark-parser colcon-common-extensions +pip3 install catkin_pkg colcon-common-extensions lark ``` ## Middlewares available This package support the usage of micro-ROS on top of two different middlewares: + - [eProsima Micro XRCE-DDS](https://micro-xrce-dds.docs.eprosima.com/en/latest/): the default micro-ROS middleware. - [embeddedRTPS](https://github.com/embedded-software-laboratory/embeddedRTPS): an experimental implementation of a RTPS middleware compatible with ROS 2. In order to select it, use `idf.py menuconfig` and go to `micro-ROS Settings > micro-ROS middleware` + ## Usage You can clone this repo directly in the `components` folder of your project. @@ -36,7 +36,7 @@ In order to test a int32_publisher example: ```bash . $IDF_PATH/export.sh cd examples/int32_publisher -# Set target board [esp32|esp32s2|esp32s3|esp32c3] +# Set target board [esp32|esp32s2|esp32s3|esp32c3|esp32c6] idf.py set-target esp32 idf.py menuconfig # Set your micro-ROS configuration and WiFi credentials under micro-ROS Settings @@ -63,19 +63,16 @@ docker run -it --rm --net=host microros/micro-ros-agent:rolling udp4 --port 8888 It's possible to build this example application using the official Espressif [docker images](https://hub.docker.com/r/espressif/idf), following the same steps: ```bash -docker pull espressif/idf:release-v5.2 -# Run ESP-IDF container -docker run --name micro-ros-espidf-component-test -it espressif/idf:release-v5.2 bash +docker run --name micro-ros-espidf-component -it espressif/idf:release-v5.4 bash -git clone https://github.com/micro-ROS/micro_ros_espidf_component.git +git clone -b rolling https://github.com/micro-ROS/micro_ros_espidf_component.git cd micro_ros_espidf_component/ # Install dependencies -pip3 install catkin_pkg lark-parser colcon-common-extensions +pip install catkin_pkg colcon-common-extensions lark -$IDF_PATH/export.sh cd examples/int32_publisher -# Set target board [esp32|esp32s2|esp32s3|esp32c3] +# Set target board [esp32|esp32s2|esp32s3|esp32c3|esp32c6] idf.py set-target esp32 idf.py menuconfig # Set your micro-ROS configuration and WiFi credentials under micro-ROS Settings diff --git a/libmicroros.mk b/libmicroros.mk index 47f94faf..7a43a9a3 100644 --- a/libmicroros.mk +++ b/libmicroros.mk @@ -60,6 +60,9 @@ $(EXTENSIONS_DIR)/micro_ros_src/src: git clone -b ros2 https://github.com/eProsima/micro-CDR src/micro-CDR; \ git clone -b rolling https://github.com/micro-ROS/rcl src/rcl; \ git clone -b rolling https://github.com/ros2/rclc src/rclc; \ + cd src/rclc; \ + git reset --hard 2283a6d76c3f41a964d03610a3305166d8c2caaa; \ + cd ../..; \ git clone -b rolling https://github.com/micro-ROS/rcutils src/rcutils; \ git clone -b rolling https://github.com/micro-ROS/micro_ros_msgs src/micro_ros_msgs; \ git clone -b rolling https://github.com/micro-ROS/rosidl_typesupport src/rosidl_typesupport; \ @@ -78,10 +81,10 @@ $(EXTENSIONS_DIR)/micro_ros_src/src: git clone -b rolling https://github.com/ros2/ros2_tracing src/ros2_tracing; \ git clone -b rolling https://github.com/micro-ROS/micro_ros_utilities src/micro_ros_utilities; \ git clone -b rolling https://github.com/ros2/rosidl_core src/rosidl_core; \ - touch src/rosidl/rosidl_typesupport_introspection_cpp/COLCON_IGNORE; \ - touch src/rcl_logging/rcl_logging_log4cxx/COLCON_IGNORE; \ - touch src/rcl_logging/rcl_logging_spdlog/COLCON_IGNORE; \ - touch src/rclc/rclc_examples/COLCON_IGNORE; \ + touch src/rosidl/rosidl_typesupport_introspection_cpp/COLCON_IGNORE; \ + touch src/rcl_logging/rcl_logging_implementation/COLCON_IGNORE; \ + touch src/rcl_logging/rcl_logging_spdlog/COLCON_IGNORE; \ + touch src/rclc/rclc_examples/COLCON_IGNORE; \ touch src/rcl/rcl_yaml_param_parser/COLCON_IGNORE; \ touch src/ros2_tracing/test_tracetools/COLCON_IGNORE; \ touch src/ros2_tracing/lttngpy/COLCON_IGNORE; \ @@ -113,7 +116,7 @@ $(EXTENSIONS_DIR)/micro_ros_src/install: $(EXTENSIONS_DIR)/esp32_toolchain.cmake patch_atomic:$(EXTENSIONS_DIR)/micro_ros_src/install # Workaround https://github.com/micro-ROS/micro_ros_espidf_component/issues/18 -ifeq ($(IDF_TARGET),$(filter $(IDF_TARGET),esp32s2 esp32c3 esp32c6)) +ifeq ($(IDF_TARGET),$(filter $(IDF_TARGET),esp32 esp32s2 esp32s3 esp32c3 esp32c6)) echo $(UROS_DIR)/atomic_workaround; \ mkdir $(UROS_DIR)/atomic_workaround; cd $(UROS_DIR)/atomic_workaround; \ $(X_AR) x $(UROS_DIR)/install/lib/librcutils.a; \ diff --git a/network_interfaces/uros_ethernet_netif.c b/network_interfaces/uros_ethernet_netif.c index cabed309..8e45971c 100644 --- a/network_interfaces/uros_ethernet_netif.c +++ b/network_interfaces/uros_ethernet_netif.c @@ -74,20 +74,31 @@ esp_err_t uros_network_interface_initialize(void) ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_config_t cfg = ESP_NETIF_DEFAULT_ETH(); esp_netif_t *eth_netif = esp_netif_new(&cfg); - // Set default handlers to process TCP/IP stuffs + // Set default handlers to process TCP/IP stuffs (removed in ESP-IDF 5.5+) +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0) ESP_ERROR_CHECK(esp_eth_set_default_handlers(eth_netif)); +#endif // Register user defined event handers ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, ð_event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, NULL)); eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG(); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) + eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG(); +#endif eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG(); phy_config.phy_addr = CONFIG_MICRO_ROS_ETH_PHY_ADDR; phy_config.reset_gpio_num = CONFIG_MICRO_ROS_ETH_PHY_RST_GPIO; #if CONFIG_MICRO_ROS_USE_INTERNAL_ETHERNET +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0) mac_config.smi_mdc_gpio_num = CONFIG_MICRO_ROS_ETH_MDC_GPIO; mac_config.smi_mdio_gpio_num = CONFIG_MICRO_ROS_ETH_MDIO_GPIO; esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config); +#else + esp32_emac_config.smi_gpio.mdc_num = CONFIG_MICRO_ROS_ETH_MDC_GPIO; + esp32_emac_config.smi_gpio.mdio_num = CONFIG_MICRO_ROS_ETH_MDIO_GPIO; + esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&esp32_emac_config, &mac_config); +#endif #if CONFIG_MICRO_ROS_ETH_PHY_IP101 esp_eth_phy_t *phy = esp_eth_phy_new_ip101(&phy_config); #elif CONFIG_MICRO_ROS_ETH_PHY_RTL8201 @@ -161,4 +172,4 @@ esp_err_t uros_network_interface_initialize(void) return ESP_OK; } -#endif \ No newline at end of file +#endif