【第十七届智能车】程序编写过程中的一些小技巧

2023-05-16

目前博主还在总结并完善智能车的博客,这篇文章也会随时间更新。这里的小技巧其实并不是什么很高级的算法和技巧,全是博主在编写智能车程序的过程中总结归纳的一些经验(可能仅仅只是对我而言的技巧吧,实在是太菜了QAQ,大佬轻喷)。

启用编译器优化

在逐飞官方给出的示例程序、库模板工程中,默认的优化等级都是-O0,也就是不开启编译优化。这样生成的代码不仅长度大,而且执行速度也很慢。这时,我们就可以去修改MRS的工程设置,将编译器优化打开:

打开“项目-属性”菜单,在设置窗口中如下设置:

启用编译器优化

其中由上到下直到-Ofast为止优化等级逐渐提高,但是优化等级也不是越高越好,过高的优化等级可能导致代码执行异常,需要根据实际情况斟酌考虑。我这里开到-Ofast没有问题,所以就使用了-Ofast

修改优化等级后,实测图像处理速度提升明显(大津法35.3fps->50fps,索贝尔43.3fps->50fps,直接跑满了总钻风在188*120分辨率下的最高输出帧率),应该是大量优化了逐飞库中实际上没有执行但是仍然占用资源的程序。需要注意的是,优化等级提高后,编译器的检查也会变严格,Warning会变多,有些在低优化等级下不会报Warning的也会报Warning了(说的就是你逐飞库)。在后续进行Debug时,过高的优化等级可能导致变量无法正常在MRS侧边栏中显示,这时候把优化等级开到-Og就OK,这一优化等级是专门为了Debug而设计的,编译器会保留大量的Debug信息。

元素识别的跳变沿检测与多帧连续判定

做图像处理需要有的意识是,在智能车图像处理中,时间刻度是以“帧”作为基本单位进行衡量的。

元素识别结果反映在标志位的“0、1”变化上,由于每帧图像进来是有一定间隔的,这个信号也是一个离散信号,是一系列的散点,但是仍然存在“跳变沿”。在元素识别的时候,可以设置一个上一帧识别某一元素结果的标志位element_backup,然后在这一帧识别这个元素的时候重新备份一下这个标志位(element = element_backup),这样就可以根据上一次判断的结果来进行“上升沿”和“下降沿”的判别,从而可以定位一些需要精确定位到“没识别到->识别到”或者“识别到->未识别到”的过程。

识别元素的时候,其实是有很多帧的时间,该元素是在视野内的。如果不引入多帧判定的机制,只要有一帧误判了某元素,那标志位就整个乱套了。所以,可以引入一个多帧判定机制,根据设定每个元素每个状态的判定帧数阈值,然后引入一个判定到特征帧计数器(我称判断到某元素的一幅图像为该元素的一个特征帧),每次只有判定到足够多的帧数之后才置位元素标志位,同时清除特征帧计数器;同理,没有识别到某元素的时候也可以引入一个未识别到特征帧计数器和未识别到特征帧计数阈值。引入这个机制之后,通过调整特征帧的阈值,就可以调节识别元素的前瞻量,并降低单帧可能带来的误判概率了。
在这里插入图片描述

元素锁

元素锁是个非常有用的东西,它允许在识别到一个元素后,“锁住”该元素的状态,在该状态下只允许调用识别该元素的函数,直到识别函数清除掉了该元素标志后才释放元素锁,这样就可以避免在元素内对其他元素的误判发生。这个机制非常有用而且有效,同时这个机制如果稍加改造,甚至还可以利用这一机制“背赛道”(虽然在线下赛肯定是没用了)。我写的元素锁架构是在所有元素识别函数外平行创建一个新的函数,由这个函数读取元素状态并且根据元素状态来调用相应的识别函数,从而实现元素锁。这就要求函数的封装性非常好,且每个元素识别函数内都必须有一套对标志位完整的置位、状态转换和清除的机制。这个锁机制由两个函数实现,一个函数负责检测这一帧的元素状态,另一个统一的元素识别函数中进行调用和实现。具体的代码就不放了,注释啊什么的都夹在里面比较乱,我这里用伪代码简单说明一下吧:

  1. 元素状态检测函数
