小型双轮差速底盘三灰度循迹功能的实现

这篇具有很好参考价值的文章主要介绍了小型双轮差速底盘三灰度循迹功能的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 功能说明

       在小型双轮差速底盘样机前方安装3个 灰度传感器 ,实现机器人沿下图所指定的跑道路线进行运动的效果。

三路灰度传感器循迹小车,机器人

 2. 使用样机

本实验使用的样机为R023样机。

三路灰度传感器循迹小车,机器人

3. 功能实现

3.1 电子硬件

     在这个示例中,我们采用了以下硬件,请大家参考:

主控板 Basra(兼容Arduino Uno)
扩展板

Bigfish2.1扩展板

传感器 灰度传感器
电池 7.4V锂电池

电路连接说明:

① 左轮直流电机连在D9,D10接口上;

② 右轮直流电机连在D5,D6接口上;

③ 3个灰度传感器从左至右连接在A0,A4,A3端口上。

三路灰度传感器循迹小车,机器人

 3.2 编程框架

      本实验的编程框架用到了有限状态机。有限状态机(Finite-state machine)简称FSM,表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件。由于有限状态机有有限个状态,因此可以在实际中实现。有限状态机可以广泛的应用于机器人多个传感器触发组合状态的判断,大大提高检测效率。

状态表

      机器人的传感器触发一般用条件判断来做。

      这时机器人程序的一般思路是:

如果

机器人的某几个传感器触发了;

机器人的某几个电机做个什么事;

做多久;

如果

机器人的另外某几个传感器触发了;

机器人的某几个电机做个什么事;

做多久;

所以我们总是要用到大量的 if 语句,比如双轮小车的某个功能:

如果

机器人的1号传感器触发了;

机器人的左侧电机顺时针转;

机器人的右侧电机逆时针转;

持续5秒;

如果

机器人的2号传感器触发了;

机器人的左侧电机逆时针转;

机器人的右侧电机顺时针转;

持续5秒;

否则

都不转

用伪码写出来就是:

