第九章 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的源码,对于我这个小白每次都要想好久才知道代码增加的位置应该放哪里才是正确的。麻烦了。