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

    9.3.2 电动机速度测量与转换,速度较大,与视频教程中不符

    已定时 已固定 已锁定 已移动
    ROS2机器人开发:从入门到实践
    9.3.2 速度过大 9.3.3 轮子不转
    2
    5
    259
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • R
      ROSER
      最后由 编辑

      截图 2025-03-19 13-32-41.png

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

        @ROSER 给出完整代码

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

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

          @小鱼 ```
          #include <Arduino.h>
          #include <Esp32McpwmMotor.h>
          #include <Esp32PcntEncoder.h>

          // 创建一个数组用于存储两个编码器
          Esp32PcntEncoder encoders[2];
          Esp32McpwmMotor motor;
          //用于存储上一次读取的编码器数值ticks
          int64_t last_ticks[2] = {0,0};
          //用于存储上一次读取的编码器数据(前后两次的差值)
          int16_t delta_ticks[2] = {0,0};
          //用于存储上一次更新电机速度的时间
          int64_t last_updateTime = 0;
          //用于存储当前电机速度
          float current_speed[2] = {0,0};
          void setup()
          {
          // 1.初始化串口
          Serial.begin(115200); // 初始化串口通信,设置通信速率为115200
          // 将电机0连接到引脚22和引脚23
          motor.attachMotor(0, 22, 23);
          // 将电机1连接到引脚12和引脚13
          motor.attachMotor(1, 12, 13);
          // 2.设置编码器
          encoders[0].init(0, 32, 33); // 初始化第一个编码器,使用GPIO 32和33连接
          encoders[1].init(1, 26, 25); // 初始化第二个编码器,使用GPIO 26和25连接
          // 3.设置电机速度
          motor.updateMotorSpeed(0, 100);
          motor.updateMotorSpeed(1, 100);
          }

          void loop()
          {
          delay(10); // 等待10毫秒
          int16_t dt = millis()-last_updateTime;
          //计算编码器当前和上一次读取的数值差
          delta_ticks[0] = encoders[0].getTicks()-last_ticks[0];
          delta_ticks[1] = encoders[1].getTicks()-last_ticks[1];
          //计算速度,0.10805是电机每个脉冲的前进距离
          current_speed[0] = (delta_ticks[0]*0.105805)/dt;
          current_speed[1] = (delta_ticks[1]*0.105805)/dt;
          //为了下次还可以正常的计算速度
          last_ticks[0] = encoders[0].getTicks();
          last_ticks[1] = encoders[1].getTicks();
          last_updateTime = millis();

          // 读取并打印两个编码器的计数器数值 speed1=1073741824, speed2=1071344822
          Serial.printf("speed1=%d, speed2=%d\n", current_speed[0], current_speed[1]);
          //Serial.printf("tick1=%d, tick2=%d\n", encoders[0].getTicks(), encoders[1].getTicks());
          

          }

          这是完整代码...
          小鱼小 1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @ROSER
            最后由 编辑

            @ROSER 在 9.3.2 电动机速度测量与转换,速度较大,与视频教程中不符 中说:

            float current_speed[2] = {0,0};

            一个float 用 %d (X) %f(对)

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

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

              @小鱼
              明白了,谢谢~ C语言跟C++还是好大差别的,记录一下。🙇
              https://www.cnblogs.com/carsonzhu/articles/5255300.html

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