if {   Sensor(端口a,触发);//传感器触发时此句为真,否则为假 }

{

    Motor(L,顺);

    Motor(R,逆);

    Delay 5;

}

if {   Sensor(端口b,触发); }

{

    Motor(L,逆);

    Motor(R,顺);

    Delay 5;

}

else

{

    Motor(L,停);

    Motor(R,停);

}

在只有一个传感器的情况下,我们假设这是个开关量传感器。那么我们可以得到一个状态表格:

状态序号 传感器1
1 1
2 0

这个传感器有两个状态。

而当有两个传感器时,则有四个状态。

状态序号 传感器1 传感器2
1 1 1
2 1 0
3 0 1
4 0 0

如果我们用 if 语句写这四个状态,就显得比较长。

状态序号 传感器1 传感器2 伪码

1

1

1

if

{
    Sensor(1,1);
    Sensor(2,1);
    ……
}

2

1

0

if

{
    Sensor(1,1);
    Sensor(2,0);
    ……
}

3

0

1

if

{
    Sensor(1,0);
    Sensor(2,1);
    ……
}

4

0

0

else

  ……

      在编程的时候,状态罗列的越全,机器人的bug就越少。但是随着传感器的增多,状态数量按2的N次幂增加,大量的if语句使执行效率变得很低,经常出现识别不灵的情况。我们需要换一种高效写法。

      多个确定数量的传感器的触发组合,符合有限状态机的概念,有限状态机一般是用Switch语句来实现。如:

switch(s)

{

case 1 : {动作1;}break;

case 2 : {动作2;}break;

case 3 : {动作3;}break;

case 4 : Act_Stop();break;

default:;break;

}

      不难发现,这段语句实现的关键,就是识别出上页表中的1、2、3、4,四个状态序号。

      那么问题就来了:我们如何让机器人知道自己传感器的触发组合对应于1、2、3、4的哪个序号呢?

二进制状态表

      下面,我们把每组传感器返回值看成一个二进制数值。

三路灰度传感器循迹小车,机器人

 结果我们发现了一种新的、可计算的编码方式:

新序号

传感器1

传感器2
0 0 0
1 0 1
2 1 0
3 1 1

      于是,只要我们知道了传感器们的触发状态,也就知道了序号;知道了序号,也就知道了传感器们的触发状态。用这个序号去写switch语句,再合适不过了。下面我们要做的是,用一种算法,让机器人能够返回自己接收到的传感器组合值的二进制数据。

算法精解

我们可以使用以下算法来实现:

  • 首先设置一个变量s,这个s,将存储传感器组的二进制状态序号。
    • 我们还需要用到一个重要的运算符“<<”,这个运算符的意义是:左移

如:1<<n,意思是1向左移动n位,空出来的数位用0填补。

如:1<<1,结果就是10;1<<2,结果就是100;101<<1,结果就是1010

  • 只要让机器人依次返回各个传感器的状态数值,最早获取的,移到最左;第二获得的,移到“倒数第二左”,……,以此类推。即可获得。

 如两个传感器均触发:

先获得1号的数值(真)并左移0位,得

0 1

再获得2号的数值(真)并左移1位,得

1 0

两数值取“或”,即可得11

数学问题解决了,很容易就可以转化为程序语句:

s=0;

for(i=0;i<2;i++) //因为此例中有2个传感器,i取2

{

s=s|(Servo(i+1,触发判断)<<i);//获得传感器值,移位,或运算

}

于是switch语句可以写为:

switch(s)

{

case 0x00 : {动作0;}break; //序号也可以写作16进制数值

case 0x01 : {动作1;}break;

case 0x02 : {动作2;}break;

case 0x03 : {动作3;}break;

default:;break;

}

策略表

下面我们以本实验中的“小型双轮差速底盘-3灰度循迹”程序为例,再来推导一遍。

传感器触发情况、小车行驶状态、对应行为策略表如下:

传感器1 传感器2 传感器3 序号 小车状态 动作
0 0 0 0 都没触发,可能是跑偏了 后退,转向
0 0 1 1 小车左偏 左轮逆时针转,向右调整
0 1 0 2 小车正中 左轮逆时针转,右轮顺时针转,前进
0 1 1 3 在这个行进方向上不可能
1 0 0 4 小车右偏 右轮顺时针转,向左调整
1 0 1 5 在此跑道上不可能
1 1 0 6 遇到转角

右轮顺时针转,左转

1 1 1 7

在此跑道上不可能

伪码如下:

s=0;

for(i=0;i<3;i++)

{

s=s|(Input(i+1,1)<<i);

}

switch(s)

{

case 0x00 : 停;break;

case 0x01 : {Motor(L,逆);Motor(R,停);}break;

case 0x02 : {Motor(L,逆);Motor(R,顺);}break;

case 0x04 : {Motor(L,停);Motor(R,顺);}break;

case 0x06 : {Motor(L,停);Motor(R,顺);}break;

default:;break;

}

       这段代码中的动作,完全由策略表分析获得,因此,当状态比较多时,用户要学会利用策略表进行分析,从而确定机器人的动作策略,而不是凭空想象。

3.3 编写程序

编程环境:Arduino 1.8.19

编写并烧录以下程序(Track_Car.ino),该程序将实现演示视频中的动作。

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-02-09 https://www.robotway.com/                                   

------------------------------------------------------------------------------------*/

int pin[3] = {A0, A3, A4};           //按车头前进方向,从右至左定义,后面经过公式计算,会转化为从左至右的顺序

int s;

void setup()

{

  pinMode( 5 , OUTPUT);

  pinMode( 6 , OUTPUT);

  pinMode( 9 , OUTPUT);

  pinMode( 10 , OUTPUT);

}



void loop()

{

   s = 0;

        for(int i=0; i<3; i++)                 //循环获取三个传感器的值

        {

            s|= (!digitalRead(pin[i]) << i);   //经过左移运算和或运算后,按照A0、A3、A4的顺序产生一个三位2进制数值,表示3个传感器的组合触发状态

        }

        switch (s)

        {

          case 0x00: //三个均未触发

          back();

          Left();

          break;

          case 0x01: //右侧传感器触发,直线上摆动或遇到右转弯

          Right();

          break;

          case 0x02: //中间传感器触发,直线上直行

          Forwards();

          break;

          case 0x04: //左侧传感器触发,直线上摆动或遇到左转弯

          Left();

          break;

          case 0x06: //左侧两个触发,遇到左转弯

          Left();

          break;

          default:;break;

        }

  }

void Left()

{

digitalWrite( 5 , LOW );

digitalWrite( 6 , HIGH);

digitalWrite( 9 , HIGH );

digitalWrite( 10 , LOW );

}



void Right()

{

digitalWrite( 5 , HIGH );

digitalWrite( 6 , LOW );

digitalWrite( 9 , LOW );

digitalWrite( 10 , HIGH );

}



void Forwards()

{

digitalWrite( 5 , HIGH );

digitalWrite( 6 , LOW );

digitalWrite( 9 , HIGH );

digitalWrite( 10 , LOW );

}



void back()

{

digitalWrite( 5 , LOW );

digitalWrite( 6 , HIGH );

digitalWrite( 9 , LOW );

digitalWrite( 10 , HIGH );

}

4. 资料内容

3灰度循迹-例程源代码


​资料内容下载详见小型双轮差速底盘文章来源地址https://www.toymoban.com/news/detail-600059.html

到了这里,关于小型双轮差速底盘三灰度循迹功能的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32智能循迹避障小车(1)循迹调速功能的实现

    1.stm32f103rct6最小系统板 2.两个TB6612FNG电机驱动模块 线路连接请参考实际程序连线,此图为网上下载仅供参考。 3.三个TCRT5000循迹模块 这种是单路TCRT5000循迹模块,有四个接口,VCC电源接口、GND地接口,DO就是它的输出信号,然后AO口(模拟信号输出)。一般DO口接在stm32系统板

    2024年02月04日
    浏览(30)
  • 四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹

    目录 前言: 小车效果展示: 5路数字灰度传感器: 巡线思路: 加入PID调节的代码:         之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当初的学习记录。 STM32RCT6主控,5路灰度寻迹,超声波HC_SR04中断式

    2024年02月03日
    浏览(39)
  • 基于51单片机智能小车循迹功能的实现

    本实验采用两路红外循迹模块单黑线循迹的方法。当红外循迹模块未检测到黑线,则前进;若一边检测到黑线,则实现转弯;若两边均检测到黑线,则停止。利用两路红外循迹模块接收到的信号控制电机的运动,实现小车的前进,转弯等运动。 背面 正面 --------------------( 黄

    2023年04月08日
    浏览(28)
  • Spring Cloud Gateway实现灰度发布功能

    灰度发布又名金丝雀发布,在微服务中的表现为同一服务同时上线不同版本,让一部分用户使用新版本来验证新特性,如果验证没有问题,则将所有用户都迁移到新版本上。 在微服务架构中,网关负责请求的统一入口,主要功能之一是请求路由。而灰度发布实质就是让指定用

    2024年02月21日
    浏览(66)
  • 4.1底盘基础功能:nmcli命令配置机器人无线网 Xshell中进行(冰达ros机器人例程运行)

    4.1.3nmcli命令配置机器人无线网 Xshell中进行(Xshell此软件安装包在3.windows实用软件当中下载)注:如果没有办法使用直接百度上搜索Xshell官网下载最新版本 配置无线网络视频教程首先准备一台路由器和网线 如下图所示连接小车(注:路由器可以没有互联网) 连上小车后需等

    2024年04月25日
    浏览(36)
  • 怎样用PHP语言实现远程控制三路开关

    怎样用PHP语言实现远程控制三路开关呢? 本文描述了使用PHP语言调用HTTP接口,实现控制三路开关,三路开关可控制三路照明、排风扇等电器。 可选用产品:可根据实际场景需求,选择对应的规格 序号 设备名称 厂商 1 智能WiFi墙壁开关3路 统软云物联 2 智能WiFi触摸墙壁开关

    2024年04月24日
    浏览(70)
  • 基于51单片机的多功能智能语音循迹避障小车

    目录 一.功能介绍及硬件准备 二.电机控制及调速 三.小车循迹方案 四.跟随功能实现 五.测速功能实现 六.OLED显示车速 七.摇头避障功能实现 八.SU-03T语音模块介绍 九.语音切换小车模式+OLED显示模式 这是一款基于51单片机开发的智能小车,通过这篇文章我会记录下来开发这款小

    2024年02月03日
    浏览(31)
  • 【工程记录】基于松灵Scout mini底盘实现小车自主探索建图

    松灵scout mini底盘 速腾robense 16线激光雷达 瑞芬imu 因特尔nuc IMU驱动包(原创) 松灵底盘包(改写,里程计融合IMU角度信息) ROS Navigation(参数调试) TEB Local Planner(参数调试) Cartographer(改写) Explore_Lite(改写) ZMQ Socket(改写) 小车实况:  建图实况: 1、Cartographer利用

    2024年02月13日
    浏览(39)
  • OpenCV常用功能——灰度处理和图像二值化处理

    1.1 cvtColor函数 函数原型: 功能 :转换图像颜色空间。 参数 : src: 输入图像。 code: 颜色空间转换代码。可以取常量cv2.COLOR_BGR2GRAY或cv2.COLOR_RGB2GRAY。 dst: 输出图像。 dstCn: 输出图像的通道数,如果设置为0,则跟随转换代码自动设置。 内置函数示例代码: 灰度处理的原理是将

    2024年02月08日
    浏览(47)
  • 基于X86六轮差速移动机器人运动控制器设计与实现(一)软件与硬件架构

    本文研究的六轮差速移动机器人 (Six-Wheeled Differential Mobile Robot , SWDMR) 为了满足资源站到资源站点对点的物资运输,对机器人的跨越障碍能力 有较高的要求。对比传统的四轮移动机器人,六轮移动机器人能够提供更强的驱动 力,而且六轮与四轮相比整车分散到单个车轮的负

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包