智能车竞赛元素方案设计(锁元素)

    今天给大家分享一个智能车竞赛的元素方案,我们组队员都是第一次参赛,略微有些经验不足最后只拿了省二的成绩,但是还是有些不错的方案可以分享下。

下面贴一张17届的线上赛道图片

摄像头顺时针方向跑为例,元素顺序依次为斑马线 > 十字路口  > 左环 > 三叉 最后斑马线车辆跑完一圈,当我们吧所有元素的识别都完成之后会发现,有时候会在十字路口误判三叉,当车辆速度较快,姿态不是很稳定时,非常容易在十字掉头;

以我们之前的方案将所有元素都放在路径判断的程序中识别,识别到相应元素,这种方案很明显简单,容易实现,但出错率也高;因此我们便采用的锁元素,即给每个元素都加一个标号,程序每次路径判断只判断一种元素,元素完成之后将判断改成下一个元素的标号;

简单理解就是:小车从车库出发,此时元素只判断十字路口,跑完两个十字之后开启左环的判断关闭十字的判断(每次只判断一种元素),依次左环出环之后开启三叉的判断,第二次出三叉之后开启斑马线的判断;

这种方案的优势就是相对比较稳定,元素的识别比较准确,当然前提肯定要元素本身识别准确,而锁元素的目的时节省资源和元素识别之间不冲突。

//元素锁

void Lock_road()
{
    if(road_lock==0)
    {
        if(element==5&&element_data==0)
        {
            road_lock=1;
        }
    }
    else if(road_lock==1)
    {
        if(element==6&&element_data==0&&(fork_time_flag_1==2||fork_time_flag_1==0))
        {
            road_lock=2;
        }
    }
    else if(road_lock==2)
    {
        if(element==8&&element_data==0)
        {
            road_lock=0;
        }
    }

}

/*
 * 道路元素判断
 * 0 直道
 * 1 左弯道
 * 2 右弯道
 * 4 右环
 * 5 左环
 * 6 三岔口
 * 7 十字
 * 8 斑马线
 * 9 坡道
 */
void Road_judgment()
{
    static uint8_t zebra_flag_1 = 0;
    //出赛道检测
    if(Out_Threshold<=80)
    {
        mode = 0;
        mode_flag=1;
    }
    Lock_road();//根据赛道解锁元素

    Star();//起步固定角度-只执行一次 尾车在斑马线前发车使用

    if(element_data==0)//特殊元素时不进行道路判断
    {
        if(Dynamic_value>=20||(loss_left_line>=5||loss_right_line>=5||loss_all_line>=5))//利用前瞻和ADC的值对弯道进行判断
        {
            if(loss_left_line>=5||loss_right_line>=5)
            {
                //对动态前瞻点进行判断
                if((loss_left_line>15&&loss_right_line<=5))
                {
                    element = 1;//左弯
                }
                else if((loss_left_line<5&&loss_right_line>=15))
                {
                    element = 2;//右弯
                }
                else
                {
                    element = 3;
                }
            }
        }
        else element = 0;  // 直道
    }
    //十字判断
    if((element_data==0||element==7))
    {
        if(Cross())
        {
            element = 7;
            element_data=1;
        }
        else element_data=0;
    }
    //斑马线检测
    if((element_data==0||element==8)
        &&road_lock==2&&(Encoder_stop==1||fork_time_flag_1==2)//第二圈不开启斑马线检测,防止误判
            )
    {
        if(Zebra())
        {
            zebra_flag=1;
            element = 8;
            element_data=1;
        }
        else
        {
            if(zebra_flag==1)
            {
                zebra_flag_1++;
                zebra_flag=0;
            }
            element_data=0;
        }
    }

    //三岔口判断
    if((element_data==0||element==6)
            &&road_lock==1
            )
    {
        if(Fork_lookup(90,20,left_l,right_l,midline))
        {
            element = 6;
            element_data=1;
        }
        else element_data=0;
    }
    //圆环判断
//    if((element_data==0||element==4)&&road_lock==0)
//    {
//        if(Ring_lookup_right(60,40,left_l,right_l,midline))//判断是否是右圆环
//        {
//            element = 4;
//            element_data=1;
//        }
//        else element_data=0;
//    }

    if((element_data==0||element==5)
            &&road_lock==0
      )
    {
        if(Ring_lookup_left(60,40,left_l,right_l,midline))  //判断是否是左圆环
        {
            element = 5;
            element_data=1;
        }
        else element_data=0;
    }


    Beep_set(element,1);
}

本次内容主要是提供一种方案,不包括具体元素内容,有需要的伙伴可以私聊交流

智能车多车组

后面有时间会发布下元素识别和电机舵机控制,可以留言交流

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TC264智能车是一种基于TC264芯片开发的智能车型,拥有多种功能和模块。其中十字识别模块是TC264智能车的一个重要组成部分。下面是一个简单的TC264智能车十字识别的C代码示例: ```c #include <stdio.h> // 定义输入和输出引脚 #define SENSOR_PIN_A 1 #define SENSOR_PIN_B 2 #define SENSOR_PIN_C 3 #define SENSOR_PIN_D 4 #define MOTOR_PIN_LEFT 5 #define MOTOR_PIN_RIGHT 6 // 定义识别结果常量 #define CROSSROAD_NONE 0 #define CROSSROAD_STRAIGHT 1 #define CROSSROAD_LEFT 2 #define CROSSROAD_RIGHT 3 // 十字识别函数 int detectCrossroad() { int result = CROSSROAD_NONE; // 读取传感器数据 int sensorA = readSensor(SENSOR_PIN_A); int sensorB = readSensor(SENSOR_PIN_B); int sensorC = readSensor(SENSOR_PIN_C); int sensorD = readSensor(SENSOR_PIN_D); // 判断十字识别结果 if (sensorA && sensorB && !sensorC && !sensorD) { result = CROSSROAD_STRAIGHT; } else if (!sensorA && !sensorB && sensorC && !sensorD) { result = CROSSROAD_LEFT; } else if (!sensorA && !sensorB && !sensorC && sensorD) { result = CROSSROAD_RIGHT; } return result; } // 控制电机运动函数 void moveMotor(int direction) { if (direction == CROSSROAD_NONE) { stopMotor(); } else if (direction == CROSSROAD_STRAIGHT) { moveForward(); } else if (direction == CROSSROAD_LEFT) { turnLeft(); } else if (direction == CROSSROAD_RIGHT) { turnRight(); } } // 主程序 int main() { while (1) { int crossroad = detectCrossroad(); moveMotor(crossroad); } return 0; } ``` 这段代码实现了TC264智能车的十字识别功能。主要包括四个传感器引脚和两个电机引脚的定义。`detectCrossroad()`函数用于读取传感器数据并判断识别结果,根据结果控制电机的运动。`main()`函数中通过循环反复进行十字识别和电机控制,使智能车能够正确行驶在十字路口上。这只是一个简单的示例,具体的代码实现可能会根据具体的智能车硬件平台和应用场景有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值