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

    第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现

    已定时 已固定 已锁定 已移动
    ROS2机器人开发:从入门到实践
    rosagent 节点 通信 节点不运行
    3
    10
    313
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • O
      onedream 年度VIP
      最后由 编辑

      问题: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端口截图如下:
      ![替代文字](屏幕截图 2024-12-10 233527.jpg 图片地址)

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

        @onedream 虚拟机还是实体机,检查下linux的ip地址先。 另外你的agent命令后加个 -v6 看看

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

        O 1 条回复 最后回复 回复 引用 0
        • O
          onedream 年度VIP @小鱼
          最后由 编辑

          @小鱼 感谢小鱼老师,我使用的是虚拟机,按照你的方法更好虚拟机IP地址后就成功了。我也测试了不加v6都可以。途中出现debug信息我推测是网络不稳定造成的。最后希望小鱼老师有空上传下fishbot_motion_control的源码,对于我这个小白每次都要想好久才知道代码增加的位置应该放哪里才是正确的。麻烦了。

          9 1 条回复 最后回复 回复 引用 0
          • 9
            945717873 @onedream
            最后由 编辑

            @onedream 你好这个问题怎么解决的,我也遇到了?大神能详细说说吗?

            9 1 条回复 最后回复 回复 引用 0
            • 9
              945717873 @945717873
              最后由 编辑

              @945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:

              @onedream 你好这个问题怎么解决的,我也遇到了?大神能详细说说吗?

              虚拟机网络选择的是桥接网卡模式,但是在复制IP地址是Ubuntu右上角,有线连接,可以看到IP4地址,但是和鱼哥视频教程了的不太一样,视频教程里是直接就能看到WiFi连接的详细信息。

              9 O 2 条回复 最后回复 回复 引用 0
              • 9
                945717873 @945717873
                最后由 编辑

                @945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:

                @945717873 在 第九章 9.4.1 micro_ros_agent无法与微控制器通信,节点也没有出现 中说:

                @onedream 你好这个问题怎么解决的,我也遇到了?大神能详细说说吗?

                虚拟机网络选择的是桥接网卡模式,但是在复制IP地址是Ubuntu右上角,有线连接,可以看到IP4地址,但是和鱼哥视频教程了的不太一样,视频教程里是直接就能看到WiFi连接的详细信息。
                cd579e1e-5d3b-4374-bbb5-bca2aa39b270-9b2d7bd17eef78573b888f1d87847c1.jpg

                9 1 条回复 最后回复 回复 引用 0
                • 9
                  945717873 @945717873
                  最后由 编辑

                  @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连接的详细信息。
                  cd579e1e-5d3b-4374-bbb5-bca2aa39b270-9b2d7bd17eef78573b888f1d87847c1.jpg
                  应该是虚拟机没有WiFi,只有有线模式,所以连接不上。怎么在虚拟机上解决有WiFi模式,是否可行?

                  1 条回复 最后回复 回复 引用 0
                  • O
                    onedream 年度VIP @945717873
                    最后由 编辑

                    @945717873 对的,你的思路是对的就是用这个IP地址,还好刚刚我改了IP地址知道,不然还没办法回复你。哈哈哈,感觉学起来完全没有忘记快!

                    9 1 条回复 最后回复 回复 引用 0
                    • 9
                      945717873 @onedream
                      最后由 编辑

                      @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,这是什么原因?用了这个地址也不行啊?我也开了虚拟机连桥模式。还有那些细节吗?

                      O 1 条回复 最后回复 回复 引用 0
                      • O
                        onedream 年度VIP @945717873
                        最后由 编辑

                        @945717873 理论上固件中的IP地址就是你截图的地址,而且这个地址会用在主控板和雷达转接板上。关于你提供的esp32链接WiFi后的IP地址不会用上。既然你主控板已经连接上WiFi,只是他们之间不通信,我的建议是检查代码是否和小鱼老师的一致有没有自己的私货或者错误的,再结合参考小鱼老师的课件,一起排查一下看看。我当时只是IP地址用错了,改了IP地址就直接通信上了。

                        1 条回复 最后回复 回复 引用 0
                        • 第一个帖子
                          最后一个帖子
                        皖ICP备16016415号-7
                        Powered by NodeBB | 鱼香ROS