u8 元素状态检测函数()
{
	if(!环岛 && !三岔 && !十字 && !坡道 && !其他未列出的元素)//未识别到
		元素状态标志 = 0;
	else if(环岛 && !三岔 && !十字 && !坡道 && !其他未列出的元素)
		元素标志位 = 1;
	else if(!环岛 && 三岔 && !十字 && !坡道 && !其他未列出的元素)
		元素标志位 = 2;
    else if(!环岛 && !三岔 && 十字 && !坡道 && !其他未列出的元素)
		元素标志位 = 3;
    else if(!环岛 && !三岔 && !十字 && 坡道 && !其他未列出的元素)
		元素标志位 = 4;
    else if(!环岛 && !三岔 && !十字 && 坡道 && 其他未列出的元素)
        元素状态位 = 5;
    ……
}
  1. 元素识别函数
void 元素识别函数()
{
	switch(元素状态位)
    {
        case 未识别到:
            调用一遍各个元素的识别函数,每个函数后面都加一个元素状态检测函数,注意元素识别函数的调用顺序
            break;
        case 1:
            环岛识别函数
            元素状态检测函数
            break;
        case 2:
            三岔识别函数
		   元素状态检测函数
            break;
        case 3:
            十字识别函数
            元素状态检测函数
            break;
        case 4:
            坡道识别函数
            元素状态检测函数
            break;
        case 5:
            其他元素识别函数
            元素状态检测函数
            break;
        ……
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【第十七届智能车】程序编写过程中的一些小技巧 的相关文章

随机推荐

  • ROS学习笔记(二)- ROS驱动机器人实例

    利用周末玩了一下先锋机器人 xff08 Pioneer3 P3AT xff09 xff0c 前后装了两次ROS xff0c 以及一大堆操作细节 xff0c 打算整理记录一下方便以后解决问题用 xff0c 同时通过实际操作 xff0c 对上一
  • 模块化程序设计——在keil中利用头文件整理程序

    模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块 xff0c 每个小程序模块完成一个确定的功能 xff0c 并在这些模块之间建立必要的联系 xff0c 通过模块的互相协作完成整个功能的程序设计方法 xff08 复制
  • 前端面试谈:项目经历的 STAR 法则

    大家好 xff0c 我是前端西瓜哥 xff0c 今天来看看简历中阐述项目经历的 STAR 法则是什么 STAR 法则是什么 xff1f 我们写简历中的项目经历时 xff0c 一种常见的思路就是 STAR 法则 STAR 是四个单词的首字母和
  • Promethes+grafana 监控Minio集群

    export MINIO PROMETHEUS AUTH TYPE 61 public target 中间要有空格 grafana 模板 12063 11148 13502 https grafana com grafana dashboa
  • 【开发者portal在线开发插件系列一】profile和基本上下行消息

    转载 xff1a https bbs huaweicloud com forum thread 13087 1 1 html 前言 xff1a 开发者portal支持在线开发profile xff08 即设备建模 xff09 在线开发插件
  • ubuntu安装vscode详细教程

    ubuntuvscode安装后打不开问题 这个有个坑 xff0c 有的电脑一次成功 xff0c 有的安装不了 不要下载最新版本 xff0c 下载之前的旧版本 xff1a Visual Studio Code April 2020 注意ubu
  • BC26 OPEN开发之--LWM2M连接分析

    翔神教你学NB BC26 OPEN开发之 LWM2M连接分析 前言 xff1a NB IOT商用已经2年多了 xff0c 三大运营商都建设了大量的NB网络 xff0c 尤其以中国电信最为积极 xff0c 各个模组厂家推出了大量的NB模组 x
  • STM32F429I-DISO探索第二篇 --SDRAM

    有需要STM32F429I DISCO套件的 可以点击 xff1a http item taobao com item htm spm 61 686 1000925 1000774 24 TtTrrN amp id 61 366498110
  • STM32F429I_DISCO 国外大牛做的示波器

    谷歌上搜到的 xff0c coocox网站一直打不开 xff0c 今天突然能打开了 xff0c 就下载来看了一下 xff0c 效果还是不错的 嘻嘻 下面是原帖 xff1a Oscilloscope Project for STM32F429
  • 临界区和开关中断的区别

    本篇文章是为了说明进入临界段与普通的禁止和使能中断的区别 普通的禁止和使能中断 xff0c 在禁止中断时有触发中断的事件发生 xff0c 当使能中断时该中断不会在响应 xff0c 说明普通的禁止中断是阻止了中断的发生 而在进入临界段时 xf
  • ST Nucleo mbed套件开发 一 MBED环境使用 以Nucleo-F401为例

    全球领先的半导体供应商 全球领先的ARM Cortex M微控制器厂商意法半导体 xff08 STMicroelectronics xff0c 简称ST xff09 进一步强化STM32系列微控制器的易用性和设计灵活性 xff0c 推出适用
  • 记一次失败的面试经历

    背景 xff1a 面试者 xff1a 王某 xff08 以下简称我 xff09 嵌入式行业刚入门 10年工作经历 从事方向为 xff1a GPS BD导航 xff0c 物联网 xff0c 车联网方向 面试官 xff1a 前华为员工 3年工作
  • BC26接入电信平台操作手册 (五)

    二 模块端指令操作 一 获取模块的IMEI号 AT 43 CGSN 61 1 43 CGSN 866971030545227 OK 二 查询射频开关 AT 43 CFUN 43 CFUN 1 OK 三 查询信号质量 AT 43 CESQ 4
  • Cortex M3处理器工作模式及中断过程

    1 工作模式 线程模式 xff08 Thread mode xff09 xff1a 处理器复位或异常退出时为此模式 此模式下的代码可以是特权代码也可以是用户及代码 xff0c 通过CONTROL 0 控制 处理模式 xff08 Handle
  • 命名管道和匿名管道

    我们知道进程间是可以通信的 可以达到数据传输 资源共享 事件通知 进程控制等目的 进程间通信主要包括管道 系统IPC xff0c 套接字等 管道分为三种 xff1a 普通管道 xff1a 一是单工 xff0c 只能单向传输 xff0c 二是
  • markdown文件转RST文件

    markdown 文件转RST文件时遇到的一些问题 最近需要把一些markdown文件转成RST文件 xff0c 第一次接触RST文件 xff0c 使用中会有一些语法问题需要注意 在这里做个记录 转化工具 我们可以先采用工具对整体做个初步的
  • 思岚A1 上手教程

    前言 寒假在家闲着也是闲着 xff0c 索性就向是实验室借了一个思岚 A1激光雷达 xff0c 来进一步完成自己的实验室实习项目 经过一个月在Linux上和ROS上的摸爬滚打 xff0c 我已经对机器人开发和SLAM有了初步了解 xff0c
  • Qt和MFC的效率对比

    Qt和MFC的效率对比 之前一直做mfc xff0c 昨天看了一晚上的Qt xff0c 瞬间就喜欢上它了 xff0c Qt在windows下应该没有mfc的运行效率高 xff0c 但是我想知道差多少 xff0c 不知有没有大牛做过这方面的对
  • C++常见基本笔试/面试题总结

    1 c 43 43 与c的关系 1 c 43 43 是c的增强版 xff0c 是几乎完全兼容c的 2 c 43 43 在c的基础上增加了很多新的内容 3 编程思想发生了转变 xff0c c更多的是面向过程 xff0c c 43 43 是面向
  • 【第十七届智能车】程序编写过程中的一些小技巧

    目前博主还在总结并完善智能车的博客 xff0c 这篇文章也会随时间更新 这里的小技巧其实并不是什么很高级的算法和技巧 xff0c 全是博主在编写智能车程序的过程中总结归纳的一些经验 xff08 可能仅仅只是对我而言的技巧吧 xff0c 实在