第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现
-
问题:micro_ros_agent无法与微控制器通信,查询节点也没有出现节点
代码如下:#include <Arduino.h> #include <Esp32PcntEncoder.h> #include <Esp32McpwmMotor.h> // 导入电机驱动库 #include <PidController.h> // 包含 PID 控制器库,用于实现 PID 控制 #include <Kinematics.h> // 包含运动学库,用于计算运动轨迹 #include <micro_ros_platformio.h> // 包含用于 ESP32 的 micro-ROS PlatformIO 库 #include <WiFi.h> // 包含 ESP32 的 WiFi 库 #include <rcl/rcl.h> // 包含 ROS 客户端库 (RCL) #include <rclc/rclc.h> // 包含用于 C 的 ROS 客户端库 (RCLC) #include <rclc/executor.h> // 包含 RCLC 执行程序库,用于执行订阅和发布消息 Esp32McpwmMotor motor; Esp32PcntEncoder encoders[2]; // 创建一个数组用于存储两个编码器 PidController pid_controller[2]; // 创建PidController的两个对象,用于控制两个电机的速度 Kinematics kinematics; // 创建一个Kinematics对象,用于计算运动轨迹 float target_linear_speed = 50.0; // 设置目标直线速度为50mm/s float target_angular_speed = 0.1f; // 设置目标角速度为0.1rad/s float out_left_speed; // 用于存储左电机速度 float out_right_speed; // 用于存储右电机速度 rclc_executor_t executor; rclc_support_t support; rcl_allocator_t allocator; rcl_node_t node; void micro_ros_task(void *parameter){ IPAddress agent_ip; agent_ip.fromString("192.168.43.66"); // 设置代理IP地址 set_microros_wifi_transports("HONOR 9X", "123456789", agent_ip, 8888); // 设置WiFi传输和代理IP地址和端口 delay(2000); allocator = rcl_get_default_allocator(); rclc_support_init(&support, 0, NULL, &allocator); // 初始化ROS支持 rclc_node_init_default(&node, "fishbot_motion_control", "", &support); // 初始化ROS节点 unsigned int num_handles = 0; // 用于存储句柄数量 rclc_executor_init(&executor, &support.context, num_handles, &allocator); // 初始化执行程序 rclc_executor_spin(&executor); // 开始执行程序 } void setup() { // 1.初始化串口 Serial.begin(115200); // 初始化串口通信,设置通信速率为115200 // 2.设置编码器 encoders[0].init(0, 32, 33); // 初始化第一个编码器,使用GPIO 32和33连接 encoders[1].init(1, 26, 25); // 初始化第二个编码器,使用GPIO 26和25连接 motor.attachMotor(0, 22, 23); // 连接电机到MCPWM 0通道,使用GPIO 12和13连接 motor.attachMotor(1, 12, 13); // 连接电机到MCPWM 1通道,使用GPIO 27和36连接 // 3.设置PID控制器 pid_controller[0].update_pid(0.625, 0.125, 0.00); // 设置第一个电机的PID参数 pid_controller[1].update_pid(0.625, 0.125, 0.00); // 设置第二个电机的PID参数 pid_controller[0].out_limit(-100, 100); // 设置第一个电机的输出限幅 pid_controller[1].out_limit(-100, 100); // 设置第二个电机的输出限幅 kinematics.set_wheel_distance(175); // 设置轮距为175mm,即轮子之间的距离 kinematics.set_motor_param(0, 0.1051566); // 设置第一个电机的每脉冲距离 kinematics.set_motor_param(1, 0.1051566); // 设置第二个电机的每脉冲距离 kinematics.kinematic_inverse(target_linear_speed, target_angular_speed, out_left_speed, out_right_speed); // 计算运动轨迹 pid_controller[0].update_target(out_left_speed); // 设置第一个电机的目标速度 pid_controller[1].update_target(out_right_speed); // 设置第二个电机的目标速度 xTaskCreate(micro_ros_task, "micro_ros", 10240, NULL, 1, NULL); // 创建micro-ROS任务 } void loop() { delay(10); // 等待10毫秒 kinematics.update_motor_speed(millis(), encoders[0].getTicks(), encoders[1].getTicks()); // 更新电机速度 motor.updateMotorSpeed(0, pid_controller[0].update(kinematics.get_motor_speed(0))); // 控制第一个电机速度 motor.updateMotorSpeed(1, pid_controller[1].update(kinematics.get_motor_speed(1))); // 控制第二个电机速度 Serial.printf("x=%f, y=%f, angle=%f\n", kinematics.get_odom().x, kinematics.get_odom().y, kinematics.get_odom().angle); // 打印当前位置信息 }
整个过程没有报错,经过百度、鱼香ros社区等搜索没有找到解决方案,还望小鱼老师有空时指点指点。如果这个过程有报错还有方向,没有报错。而且微控制器的WiFi是链接成功的。IP地址前三位与程序中是一致的。
agent端口截图如下:

