Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string.h>
- #include <stdio.h>
- #include <unistd.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "esp_log.h"
- #include "esp_system.h"
- #include <uros_network_interfaces.h>
- #include <rcl/rcl.h>
- #include <rcl/error_handling.h>
- #include <std_msgs/msg/string.h> // Assuming the message type is String
- #include <rclc/rclc.h>
- #include <rclc/executor.h>
- #ifdef CONFIG_MICRO_ROS_ESP_XRCE_DDS_MIDDLEWARE
- #include <rmw_microros/rmw_microros.h>
- #endif
- #define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){printf("Failed status on line %d: %d. Aborting.\n",__LINE__,(int)temp_rc);vTaskDelete(NULL);}}
- #define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){printf("Failed status on line %d: %d. Continuing.\n",__LINE__,(int)temp_rc);}}
- rcl_subscription_t subscriber;
- std_msgs__msg__String recv_msg;
- rcl_publisher_t publisher;
- std_msgs__msg__String send_msg;
- void subscription_callback(const void * msgin)
- {
- const std_msgs__msg__String * msg = (const std_msgs__msg__String *)msgin;
- printf("Received: %s\n", msg->data.data);
- // Publish the received msg from subs on another topic
- RCSOFTCHECK(rcl_publish(&publisher, msg, NULL));
- printf("Published: %s\n", msg->data.data);
- }
- void micro_ros_task(void * arg)
- {
- rcl_allocator_t allocator = rcl_get_default_allocator();
- rclc_support_t support;
- // Create init_options.
- rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
- RCCHECK(rcl_init_options_init(&init_options, allocator));
- #ifdef CONFIG_MICRO_ROS_ESP_XRCE_DDS_MIDDLEWARE
- rmw_init_options_t* rmw_options = rcl_init_options_get_rmw_init_options(&init_options);
- // Static Agent IP and port can be used instead of autodisvery.
- RCCHECK(rmw_uros_options_set_udp_address(CONFIG_MICRO_ROS_AGENT_IP, CONFIG_MICRO_ROS_AGENT_PORT, rmw_options));
- //RCCHECK(rmw_uros_discover_agent(rmw_options));
- #endif
- // Setup support structure.
- RCCHECK(rclc_support_init_with_options(&support, 0, NULL, &init_options, &allocator));
- // Create node.
- rcl_node_t node = rcl_get_zero_initialized_node();
- RCCHECK(rclc_node_init_default(&node, "string_subscriber_publisher_rclc", "", &support));
- // Create subscriber.
- RCCHECK(rclc_subscription_init_default(
- &subscriber,
- &node,
- ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, String),
- "chatter"));
- // Create publisher.
- RCCHECK(rclc_publisher_init_default(
- &publisher,
- &node,
- ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, String),
- "published_chatter"));
- // Create executor.
- rclc_executor_t executor = rclc_executor_get_zero_initialized_executor();
- RCCHECK(rclc_executor_init(&executor, &support.context, 1, &allocator));
- unsigned int rcl_wait_timeout = 1000; // in ms
- RCCHECK(rclc_executor_set_timeout(&executor, RCL_MS_TO_NS(rcl_wait_timeout)));
- // Add subscriber to executor.
- RCCHECK(rclc_executor_add_subscription(&executor, &subscriber, &recv_msg, &subscription_callback, ON_NEW_DATA));
- // Spin forever.
- while(1){
- rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
- usleep(100000);
- }
- // Free resources.
- RCCHECK(rcl_subscription_fini(&subscriber, &node));
- RCCHECK(rcl_publisher_fini(&publisher, &node));
- RCCHECK(rcl_node_fini(&node));
- vTaskDelete(NULL);
- }
- void app_main(void)
- {
- #if defined(CONFIG_MICRO_ROS_ESP_NETIF_WLAN) || defined(CONFIG_MICRO_ROS_ESP_NETIF_ENET)
- ESP_ERROR_CHECK(uros_network_interface_initialize());
- #endif
- //pin micro-ros task in APP_CPU to make PRO_CPU to deal with wifi:
- xTaskCreate(micro_ros_task,
- "uros_task",
- CONFIG_MICRO_ROS_APP_STACK,
- NULL,
- CONFIG_MICRO_ROS_APP_TASK_PRIO,
- NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment