鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    microROS wifi连接 都在一个子网,说端口占用错误连接不上

    已定时 已固定 已锁定 已移动 已解决
    综合问题
    wifi连接 通讯异常
    3
    4
    326
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 19399117491
      Alleluia
      最后由 编辑

      参考的教程: 订阅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)); // 循环处理数据
      }
      
      

      这是连接报错及虚拟机配置
      1.png

      这是我的电脑本身IP
      2.png

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @1939911749
        最后由 编辑

        @1939911749 你搞混了,不要手动指定ip地址,要物理上相通,虚拟机改成桥接模式,直接桥接网络,另外针对图1的错误,你可以直接复制粘贴报错,我帮你搜索下,或者你自己右上角拿错误搜一下,有很多解决教程

        https://fishros.org.cn/forum/topic/151/提问前必看-不符合要求的问题拒绝回答

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        19399117491 1 条回复 最后回复 回复 引用 0
        • 小伊小
          机器人小伊
          最后由 编辑

          从您提供的代码和描述中,有几个可能的问题点和解决方案需要考虑,特别是关于端口占用错误和网络配置。

          1. 端口占用错误

          端口占用错误通常发生在尝试绑定到一个已经被其他程序或服务使用的端口上。在您的代码中,您尝试连接到代理的8888端口。这里有几个步骤来检查和解决这个问题:

          • 检查端口使用情况:

            • 在运行ROS2代理的计算机上,使用命令如netstat -an | grep 8888(Linux/Mac)或netstat -aon | findstr 8888(Windows)来查看是否有其他进程已经占用了8888端口。
            • 如果端口被占用,您可以选择更改端口号或停止使用该端口的进程。
          • 检查ROS2代理配置:

            • 确保ROS2代理(如ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888)正在运行,并且配置了正确的端口。

          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社区或相关论坛上寻求更具体的帮助。


          以上为生成回答,仅供参考~

          我是小伊,已接入ChatGpt,所有回复,仅供参考~

          1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @1939911749
            最后由 编辑

            @1939911749 你搞混了,不要手动指定ip地址,要物理上相通,虚拟机改成桥接模式,直接桥接网络,另外针对图1的错误,你可以直接复制粘贴报错,我帮你搜索下,或者你自己右上角拿错误搜一下,有很多解决教程

            https://fishros.org.cn/forum/topic/151/提问前必看-不符合要求的问题拒绝回答

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            19399117491 1 条回复 最后回复 回复 引用 0
            • 19399117491
              Alleluia @小鱼
              最后由 编辑

              @小鱼 谢谢,已连上

              1 条回复 最后回复 回复 引用 0
              • 小鱼小 小鱼 将这个主题标记为已解决,在
              • 第一个帖子
                最后一个帖子
              皖ICP备16016415号-7
              Powered by NodeBB | 鱼香ROS