小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
stm32f103vet6移植uart版本的agent,连接成后,但是agent无法受到话题数据
-
如图,我已经通过指令:ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyUSB0 连接上我的扳子,从info来看,扳子也回馈了将要上报的话题,这从第二个图片显示可以看到官方话题mx,已经出现了:
可是,同样的代码中上报的data,无法topic echo出来,实在是太奇怪了:
“
msg.data = 0;for(;;) { rcl_ret_t ret = rcl_publish(&publisher, &msg, NULL); if (ret != RCL_RET_OK) { printf("Error publishing (line %d)\n", __LINE__); } msg.data++; osDelay(10); }
”
-
你遇到的问题可能涉及到多个方面,包括微控制器(STM32F103VET6)上的Micro-ROS Agent配置、数据发布逻辑、以及ROS 2系统的整体配置。以下是一些可能的解决步骤和检查点:
-
检查UART连接:
确保STM32F103VET6与PC之间的UART连接是正确的,并且波特率、数据位、停止位和奇偶校验位等参数与micro_ros_agent
的配置相匹配。在你的命令中,你已经指定了波特率为115200,请确认MCU上的设置也相同。 -
检查ROS 2 Agent的日志:
运行micro_ros_agent
时,它会输出一些日志信息。请检查这些日志中是否有任何错误或警告,特别是与连接或数据处理相关的。 -
检查数据发布逻辑:
你的发布逻辑看起来基本正确,但请确保rcl_publish
函数被正确调用,并且没有因为资源限制(如内存不足)而失败。此外,请检查msg
和publisher
的初始化是否正确,确保它们在发布之前已经被正确配置。 -
查看ROS 2的订阅者:
使用ros2 topic list
查看所有当前活动的主题,确认你的主题(如mx
)确实存在。然后,尝试使用ros2 topic echo /mx
来订阅并查看发布的数据。如果这里看不到任何数据,可能是数据没有正确发送到ROS 2网络中。 -
检查Micro-ROS客户端的初始化:
确保你的Micro-ROS客户端(即STM32F103VET6上的代码)已经正确初始化了所有必要的组件,包括节点、发布者和消息类型。初始化过程中可能包括设置节点名称、创建发布者和订阅者等。 -
检查RTOS的调度:
由于你使用了osDelay(10);
,请确保RTOS的调度器能够正常工作,并且没有因为资源争用或优先级问题而导致任务被阻塞。此外,检查osDelay
的单位(通常是毫秒),确保它不会导致发布频率过低。 -
查看MCU的资源使用情况:
如果MCU的资源(如CPU、内存)接近极限,可能会影响ROS 2节点的性能。使用调试工具(如J-Link、ST-Link等)来检查MCU的资源使用情况。 -
更新和同步软件库:
确保你使用的Micro-ROS和ROS 2库是最新版本,并且彼此兼容。有时候,软件库中的bug或不兼容问题可能会导致意外的行为。 -
查看示例和文档:
参考Micro-ROS的官方示例和文档,看看是否有类似的问题被提及,并了解如何解决它们。 -
社区和论坛:
如果上述步骤都不能解决问题,考虑在Micro-ROS的GitHub仓库、ROS 2论坛或相关社区中寻求帮助。
希望这些步骤能帮助你解决问题!如果还有其他具体的问题或错误消息,请提供更多信息以便进一步分析。
以上为生成回答,仅供参考~
-
-
补充信息:
node list 无法检测到上报的节点。 -
补充agent运行日志,似乎data在日志内显示为空:
以下是我的完整代码:void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ // micro-ROS configuration rmw_uros_set_custom_transport( true, (void *) &huart3, cubemx_transport_open, cubemx_transport_close, cubemx_transport_write, cubemx_transport_read); rcl_allocator_t freeRTOS_allocator = rcutils_get_zero_initialized_allocator(); freeRTOS_allocator.allocate = microros_allocate; freeRTOS_allocator.deallocate = microros_deallocate; freeRTOS_allocator.reallocate = microros_reallocate; freeRTOS_allocator.zero_allocate = microros_zero_allocate; if (!rcutils_set_default_allocator(&freeRTOS_allocator)) { printf("Error on default allocators (line %d)\n", __LINE__); } // micro-ROS app rcl_publisher_t publisher; std_msgs__msg__Int32 msg; rclc_support_t support; rcl_allocator_t allocator; rcl_node_t node; allocator = rcl_get_default_allocator(); //create init_options rclc_support_init(&support, 0, NULL, &allocator); // create node // rclc_node_init_default(&node, "zzz", "", &support); rclc_node_init_default(&node, "cubemx_node", "", &support); // create publisher rclc_publisher_init_default( &publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32), "cubemx_publisher"); msg.data = 0; for(;;) { rcl_ret_t ret = rcl_publish(&publisher, &msg, NULL); if (ret != RCL_RET_OK) { printf("Error publishing (line %d)\n", __LINE__); } msg.data++; osDelay(10); } /* USER CODE END StartDefaultTask */ }
-
@剑心 这个发布频率太高了吧
-
总结:
1.启动agent查看日志,并对照stm32的上发数据,可以知道串口能联通,数据也没问题:```
ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyUSB0 -v62.使用ros2 topic list,可以看到话题/cubemx_publisher 问题: 1.ros2 topic echo /cubemx_publisher无法显示出可以在ros2 topic echo /cubemx_publisher已经看到了的32上报的数据 2.使用ros2 node list无法显示已经启动的节点micro_ros_agent ,和32上上报数据的节点。
-
@小鱼 已经调整为1秒一次了,目前问题没有解决