紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
microROS wifi连接 都在一个子网,说端口占用错误连接不上
-
参考的教程: 订阅ROS2 Twist
#include <Arduino.h> #include <Esp32McpwmMotor.h> #include <micro_ros_platformio.h> #include <WiFi.h> #include <rcl/rcl.h> #include <rclc/rclc.h> #include <rclc/executor.h> #include <geometry_msgs/msg/twist.h> //定义ROS2执行器和支持结构 rclc_executor_t executor; rclc_support_t support; //定义ROS2 内存分配器 rcl_allocator_t allocator; //定义ROS2节点和订阅者 rcl_node_t node; rcl_subscription_t subscriber; //定义接收到的消息结构体 geometry_msgs__msg__Twist sub_msg; //定义控制两个电机的对象 Esp32McpwmMotor motor; void twist_callback(const void *msg_in) { const geometry_msgs__msg__Twist *twist_msg = (const geometry_msgs__msg__Twist *)msg_in; float linear_x = twist_msg->linear.x; float angular_z = twist_msg->angular.z; Serial.printf("recv spped(%f,%f)\n", linear_x, angular_z); if( linear_x == 0 && angular_z == 0) { motor.updateMotorSpeed(0, 0); motor.updateMotorSpeed(1, 0); return; } if( linear_x > 0) { motor.updateMotorSpeed(0, 70); motor.updateMotorSpeed(1, 70); } if( linear_x < 0) { motor.updateMotorSpeed(0, -70); motor.updateMotorSpeed(1, -70); } if (angular_z > 0) { motor.updateMotorSpeed(0, -70); motor.updateMotorSpeed(1, 70); } if (angular_z < 0) { motor.updateMotorSpeed(0, 70); motor.updateMotorSpeed(1, -70); } } // put function declarations here: void setup() { // put your setup code here, to run once: Serial.begin(115200); motor.attachMotor(0, 22, 23); motor.attachMotor(1, 12, 13); // 设置 micro-ROS 通信参数,连接到指定的 ROS2 代理 IPAddress agent_ip; agent_ip.fromString("192.168.0.101"); // set_microros_wifi_transports("Xiaomi_0846", "zx15879214647", agent_ip, 8888 ); set_microros_wifi_transports("ros_wifi", "12345678", agent_ip, 8888 ); delay(2000); // 初始化 ROS2 执行器和支持结构 allocator = rcl_get_default_allocator(); rclc_support_init(&support, 0, NULL, &allocator); // 初始化 ROS2 节点 rclc_node_init_default(&node, "esp32_car", "", &support); // 初始化订阅者 rclc_subscription_init_default( &subscriber, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist), "/cmd_vel"); rclc_executor_init(&executor, &support.context, 1, &allocator); // 设置订阅的回调函数 rclc_executor_add_subscription(&executor, &subscriber, &sub_msg, &twist_callback, ON_NEW_DATA); } void loop() { // put your main code here, to run repeatedly: rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)); // 循环处理数据 }
这是连接报错及虚拟机配置
这是我的电脑本身IP
-
@1939911749 你搞混了,不要手动指定ip地址,要物理上相通,虚拟机改成桥接模式,直接桥接网络,另外针对图1的错误,你可以直接复制粘贴报错,我帮你搜索下,或者你自己右上角拿错误搜一下,有很多解决教程
-
从您提供的代码和描述中,有几个可能的问题点和解决方案需要考虑,特别是关于端口占用错误和网络配置。
1. 端口占用错误
端口占用错误通常发生在尝试绑定到一个已经被其他程序或服务使用的端口上。在您的代码中,您尝试连接到代理的8888端口。这里有几个步骤来检查和解决这个问题:
-
检查端口使用情况:
- 在运行ROS2代理的计算机上,使用命令如
netstat -an | grep 8888
(Linux/Mac)或netstat -aon | findstr 8888
(Windows)来查看是否有其他进程已经占用了8888端口。 - 如果端口被占用,您可以选择更改端口号或停止使用该端口的进程。
- 在运行ROS2代理的计算机上,使用命令如
-
检查ROS2代理配置:
- 确保ROS2代理(如
ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888
)正在运行,并且配置了正确的端口。
- 确保ROS2代理(如
2. 网络配置
-
确保设备在同一子网:
- 从您的描述来看,设备似乎已经在同一子网(192.168.0.x)。确保所有设备的子网掩码和网关设置正确。
-
检查WiFi连接:
- 确保ESP32设备已经成功连接到名为“ros_wifi”的WiFi网络。
- 检查ESP32的IP地址,确保它与代理在同一子网内。
-
检查防火墙和安全设置:
- 确保没有防火墙或安全软件阻止ESP32设备访问代理的端口。
3. 代码和配置
-
WiFi设置:
- 在代码中,您调用了
set_microros_wifi_transports
函数,但请注意这个函数并不是microROS标准库的一部分。这看起来像是特定于您的项目或库的函数。确保这个函数正确设置了WiFi连接参数,并且没有错误。
- 在代码中,您调用了
-
错误处理:
- 在
setup()
函数中,添加一些错误检查来确保WiFi连接和ROS2节点初始化成功。
- 在
4. 调试和日志
-
增加日志输出:
- 在
setup()
和loop()
函数中添加更多的Serial.println()
语句来输出状态和调试信息。
- 在
-
检查ROS2代理日志:
- 在运行ROS2代理的计算机上查看日志输出,看是否有关于连接或通信错误的信息。
5. 示例和文档
- 参考microROS文档:
- 确保您正在使用最新版本的microROS和相关库。
- 查阅microROS的官方文档和社区论坛,看是否有其他用户遇到类似问题。
通过上述步骤,您应该能够诊断并解决连接问题。如果问题仍然存在,请考虑在microROS社区或相关论坛上寻求更具体的帮助。
以上为生成回答,仅供参考~
-
-
@1939911749 你搞混了,不要手动指定ip地址,要物理上相通,虚拟机改成桥接模式,直接桥接网络,另外针对图1的错误,你可以直接复制粘贴报错,我帮你搜索下,或者你自己右上角拿错误搜一下,有很多解决教程
-
@小鱼 谢谢,已连上
-