-
@onedream 虚拟机还是实体机,检查下linux的ip地址先。 另外你的agent命令后加个 -v6 看看
-
@小鱼 感谢小鱼老师,我使用的是虚拟机,按照你的方法更好虚拟机IP地址后就成功了。我也测试了不加v6都可以。途中出现debug信息我推测是网络不稳定造成的。最后希望小鱼老师有空上传下fishbot_motion_control的源码,对于我这个小白每次都要想好久才知道代码增加的位置应该放哪里才是正确的。麻烦了。
-
@onedream 你好这个问题怎么解决的,我也遇到了?大神能详细说说吗?
-
@945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:
@onedream 你好这个问题怎么解决的,我也遇到了?大神能详细说说吗?
虚拟机网络选择的是桥接网卡模式,但是在复制IP地址是Ubuntu右上角,有线连接,可以看到IP4地址,但是和鱼哥视频教程了的不太一样,视频教程里是直接就能看到WiFi连接的详细信息。
-
@945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:
@945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:
@onedream 你好这个问题怎么解决的,我也遇到了?大神能详细说说吗?
虚拟机网络选择的是桥接网卡模式,但是在复制IP地址是Ubuntu右上角,有线连接,可以看到IP4地址,但是和鱼哥视频教程了的不太一样,视频教程里是直接就能看到WiFi连接的详细信息。
-
@945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:
@945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:
@945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:
@onedream 你好这个问题怎么解决的,我也遇到了?大神能详细说说吗?
虚拟机网络选择的是桥接网卡模式,但是在复制IP地址是Ubuntu右上角,有线连接,可以看到IP4地址,但是和鱼哥视频教程了的不太一样,视频教程里是直接就能看到WiFi连接的详细信息。
应该是虚拟机没有WiFi,只有有线模式,所以连接不上。怎么在虚拟机上解决有WiFi模式,是否可行? -
@945717873 对的,你的思路是对的就是用这个IP地址,还好刚刚我改了IP地址知道,不然还没办法回复你。哈哈哈,感觉学起来完全没有忘记快!
-
@onedream电脑A安装了Ubuntu虚拟机,电脑A和虚拟机都连接到路由器中,Ubuntu虚拟机IP地址:192.168.2.12,单片机esp32也是连接到了该路由器上,单片机esp32的IP地址:192.168.2.57。并且电脑A,ubuntu虚拟机,单片机esp32都在同一子网下,通过Ubuntu虚拟机ping 192.168.2.57和ping 192.168.2.12都能ping的通,通过电脑A的window系统ping 192.168.2.57和ping 192.168.2.12也能ping的通,但是在esp32中写程序ping 192.168.2.12是不通的,而且在电脑A中的Ubuntu虚拟机中,开启了Microros agent,代码:ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888,这是什么原因?用了这个地址也不行啊?我也开了虚拟机连桥模式。还有那些细节吗?
-
@945717873 理论上固件中的IP地址就是你截图的地址,而且这个地址会用在主控板和雷达转接板上。关于你提供的esp32链接WiFi后的IP地址不会用上。既然你主控板已经连接上WiFi,只是他们之间不通信,我的建议是检查代码是否和小鱼老师的一致有没有自己的私货或者错误的,再结合参考小鱼老师的课件,一起排查一下看看。我当时只是IP地址用错了,改了IP地址就直接通信上了。