linux大全
edgeboard板卡 (fz3b板卡或赛事专用版)
网线
64gb内存卡
2023年的培训资料(老师给我的23年 我就把23 24融合在一起了)
分三阶段,线上资格赛,线下分区赛事,全国总决赛
其中线上成绩占10%,线下成绩占90%

算力平台 AI Studio
石墨文档
开源来啦!第十九届完全模型组开源资料已经发布,更多答疑及学习资料可以访问石墨文档获取:https://shimo.im/docs/QhG7PWaxuM47dK5F
线上资格赛链接:https://aistudio.baidu.com/aistudio/competition/detail/760/0/introduction
完全模型组的赛道元素(最后两个是当年特殊的赛道)

线下比赛任务概述
沿着赛道行驶两圈还有失败计时增加
赛道标志
组委会会提供标准的3D打印STL文件,参赛队可以自行打印,其他根据当年的赛题具体分析
车模要求(2023年)
I车模
车壳必须有,塑料材质
车壳需要完整的包围车辆本身,看不到车辆的内部细节
尺寸没有限制
最多使用2个摄像头对赛道进行识别,并且摄像头必须连接板卡
可以使用非摄像头传感器对环境进行辅助检测,车辆姿态和运动控制
微控制器及算法要求
车模的赛道元素检测识别需要只使用百度板卡
运动控制使用infineon,stc,wch,nxp设计的电路板
只能使用百度paddlepaddle框架
车模与edgeboard板卡



百度城市反恐数据集地址
大佬开源项目
什么是voc数据集
第50期 目标检测——Pascal VOC数据集 (qq.com)
如何做数据集
https://paddledetection.readthedocs.io/tutorials/Custom_DataSet.html
安装paddledection
https://gitee.com/paddlepaddle/PaddleDetection/blob/develop/docs/tutorials/INSTALL_cn.md
xml文件了解(getroot、parse)
https://www.runoob.com/python3/python3-xml-processing.html
iter迭代(简单来说,就是反复过程)
https://www.runoob.com/python/python-func-iter.html
问题:内核挂掉了,会导致训练时间不减反增,重启内核即可
【2022-04-26 完全模型讲座-哔哩哔哩】 https://b23.tv/eXHwulI
29:50 训练哪种模型
32:37 模型优化思路
38:00 多个改动可能导致的问题
46:12 标注中可能存在的问题
55:09 后处理 PATTA
58:42 图形处理时候的优化,改变数据类型的大小
1:03:00 量化剪枝蒸馏
1:04:13 总结

1:10:42 线上赛提升代码参考
1:11:42 如何利用paddlesim量化模型
1:13:17 量化slim /quant文件
1:13:48 prune裁剪文件
1:14:12 裁剪支持模型
1:14:28 量化对小模型的缺点 运行速度变慢
1:14:45 pdmodel模型文件 pdiparams 参数文件
1:16:50 神经架构搜索
1:20:40 搜索的工作量大
1:22:08 如何改进使效率提高和评估性一致差的问题
1:23:17 ones of all论文 slim中有OFA模型
1:31:14 paddleslim的nas的ofa
1:32:00 模型不变 fps降低问题(看评论区)
第二个录屏
开场是培训的准备与启动,介绍了完全模型组四天集训营的第二天活动内容,主讲人为来自赛鼠的张胜作和刘可刘格老师。紧接着,张老师与刘老师详细介绍了车模的结构、改装注意事项以及后续线下赛筹备的重要性。随后,通过PPT展示和现场演示环节,详细讲解了车模与配件包的介绍、车模修改说明以及车模调整与优化的要点。期间还涉及了电池相关内容的使用注意事项。最后,进行了问题的解答环节,并对现场观众进行了抽奖活动,奖品包括基础车模、车壳、舵机包以及算力卡等。整个培训过程详细介绍了车模的制作、改装及优化技巧,旨在提高参与者的技能水平和对后续比赛的筹备有大的帮助。

车模和配件包介绍
1.车模组成:包括车壳、五金包、电机模组、摄像头固定座等。 2.配件包说明:座机推荐包、电池配件包、充电器、微型编码器、摄像头和固定件配套包、锂电池报警器、h bot计算卡。 3.车模调整与优化:包括车模参数调整、避震器和差速器调整、电池使用注意事项等。
车模修改说明
1.比赛规则:包括车模只能使用原厂舵机电机、轮胎,不能改动底盘结构、轮距、轮胎等。 2.修改限制:车模电机不能改动,传动比不能改动,舵机不能拆开,只能使用本身电池供电。 3.允许修改:车模底盘可以打孔安装辅助支撑装置,轮胎不能增加防滑胶套,必要时可以打磨轮胎。
视频内容(ai生成)
这个摄像头,这个视角呢,给大家进行一些这个展示,还有这个具体的这个组装的。这个演示环节。然后今天呢,我们这个呃跟大家分享的主题呢,就是我们完全模型组的这个爱成魔的。这个改装与优化,以及后面添加了一些这个关于电池相关的一些内容。呃。主要呢呃,一个是车模和配件包的介绍啊,然后车模修改说明呃,这两块儿呢是由这个。圣座这边儿啊,给大家进行讲解,然后后面的这个车模调整与优化,还有这个后加的这个电池的使用的一些注意事项呢有。这个我这边儿来进行,给大家进行这个分享啊,然后后面以及后面共同为大家进行一些呃问题的解答。嗯,好,那这个一会儿涉及到这个演示的环节哈,就是很多都会在这个。这个摄像头,这个视野里面啊,大家可以调整一下窗口,然后把这个PPT啊和这个呃摄像头的这个画面啊,并行,这样的话,两边都可以看到相应的界面。嗯,行,那下面我们有请呃胜座为大家来介绍一下这个车模和配件相关的一些内容。好。呃,各位同学晚上好,我是本次的主讲人之一张胜作。嗯,接下来咱们先讲解车膜第一项车膜与配件包介绍。好车模介绍,咱们先来一个开箱视频啊,下面这个盒子大家已经不陌生了。
咱们先打开箱子啊,首先拿出来的是一个车壳,是车壳。嗯,大家可以看到,这是一个纯白的四条格,然后呃,最上面这个位置还有左侧右侧这个位置,这都是可以抠开的。啊,大家用呃,用手使点劲儿就能抠开。然后这里面还有一根儿杠杆儿是用来啊,固定那个摄像头儿的。一个是碳杆儿,然后里面还有一个五金包儿,里面有各种螺丝,还有。相应的一些工具,我们能用到的一些工具。然后最后这就是一个。啊,一个基础的车模儿,大家可以看到,然后这个车模儿是啊,分为几个模块儿啊?最前面那这是一个前方状嗯,方状的,然后第二项这是这是一个前桥嗯。大家可以看到这这这个位置是空的,应该是放有座机的啊,这个必须啊,放有座机才能使用。然后接下来这这个位置,这是啊,这块儿这是电池仓,这是电池仓放电池的,然后上面是。嗯,配放h bot板卡的,这是这是有孔位的。然后接下来这就是呃,那个摄像头固定座啊,碳杆。我们的碳杆是可以插在这个上面的嗯。然后接下来这是电机电机模组,然后后面是后桥。然后这是悬挂咱们的四轮儿啊,都是独立悬挂参数都可调。啊,软硬度或者是可以调高调低都是可以调的。好啊。好,接下来咱们进行。第二项配件包的说明。大家可以提前看一下这些课件包,各种各样的课件包。咱们的配件包还是不少的。什么情况?对,能能看。然后这是各式各样的配件包。咱们现在可以着重啊,讲一些咱们一定会用到,或者说是啊,使用率比较频繁的一些配件包。咱们可以先来讲解啊,座机。四。啊,这是一个座机推荐包,里面有一个座机啊。有一个金属座盘,还有一个配件包,里面一些小零件。嗯,咱们可以演示一下它的安装。咱们安装之前先首先要把这个前桥给拆下来,用螺丝刀把这四颗螺丝拆下来,拆下来之后前桥就可以拿下来了。这样咱们时间。也因此,我就提前拆下来一个。拆下来一个,然后开始的时候。这应该是有螺丝的,这两颗螺丝底下有两颗螺丝,四颗螺丝,把四颗螺丝先拆下来。拆下来之后把这个座机。嵌入到里面。啊,注意一点,这个这有个调节片。这个片儿。舵机是在这个片儿。和这个零件中间的啊,这一点大家要注意一下。然后嵌入进来之后,大家把螺丝穿进去,相应的螺丝穿进去啊,然后固定紧。之后把这个金属做盘和咱们这个成型的做盘。两个用螺丝给它固定好,固定紧固,定完了之后大家先不要急着把它安装。
啊,咱们应该先把舵机的中值调出来。嗯,就是利用咱们嗯,自制的电路板,把电机多机的中值调好。调好之后,然后再把它嵌入到里边,用螺丝给它拧紧。就okay了。好,这是多机配件包,然后咱们再说一下电池。电池里电池的配件包里面是有一块儿电池,还有一个固定圈儿,这两项,然后这个。之前咱们也说说了啊,这是一个电池的固定舱,咱们可以把电池放进去可以。可以这样放,也可以反过来放,都是可以的,这是这就依据咱们啊,电路板的那个电池的。啊,固定位置相应位置看是在左面还是右边啊?咱们自己的方向可可调。然后接下来咱们说一下充电器,这是一个充电器的包。然后它里面是有一个充电器。啊,还有一根数据线,这两样东西。然后咱们再说一下微型编码器,这个也是比较重要的一个。配件包,这是一个编码器啊,里面是有两种线的。有有一种这是属于排线啊,这是一种,然后还有一种红黑线,这属于电源线两种线。然后里面还有一个。电路板一块电路板,还有一个透明的外壳。两样东西。然后里面还有一个马盘,这这个袋儿里有个马盘,一个顶丝,还有一个l型的小扳手,这个小扳手就是专门。用这个顶丝用的。啊,接下来咱们可以演示一下这个编码器的安装。我们可以安装编码器,之前先把这个电机。大家看一下,这是电机的位置啊,先把它拆下来,它拆下来这个片儿拆下来。然后再把后面这四颗螺丝固定,电电机的四颗螺丝拆下来,这样这个电机就取下来了。啊,时间关系我已经单独取消了一个点击。呃。这个安装顺序就是。拿着这个。电路板,然后。嵌入到这,这个电机轴上,大家注意一下,这个红色的为正,然后这个正极要跟电路板的MA相连。嵌入到MA上。啊,大家这个方向不要搞错。啊,嵌入进去。我把这个变这个。把盘也放进去。然后码盘放放进去之后。咱们还有那个顶四。把顶丝用咱们专用的l型小扳手把顶丝。给它拧进去,把这个马盘固定好,马盘固定好,马盘固定好之后,把这个透明的外壳儿给它扣上。哎,这就OK了,但是这个前提还有个前提。这应该是最开始一步,可能刚才忘了说了。咱们应该先把这个。红黑线电源线给它焊接在电路板上,可以直接焊接,也可以购买进行插头儿。啊,分别焊接在电路板上,或者和这个线上,然后实行插接。啊,这是第一步,然后接下来就可以按照刚才那步骤把这些都套呃嵌入进来。嵌入进来之后,注意方向,主要是那个电机,电机的正极和电路板的MA 1定要啊。相对应上。啊,这个过程咱们要准备电烙铁啊,需要把这个啊电路板给它焊在电机上。然后装完编码器之后,我们就按照刚才相反的顺序,再把电机给它固定在地板上。嗯。然后咱们接下来说一下摄像头和固定件配套包。呃,这个配件包里边有一个摄像头。啊,大家看一下摄像头,然后还有一个。配件包。还有两颗螺丝。啊用克洛斯。大家能看到啊,电路板上是有两个同步的,大家是能看到的。啊,那就是啊,大家注意一下这个电路板啊,这个排线这个插口朝上它这个画面是正的。如果反过来,那个接口朝下,他说画画面是反的,所以说大家要注意这个接口要朝上。啊。然后把这个固定件儿。咱们用螺丝给它固定在同步上。好,现在固定一下。好,这个固定件咱们已经固定完了,固定完了,咱们可以演示一下如何装在杠杆上?好取出,看杆儿。我们可以。给它插进去。你你你。这个摄像头儿固定座儿,它是可以调节角度的啊,咱们必须先固定。其中啊,上边这个零件或者下边这个零件先固定其中一个,咱们假如说先固定。上面这个零件,咱们先把它固定。上面这个零件固定好之后,咱们可以上下调节下边这个零件就可以实现它的角度变换。诶,这样它就角度就变化了,调整好角度之后,咱们把下面的螺丝也给它固定进来。好嗯,这个就完活了。然后下一项是锂电池报警器,这是一个报警器啊,之后会讲解具体怎么使用。然后接下来咱们的h bot的计算卡。这是咱们二日报的计算卡。呃,后几批的同学收到绑卡的时候会相应的。啊板卡里面会相应的收到一包这个透明外壳。嗯,这是固定。端卡的一个外壳儿啊,第一批的同学应该是没有收到这个啊,这个外壳儿啊,如果大家可以想要想要的话可以。嗯,可以向销售申请啊嗯,可以下次买东西的时候可以顺便给你。带过去或者是啊嗯,你那边出邮费,然后这边给你发过去都是可以的。这个东西是免费的。啊,再说说一下这个这个板卡单独使用的时候,这个上面外壳和下面外壳是都要固定好。啊,可以单独使用,如果是固定在固定在车模上的话。啊,咱们需要把下面的啊,下面的外壳儿去掉,去掉之后,然后固固定在。这个电池仓这个板卡架上的相应螺丝孔位置上就可以了。然后我们说一下。嗯,对。稍等一下,我们共享一下屏幕重新。嗯。好,然后咱们可以看到鼠标指的这个区域,这是赛道的一些元素。啊,像黑白胶带啊,赛道啊,路肩啊,这些有的同学啊,这些元素大家啊,以前可能会有啊,有的就没必要购买了。然后对于咱们完全模型组来说,咱们新增加的就是锥筒,还有打印套装。那这是以之前没有过的,这是锥桶,还有打印套装,就是这两种。嗯,好,咱们现在。啊,讲解下一个环节隔膜修改说明。啊,大家这个看一下这个官方的修改,说明这些大家应该已经看过了。然后咱们主要说一下比赛规则,附录二中的一些,具体的一些说明。啊,一些修改限制,比如说第一个啊,咱们啊车模只能使用原厂的舵机电机,还有轮胎。啊,这是硬性要求。然后第二项。啊,车门的底盘结构轮距。轮镜轮胎啊,这都是不能改动的。好,第三项咱们的。车模电机不能改动啊,也不能改动这个传动比。啊,第五项跟第四项那就是不能改动它这个传统结构,也不能改动嗯。好,第五项,第五项车模的舵机啊,咱们是不能拆开的。啊,但是可以改变座机的安装位置,还有安装方式啊,座机的坐盘,还有连杆,这是可以更改的啊。然后第六项呃车模只只能使用本身的电池供电,不能使用多块电池。嗯,供电。然后第七项在车模在运行状态时只能有四个轮子,承担车模的整体重量不能增加,其他的额外装置或者轮子支撑车模第八项。啊,车膜底盘可以打孔,可以安装各种辅助的支撑装置来固定电路板,传感器等。啊,在这儿这一项大家注意一下啊,电路板和底盘不能直接接触,因为咱们底盘是碳纤维的。碳纤维碳纤维导电啊,大家相信大家应该都清楚这个这个事嗯,第九项第九项这个轮胎不能增加防滑的胶套。呃,这个在参赛入场之前啊,会有一个检测啊呃,会把这个车模放在a4白印纸上十秒钟。啊,然后抬起车呃车模抬起瞬间反应,指不离开地面。啊对,没什么问题。然后第。第十项,如果车轴损坏啊,那么咱们必须使用原厂提供的轮胎或者轮毂。呃,11项。呃。如果各位同学想增加这个轮胎的摩擦力啊,可以进行打磨,但是不能打磨的太过分啊,它的它的这个花纹必须呃。原厂的花纹必须能够识别,然后而且后期不能增呃,不能增加雕刻花纹。啊,在模型组一些细嗯细细中会对嗯,对车模做出更多的限制。啊,比如说第一项啊,车模儿必须带车壳儿啊,车壳儿必须完整,包括车辆的本身。呃。对于车壳来说,为了方便调试和电池的安装,我们可以把那个车壳不呃。个别位置做一些活动的部件儿,但是在运行过程中,这个车壳儿必须为闭合的整体。呃,车壳儿也可以使用原厂自带的车壳儿也可以进行啊,也可以自己进行设计。但是这个车壳必须为塑料材质。啊,还有就是车模的尺寸没有限制,长宽高都没有限制。然后大家可以发挥啊。啊,这是一些。啊,修改的案例,大家可以啊,大致看一下啊,可以自己DIY一下。啊。制制作一款属于自己的外壳。啊,咱们进行。好下下由刘哥来演讲。嗯。嗯,好,您先收拾一下啊。嗯。我是我是我是。好,然后刚才胜座呢,给大家分享了一下这个咱们呃,这个车模还有一些配件包的基本情况,然后也。分享了一下这个,这个剖析了一下我们这个车模修改的一些限制条件啊,以及。这个关于车壳啊,这些可以自由发挥的地方。嗯,那后面呢?我来这个给大家分享一下,就是车模的调整和优化这一部分。呃,作为这个参加。呃,就是以很久以前参加过这个智能车比赛,是参加的这个十一届的比赛啊已经。呃,比较久了,然后呃,也算是作为大家的学长,给大家分享一下这个。之前比赛的一些经验以及关于这个咱们这个新组别新车模的啊,一些这个调整的思路。那头一块儿呢,就是车模参数的调整啊,车模参数呢,其实就是呃,这个。我们在这个车模上啊,给大家预制好的,可以调节的,比如说这个有一些螺丝的地方可以调节长短啊,或者是。这个。呃,这个更换这个不同的这个呃垫片儿啊,来调节它的这个各种角度啊,等等,这一系列的东西。然后这里面主要就是介绍这个调整,这部分主要就是介绍这些东西啊呃,前面呢几个涉及到的啊,主要就是。这个四个轮儿的一些定位参数啊,因为我们这个呃爱车膜呢,跟以往的这个a车膜和b车膜比起来。呃,后轮儿啊,后轮儿也是增加了独立悬挂,所以可以调节的参数相对来说会更多一些。呃,但是原理呢,其实都是大同小异的啊。就是呃,我们可以先从这个竖角啊,也就是我这个。经常呃车辆工程专业的同学,或者是对于这个呃汽车比较了解的嗯。同学呢,可能会对这些参数啊啊,比较熟悉啊,然后这儿呢,我也是给大家来这个分享一下啊,一个是竖角啊,什么是竖角呢?其实就是这个车轮儿的这个角度,我们可以从这个。俯视的一个角度去看这个车,我们可以看右边儿这个这个图片哈,就是。呃,所谓正钱数呢,就是一个内八字儿的一个状态,负钱数呢,就是一个外八字儿的一个状态。然后呃,这个角度呢?可以通过哪个结构去调呢?首先是这个。呃,前桥的位置,前轮儿的呃,正弦数和这个负弦数呢?可以通过舵机的这个连杆儿的长度啊去调节,然后后轮儿呢?后轮儿可以通过这个可以看,可能在底下看比较清晰一些,可以有一个斜拉杆儿可以调这个斜拉杆儿的这个长度。来调整这个啊,轮子的这个竖角儿,这个竖角儿有什么用呢?就是可以。在在这个第一张图里面,这个正弦数的这个状态就是内八字儿,这个状态可以增加直线运动时候的稳定性。可以加强前轮儿的一些回正。然后如果调成右边儿这个样子呢,可以过弯更灵活,但是直线的时候就相对不是那么稳啊,可能会。这个左右摆。这个参数呢?前前后轮儿都可以调,然后这里呢?推荐推荐大家使用这个前后轮儿都使用。一点儿这个正弦数的这样的角度啊,可以这个因为在这个整个车模比赛的过程中,直线的部分实际上是速度最快的。啊,但是同样的,如果直板直线的速直线的位置啊,速度快的时候,如果这个稳定性不好的话,也会导致这个。车模啊,走的不稳啊,或者是冲出赛道等等,这一系列的这个影响啊,所以呃,一般都会将这个。呃,速角调到这个正的这个角度啊,然后另一方面呢,在这个出弯的时候也能加强这个。前前轮儿的这个转向的回正啊,更快的进入到直道的这个加速的状态。嗯,然后第二个参数呢?就是车轮的外倾角啊,外倾角是在哪儿调节呢?就是前后轮儿同样也是都可以调节的。啊,比如前轮儿这儿就是上面俯视的地方,我们第一个看到的这个连杆儿调节它的长度。把它拧长了,就是呃外倾,然后往短了拧,其实就是内倾,就是负的外倾。然后后轮儿也是一样上最上面这个连杆儿啊,可以调这个角度,然后这个角度有什么用呢?这个角度呃,如果是调到外倾的状态就可以看呃,靠左边这个图的右半部分。右半部分这个实际上是一个车的,一个我们可以看作是一个车轮啊,然后左侧实际上是车体。然后右边儿是它的车轮,这样的话,这个整个车轮是往外倾的,如果这个车是一个这个重载的,比如说货车。然后那它这种状态的时候呃,载满货物的时候,载重的时候,左边就会承受比较大的力。然后就会把这个轮子往下压,左边儿的轮子往下左半部分往下压啊,这样的话,这个车轮的一个外倾角。呃,很有可能就被压成了一个呃,这个菱倾角,甚至说这个。压到一个呃,这个内内倾的一个状态啊,这样的话可以这个适应这个整个货车的不同的这个载货状态。啊,然后能让轮胎更多的地方去接触这个呃,这个地面啊,增大这个。呃,抓地力,然后如果是呃调成这个。调成这个负的这个外倾角呢,也就是内倾就是。这样的状态。一个一个比较趴的,这样的一个状态,这个状态呢,其实呃是比较有利于车。车模去过弯的时候增加这个外侧轮的摩擦力,我们知道车过弯的时候实际上是有一个重心转移的。也就是会就是解释直白点儿,它会往外甩,往外甩的话,外侧的车轮儿就会承受更多的压力。这样的话。呃,我们可以看左侧的这个外倾角,这个负外倾角的这个情况,当它受到向右的这样的一个往外甩的这个力的时候。会减小这个倾角,也就是倾向于让更多的胎面去接触地面,这样的一个情况啊,所以会增增加这个。一定程度上,增加过弯的时候的这个啊,轮胎与地面接触的面积啊,增加这个抓地力。然后呃,这里面呢,当然是推荐大家去把这个角调成负的,也就是底下这个啪啪的这个这个状态。这样的话,这个到过弯的时候啊,相应的这个啊,抓地力会更强一些,然后这个参数呢,同样也是前后轮儿都可以调。嗯,再往后的话就是主销后清,主要后清的话在车模上相应体现的就是其实这个跟a车模和。这呃跟a生模和c生模是一样的,前前面儿这个调节方式。然后b车模呢,可能就是通过模改的方式也能调啊,但是默认的方式应该是很难调的。啊,这个地方呃,可以看到呃,在这个固定落机的这个架子左右两侧。这个呃,应该叫前后两前后前后两个方向,各有两个垫片儿,两个垫片儿,然后可以通过调节这个垫片儿的分布方式。然后来调节这个,刚才提到调这个倾角儿的,这个拉杆儿,它的前后位置,这样底下是不动的。底下这个杆儿是不动的,然后上面的前后位置调的时候,比如说往后调,往后调的时候对应着我们这个PPT里面这个图。就是会让这个整个儿前轮儿的这个旋转轴儿会呈现一个这个呃与竖直的这个平面向竖直的这这条线向后倾的这样的一个。一个形式呃。就有点儿像这个呃自行车啊,或者是摩托车的这个这个推进这个参数呃,实际上是可以。增强这个回正的这个呃力矩呃,可以想象一下,在这个斜着这样的一个轴。等下轮子绕着斜着这个轴转的时候,那它肯定不是不是在这个这个这个数值轴上。这样子,在同一个同一个这个平面儿里面转,它是这个。旋转的时候,它会翘起来一点儿,也就是在这个车模转向的时候。打搅的时候,这个车模的前面实际上是被稍微抬起来一点儿。被垫高了一点儿,然后这样的话,依依就是依靠车的这个重力啊,会给一会给这个前轮儿转向一个反向的。反向的力,这样的话也会就是就是这里面说的所谓的提供这个回正的力矩,这样的话也会。这个加快啊,加快这个出弯的时候,车轮的回正,然后增强这个在直道的时候。这个跑的时候的这个稳定性呃,这个这个主销这个后倾啊,基本上是不会有人把它调成前倾的呃,有感兴趣同学可以去试一下哈。前行出来的效果应该是比较差的。嗯,这里面就是。呃,也不做过多的解释了吧,感兴趣的同学可以查一查相关的资料。嗯,然后后面就是转向这块儿转向的话,因为前两天卓老师这边儿也发了一个朋友圈儿呃,不是朋友圈儿,还是那个推送。呃微微信公众号上面推送就是提到了有同学这个表达了对这个阿克曼转向的这个疑惑。啊,为什么好多这个呃实际的乘用车上面都用这样的,这个转向方式,而这个赛车或者是我们的呃车模上面很少用这种。呃,完全符合阿克曼转向特性的这样的一个方式嗯。那呃,这个有些同学可能不了解哈,就是问题就来了,什么是阿克曼转向啊,就是一般大家可以想象的。像这种。就是第一个就是这种平行转向,也就是可以看一下这张图比较直观一点儿哈。看阿克曼的这个是呃,这个车轴的呃,车轮的这个轴和。这个前面这个b是有一定的夹角的。然后呃,正常的思路呢,可能是。对正常的思路呢,可能是它俩是是有一个90度,而不是一个其他的角度,如果形成90度的话,那就是一个平行转向的一个思路。就是它是这样的话,左转向的时候,左轮儿和右轮儿。转的角度是一样的。这样带来一个什么问题,就是这两个轮儿的旋转轴儿是平行的。也就是它们的旋转中,在转弯儿的时候,旋转中心不会交汇于同一个点。这样的话,也就是转弯儿的时候会比较吃力,阻力相对比较大,没有那么顺畅,然后我们可以看这个阿克曼转向。阿克曼转向是一个什么样的布置呢?也就是像最左边儿这个图会往回收一点儿,往回收一点儿,这样的话,这个。转轴还有这个拉杆的,这个轴会形成一个梯形。这个就是转向梯形,然后这个阿克曼的这个这个形式呢就是。形成一个这样的梯形,然后让它两个延长线相交于后轴,这样的话出来的这个效果呢?就会呃,两个前轮儿转向的时候,转向中心会跟后轮儿的转向中心交汇同一个点。这样的话,所有轮子都是围绕整个车,都是围绕着这个点去进行转向的,整个过程会非常顺畅。然后阻力会比较小。嗯,这也是为什么这个像一般的乘用车呀,或者是这个这个平时性要求比较高的车会采用这样的方式去。转向呃,然后但是对于赛车呢,带来呃的一个问题,就是刚才也提到了,就是呃转向的时候。这个会把这个车呃会会这个车一个是重心会那个会会外移,然后更多的重量集中在。外侧的转向轮。然后另一方面呃,因为阿克曼的这个转向内侧的,内侧的转向轮儿偏转的角度比较大。所以它跟地面接触的面积就相对比较小,一方面接触面积小了,然后。承受的这个轮子上面的压力也变小了,所以整个儿内轮儿的就摩擦力就会变得很小,然后为了避免这样的情况。而而平行转向的时候,是不会出现,就是刚才提到的这种情况,为了避免这个情况出现呢,就是其实。呃,或者是避免这个情况过度的影响到车这个转向的时候的这个呃,抓地力。所以一般都会采用这个。呃,就介于阿特曼纯阿特曼和这个。呃平行转向之间的一种状态,也就是它们的这个。这个焦点啊,不是在这个正好在车轴上会更往后一些,这样的话,两个转向的特性也会介于两者之间。呃,既不会像这个平行一样呃,阻力很大。啊,很不很不顺滑,也也不会像这个这个阿克拜一样,会影响到这个过弯的时候。的这个抓地力啊,至于这个呃,反应还慢,一般是不会采用啊,感兴趣的大家可以去了解一下。嗯,然后这个。这几个这些参数呢,主要都是针对的,这个我们四个车轮上面的。一些定位参数,然后这些倾角呢,实际上说的时候或者是画面里面画的其实都比较夸张。就是。呃,实际调整的过程中呢,可能会给一个啊,会这个最终定型的参数可能会是非常小的一个。一个角度啊,就是大家测试的时候可以采取采取一些这个激进的做法,比比如说把这个角度调的很大,然后看看到底带来什么样的影响,是不是跟我们这个?理论或者是我说的这个是不是相符的啊,大家都可以试一试,然后还有这个阿克曼的这这一块儿内容。啊,因为我们这个。我们这个车的这个转向杯上面留了两个,两个这个这个这个。呃拉杆儿的固定孔啊,大家也可以去做一些这个转接件儿啊,比如说这个两两个这个。两个孔其实可以固定好一个,比如说你弄一个金属片儿啊,或者3d打印一个这个呃结构件儿去进行把它延长,然后改变来改变这个。呃,这个地方的这个倾角啊,这个这个这个角度改变这个两点之间的角度,然后也可以试一试其他的这个形式是不是会对这个?呃,车模运行会有好的影响啊,然后这方面呃,关于这一块儿的改装呢,在这个规则里面也都是允许的啊,大家有兴趣也可以去尝试一下。嗯,然后另外就是就是可以调整的,就是一个避震器的弹簧的这个预压力可以通过一个。可以通过一个这个。可以通过一个这个螺纹环去调整啊,就是大家可以去试一试啊,然后刚才提到的这些。呃,这些角度呢?一个是调整的时候就是呃,最终调整的时候可能会没有想象的那么大,可能很小就会。哦,发挥一些作用,也有可能这个跟。啊,底下我可以做了一个声明哈,就是因为这个我们车模还有这个模拟的这个赛道啊,跟真实的车辆。呃,不论是这个质量啊,尺寸上还是说呃,就是这个仿真程度上啊,其实都是有差异的。然后呃,另外运行速度啊,控制策略,还有自身重量啊等等,各种因素都会影响到这个车模,整个的在运行过程中的这个动态响应。呃,所以呃,上面说的这些东西呢,有可能不完全对,也有可能不完全适合于。就是咱们同学自己调出来的,这个相应的控制策略啊,因为它跟这个人去这个开这个车的感受还是有差异的嘛。嗯,所以这个各位同学也可以对这方面感兴趣啊,或者是对于车模的极限的速度有更高的要求,可以积极去尝试,然后去分享相关的内容。嗯,然后说完了这个车模上面一些。大家可以已经预设好的,可以调节的这些倾角啊,竖角啊等等,这一系列的东西,然后后面就要说一些。呃,车模上不可以调整呃,不不能说不可以调整,就是没有给大家预留很多这个调整空间,或者是需要大家自己去。做一些。额外的工作去进行额外的优化,这个车模上的内容也去介绍一下,另外还有一些。当时做比赛的时候的一些小技巧也可以分享给大家关于结构上面的哈。然后后面的内容呢,就是依照着呃我们。对于车膜的优化的收益程度,还有这个也就是说的性性价比啊,来进行依次讲解。嗯,首先其实就是这个呃,防松呃这一块内容呢,因为也有同学去在。在这个自己去做比赛的过程中啊,也有提到我们呃新的车模呢,这个在。传动部分还有。前面舵机转向的部分。呃,可能会有这个顶丝啊,或者是剁盘上面的螺丝会会有松动的这个情况啊,这个地方呢,也是为了。出厂的时候呢,为了给大家留更多的调整的空间,没有把它就是呃,没有在这个工厂拼装的时候啊,去给它做一些。这个打胶啊,或者是防松处理,像其他部分的结构啊,基本上这个能用防松螺母的地方都用了防松螺母,然后。因为往这个塑料里面去拧的螺丝,自带这个自带防松效果,这个就没必要再去额外的去处理。啊,所以这部分的防松工作呢,就是是大家呃对对于大家这个参加比赛。调整车模来说,收益是最高的,因为啊,其实都是比较关键的部位啊,像这个传动轴部分的这个固定顶次。呃,顶次松了的话,可能就失去动力了,然后剁盘,剁盘上的螺丝松了,那可能会影响它的转向角度。嗯,这个地方呢,就是首要就是推荐大家使用螺纹胶去加固这个顶丝托盘的螺丝呢,可能使用这个弹簧垫片儿可以。呃,也可以这个做相应的放松。嗯,然后最重要的呢,其实还是定期检查啊,因为哪怕是上了这个螺纹胶呃,其实它的这个也还是有会松松脱的这个风险。因为毕竟是一个旋转的部分,呃,转速高的时候难免会有震动啊。时间长了,肯定是还是会有松脱啊,但是你如果用高强度的这个螺纹胶呢,以后拆卸可能会有一个会形成一个问题。啊,所以就是一般都会用这个中低强度啊,一般都是低强度的,这个螺纹胶,然后去。呃,给它做一个防松处理,避免松脱,然后再配合定期检查,这样的话。可以,这个让这个车模的这个各个螺丝保持这个呃比较好的状态,然后各个传动啊。还有这个转向啊啊,会出问题嗯行,然后第二项呢,就是关于电池这块儿的内容。呃,包括后面啊,我也会。这个有一大块儿,内容都是关于电池的,因为电池这块儿呢,实际上呃,可能啊。这几年可能锂电池用的相对比较多一些啊,就是像我们参加比赛,那时候都是涅格电池和涅氢电池。呃,虽然电池的性能比较拉跨。呃,然后还有记忆效应啊什么的,但是安全性还是比较这个呃比较高。啊,但是这个经常会发生这个电电流不够用的情况啊,然后啊,目前我们的这个。好新的车膜呢?上面一方面是用了这个AI计算卡,它那个h报的这个计算卡,它的功耗相对会比正常的这个。呃,单片机会高一些,然后呃,另外呢,我们的这个高速电机呢,实际上呃,提速的时候需要的电流也是相应的比较大。然后以及更好的这个性能的舵机呢,需要的电流也更大,所以这里面我们用的是这个锂锂电池包的这样的一个形式。啊,里边可能会涉及到很多这个呃,新的新的知识对于很多这个做做比赛的人来说啊,这里面也是提一下。一个就是电压,电压是一个比较重要的地方就是。呃,如果电压不足的话,一方面会。影响到这个计算卡或者是其他其他这个电路板的正常运行,然后另一方面的话。呃,电压过低也会影响到电池的寿命。所以这个地方啊,推荐大家这个使用一些电压监测的,比如说刚才。这个乘坐的人也说到了一个锂电池的这个报警器嗯,然后或者是用其他的电压显示的形式能够实时监测这个电池的电压。当它电量不足的时候,及时充电。因为锂电池是没有记忆效应的,所以呃,这个哪怕是。呃,哪怕是这个刚用了一点儿啊,再去充其实也不会影响到电池的这个性能,反而对电池来说会更好一些。对于锂电池来说,嗯,然后呃,刚才提到这个电池电压,然后另外就是电池的这个。固定啊,这车模上已经给大家预留了这个电池的一个固定舱,然后用这个用一个这个橡胶环儿去把电池。就是雷豆里边。这样的一个形式,这样的话,电池左右是不会产生这个晃动的,然后但是呢呃,这个电池仓呢,为了给大家预留更多的这个空间,更多的可能性呢。是比电池要大一些的哦,这个地方呃,如果在车模运行过程中,这个电池来回晃可能也会影响到车模的运行,所以这地方大家可以考虑加一下这个Eva的一些软片啊,或者是这个海绵之类的去把。这个电池呃,让它更稳定一些。也是比相对比较简单的,这个处理方案。嗯,然后再之后就是电路板,还有传感器相关的一些东西呃,电路板和传感器呢,作为这个车模运行稳定性的重要的。这个非常重要的部分呃,相应做结构的同学对他们的防护也是比较重要的。呃,一方面呢,是刚才提到的这个h bod板卡上面,我们会呃免费附赠这个,这个亚克力的外壳。然后呃,大家自己自制的这个电路板上面也可以考虑用这样的形式啊,亚克力也好,或者是其他材质的可以去做一个外壳,这样的话能够。呃,极大程度的去避免有一些这个像呃螺丝啊,或者是一些碎屑以及工具啊,去掉落到电路板上去,对电路板造成损害,以及这个手去直接触摸上面的气。件可能会造成一些这个腐蚀啊,或者短路的情况。这个啊,外壳的形式呢,相对比较灵活一些,然后另外的防护,常见的防护形式,还有这个。去喷一些这个三方漆啊,假上喷完漆之后就不好做修改了,然后还有就是在电路板底部去做这个。使用这个绝缘胶带去进行贴贴上进行防护,或者是Eva的,这这个这个。呃,这些泡棉之类的啊,去做绝缘啊,因为我们这这个底板啊,车模的底板使用的是碳纤维的材质。呃,碳纤维呢?它这个机械性能特别好,而同时呢,它也会导电啊这个。所以大家这个在处理电路板的时候,避免去把电路板直接放置在这个。这个碳纤维板上去上电啊,就是可以在电路板底下去做一些支撑结构,或者是做一些绝缘来避免这个事儿呃,之前同学们也有反馈说在这个。呃,接触到了碳纤维板导致的这个短路,然后烧坏了电路板。所以大家也注意一下这个东西。嗯,然后另外呢?就是摄像头的防护呃,摄像头呢?上面也有电路板嗯,电路板处理的思路跟刚才说的也是类似,然后另外的就是摄像头作为。车模运行还有这个。这个程序决策的重要的主要的信息来源,绝大多数的信息都是来源于摄像头,所以在这个高速运行的过程中呢,它的。呃,高度。固定的高度以及角度啊,都会对采集出来的信息有很大的影响啊,所以在这个。呃,调试到一定阶段,或者是已经定型的时候,还是建议大家去把这个地方把这个呃高度和角度啊,去固定的更牢一些。嗯,然后之前我们的做法呢,实际上就是呃,基本定型之后会用这个AB胶。去把这个各个能摄像头这个固定件儿,上面各个能活动的部分啊,都给它粘死。啊,就是确保它在运输过程中啊,以及这个存放的过程中啊,不会确保它不会被这个。被改变它的角度啊,确保这个整个车模运行的稳定性和一致性。嗯,然后再然后就是轮胎处理呃,如果是这个呃,了解以前的比赛或者是。这个参加过呃,其他组别可能对于这个轮胎处理这块儿也是会有比较深的这个。这个理解啊,就是。轮胎轮胎处理呢呃,我们出厂的这个轮胎呢,是跟其他车模系也都是一样,这个轮胎和轮毂是没有进行粘合的。啊,轮胎里面是填充的这个海绵啊,是一个整个儿的海绵圈儿啊,填充到里面啊,大家就就是可以根据实际的调试情况呢去。呃,调整这个海绵的硬度啊,或者是海绵填充的量啊,其实都是可以的,然后。还有就是这个轮胎的一些表面处理就是俗俗话说的这个磨轮胎。然后因为我们新的车模在设计的时候呃呃,设计这这块儿我们都是参加过相应比赛的人嘛,也对对于这个轮胎的这个特性。相对比较了解呃,选择的这个材料呢,以及轮胎的这个形状厚度啊都是。呃,经过测试是不不需要经过这个很复杂的打磨,它就可以很柔软,然后那个呃能够提供比较大的这个。啊,比较强的这个抓地力啊,大家可能需要做的处理呢,就是把上面这个胎线,也就是这个合模线啊,可能做一些这个。呃,平滑处理啊,就可以达到一个比较好的效果嗯,然后再就是呃胎皮和这个轮毂之间的粘合。啊,一般呢呃像不管是玩这个。这个这个就rc车模的,还是我们这个智能车比赛的这个车模都会选择把轮胎和轮毂。这一圈儿外边儿这一圈儿给它粘上,就是包括外边儿还有里边这个里面哈,都给它粘上。啊,这样的话可以极大程度的避免在车这个车轮高速旋转的时候把这个胎甩大了之后从。从这个轮毂上面脱下来,然后也可以避免在车这个直线呃急加速急减速的时候这个。这个轮胎受到的这个轴向力就是让它旋转的。让这个车轮儿旋转的这个力,然后呃使轮胎和轮毂之间有一个相对的位移。然后也能避免当转弯儿的时候,轮胎受到比较大的侧向力,它这个胎从上面从这个轮毂上面滑脱下来。嗯,这个比较轻的话,会影响到这个比赛的这个。和这个这个车模跑的状态哈比较严重,可能呃,就是别住哪儿啊,可能会损坏车模,甚至是这个造成人身伤害,所以这个地方也是比较重要的一点。然后粘贴这个轮胎呢,可以使用这个3m的七零幺的胶,效果是相对比较好的嗯,然后呃,网上也都能找到这个。呃,轮胎粘贴的一些这个教程嗯,大家也可以去搜一下嗯。然后最后呢,轮胎的最主要的这个效果能体现出来呢,其实主要还是它的表面清洁。呃。参加过比赛或者看过比赛的一般这个每次跑出来之前都会呃拿个抹布把那个。半干的抹布去擦一擦这个轮胎的表面,把表面的这个浮灰去擦掉,然后轮胎这个场地跑过几次之后也会。用抹布擦一擦,把表面的浮灰啊,以及这个啊异物啊,去擦掉啊这些。呃,实际上这个这个这些灰灰尘是影响呃,轮胎摩擦力的一个比较重要的。这个因素啊,所以保持轮胎的清洁以及赛道的清洁啊,也会极大的提高轮胎的这个摩擦力,提高我们的这个。呃,车模的这个运行速度。嗯,好,然后再往后走的话就是这个避震器和差速器这块儿啊,咱们先说差速器吧,差速器的话。就是之前做过a车模或者是呃b车模的这个同学们可能会知道。呃,这两个车模呢?同样也是后驱的单电机的车模,但使用的是。这个滚珠式的这个差速器在这个齿轮两侧啊,在齿齿轮中间嵌入嵌进去滚珠,然后这样两边儿两个摩擦片可以让它。相相对相对反的这个运动呃。这个它的那个松紧程度呢?是可以调的,可以调节的,然后像这个咱们这里面呢用的实际上是一个。呃,机械式的齿轮差速器就是跟真车上面用的这个结构,基本上是结构原理,基本上是一样的。这种形式呃,这个带来这个好处呢,是相对比较顺滑,而且这个。呃。结构呢,比较仿真啊,但是这个。也会也也是相对有一些问题,就是它不可以调这个呃。就是刚才所说的这个顺滑程度,你是给它调调到这个呃差速非常灵敏,甚至是把这个差速。就是直接给它调没这个也是根据大家这个比赛的时候不同的这个控制策略,可能会应用不一样的这个参数。这咱咱们这里面呢,可以用一个方式,就是在这个差速器里面就是可以拆开的啊,里面可以。去换一些这个呃,不同年度的一些阻尼油啊什么的来调节这个。来调节这个插速器的这个灵敏度。然后另外呢,这个避震器里面也是一样,都是用这些模型的避震器,油可以不同年度的,也可以调整它的,这个阻尼的。阻尼的大小啊,然后另外呢,通过这个更换弹簧或者是调整弹簧可以呃,这个改变这个。改变这个,这个避震器的这个特性啊,然后也可以调整它的行程。来去调整呃,然后。多补充一个,就是我们的主减速器这一块儿,实际上是一两个,这个散齿轮儿啊,捏合到一起。它是一个外露的,一个齿轮结构呃,这个地方呢,非常不建议大家去。在这个地方去上呃润滑油或者润滑脂嗯,因为如果是上这个粘度比较低的润滑油的话,基本上这个高速转起来。呃,跑一会儿啊,油就甩没了,而且可能会甩到哪儿都是啊,然后如果用粘度比较高的这个润滑脂呢?嗯,粘度比较高,它能粘到齿轮上,不会被甩掉,但是同时呢,它也会粘一些灰尘,还有这个。呃,碎屑在上面啊,是石子儿啊什么的,甚至呃,反而会对这个齿轮儿呃造成一些影响,增加它的磨损,甚至是有这个大的异物进去,可能会直接造成它的损坏。都是有可能的。我不是道是不是?嗯,然后咱们再往后走,就是到这个车壳儿,这块儿车壳儿这块儿实际上胜座,刚才都已经跟大家。去说过了啊,然后我这儿也呃,再说两句儿就是车壳儿上呢呃,车模自带的这个车壳儿呢呃,在两侧就是。呃,预留好安装电路板的位置,都做了一些开口儿,做一些可以可以画了一些虚线可以抠掉的这样的一个一些结构。呃,可以满足大家这个接口外露调试接口啊,还有这个这个充电接口啊等等一系列接口外露的这种需求。然后上上方呢,在这个碳杆儿固定的这个位置呢,预留了一个。呃,上方的一个开口啊,可以实现这个。就是这个杆儿,从这个壳儿里面穿出来,然后安装传感器这样的一个形式,然后车壳儿的。除了这个外形上大家发挥想象去进行设计,然后结构上的优化呢呃,我这里也可以给大家提供一些思路就是。可以往这个车壳儿的快拆,或者是免拆这方这方面去这个考虑。呃,因为在这个比赛,特别是现场比赛的这个过程中呢,时间是相对比较紧的啊,像如果里面有一些这个参数啊,或者是有一些东西需要调。啊,实际上是需要一些外露接口或者外露的按键啊之类的这种东西啊,甚至说是我们这个换电池的时候啊,想要速度比较快。啊,不影响这个调试时间啊,都是可以先考虑一下,在外壳上做出相应的这个快拆或者免拆的结构啊,比如说开个门。呃,把这个电池拿出来,或者是呃那个调整一下,里面的某个结构,某个电路。然后在车运行的时候把这个门关上啊,它不会自己就是有一个锁定机构,让它不会自己打开。啊,等等,这样的这个方式算是给大家提供一个思路。嗯,再之后呢,其实就是一些整车参数的调整,就是可能对于。对于这个呃参赛参赛的同学们来说啊,就是收益性可能没那么强。就是算是一些比较进阶的一个。一些内容啊,第一个是这个对称性的优化啊,对称性呢,其实呃,主要是体现在转向上面,比如说座机同样。往左面给给一个10度的一个打角和给往右边给一个10度的打角,那它在左左边儿右边儿转向出来的这个比如说转向。转弯的这个半径啊,还有特性啊,应该表现的是一样的,这是比较理想的状态吧啊,但是实际的这个控制过程中呢,因为。舵机的这个啊里舵机里面也是电机嘛,因为它左右这个。呃,这个这个正反转出来的,这个呃性能差异啊,以及微小的这个微小的变化可能都会影响到它的这个转向的,这个对称性。嗯,为了保证这个对称呢,首先是结构的对称啊,就是尽尽可能排除这个结构,因为是最最简单最直观去能调对称的东西。啊,所以就是比如说这个转向的这个拉杆儿的长度啊,可以比较容易的去判断它是否相等?啊,然后。呃,舵机的转转的角度也比较容易判断,那最后终反应到轮子上面,轮子动的角度是不是一样?这里面可以给大家分享一个小技巧,就是在这个轮子轴的外面,实际上是一个螺纹m4的一个螺纹。呃,我们可以呃,就是呃,弄一个比较长的,这种内螺纹的铜柱儿也好,或者是杆儿也好。去给它拧在上面,拧在上面。这样的话,这个将这个前轮儿转向的这个角度可以进行一个放大。比如说在这边儿,可能这个轮子上面看出来啊,好像差不多,但是给它延长出来发现。这个两个一测量发现可能就差了一厘米,那它这个角度肯定就是没那么对称,就是如果是为了精细的调整调整的话,可以用这样的。这个放大的,这种放大误差的,这种形式来去判断啊,如果是这个速度比较低,或者是要求不是很高的情况下,其实用这个。目测的方式去给它做对齐,其实也能够满足这个绝大多数的这个车模的要求。嗯,然后转向的对称,再就是这个重心分布的对称,重心分布的对称呢,其实呃。啊,这里面这个对称性,这里边儿说的主要是从这个中轴线上来看啊,是不是这个重心在这个中轴线上?然后同时呢,就是下一条,其实是一个重量的优化呃,那个后面提到的这个重心呢,实际上是这个车前后的重心的一个分布。然后这个重心分布呢,可以用同样的方式去测量。就是我们在这个呃,找一个一个水平的,一个面儿,一个桌面儿,或者是地面。在这个车轮底下,四个轮儿分别放一个这个小秤,就是这种称首饰的称首饰啊什么的。那个这种特别小的啊,特别小的秤啊,可能这个几百克的这个量程。这样的话,可以通过四个轮上面的这个呃称的示数来大致的判断重心的分布,基本上可以。呃,反映出来这个重心的这个分度分布情况,然后可以根据自己的这个需求啊,或者是。呃,根据这个啊,试出来的这个经验啊,去调整一下这个,或者是按照这个理论哈。呃,去调整这个重量,这个重心的这个分布啊,去做一些减重啊,增加一些配重啊,甚至是做一些布局的调整。嗯,因为车模的改动,上面除了这个电机。呃,不能这个位置上不能做改动其他的东西呃,这个像多机的安装形式啊。然后呃,像这个板卡电池安装的位置,实际上都是可以调整的啊,大家也可以按照自己的需求去。做一些调整,虽然车模上已经预制了一些东西啊,但是如果是要求比较高,或者是其他的额外的要求,也是可以做一些。呃,改动的当然这个相应的性价比可能就会低一些啊,改动的地方就会多一些。然后车模关于这个车模优化,这个就是呃,大致上就是这些内容啊,里面也是包含了一些这个小技巧啊,还有一些小经验。在里面。嗯,然后后面呢,就是有一个电池的这个使用的注意事项啊,之前也提到了这个电池呢,实际上。这个锂电池这块儿,大家之前可能接触的相对比较少呃,这个地方呢,也是再跟大家去介绍一下锂电池使用的一些注意事项。嗯,然后它的一些基本参数。嗯,先是电池,我们这个锂聚合物电池的这个特性呢?我们看手里拿的这个电池哈,它是一个这个软的,一个电池包里面是由三节这个锂电池。啊,叠加成的啊,就是我们可以看这里面这个3s3s就是代表这个三节锂电池就是三点七伏一节。然后三节儿额定电压就是11点儿,一伏就是我们俗称的,就是会把它近似成为12伏的电池。然后容量的话是2200毫安时嗯,放电倍率啊,这里边就直接换算成这个放电电流哈,放电电流就是。就是55安,然后充电的被充电的这个电流呢呃,推荐大家使用这个一点儿一安也就是零点儿五c这样的一个。呃,电流去充电,这样的话会。会增就是会增加这个电池的这个使用寿命啊,使用这个电流的话,如果完全电池完全用干了的话。呃,基本上是两个小时能够充满像一般到达使用的这个。使用呃,使用到的这个比较低的值,也就是呃,到这个呃三点儿就是每每个电芯儿哈三点儿四到三点儿七伏,这样子可能就要充电了。这时候呢,基本上就是在一个小时左右就能把电池充满,然后这样的话,几节电池去替换这个。我们就是按照大家这个调调试的这个强度啊,可以去多备一些这个电池啊,这样的话。呃,能极大的延长这个电池的寿命,要不然就用大电流充电,或者是电池电压用的过低。呃过放了啊,很有可能会损坏电池或者是电池鼓包等等一系列的情况出现,这个电池相对还是比较脆弱一些。嗯,当然,它的性能也是绝对的好啊,能到55安的这样的一个放电电流。呃,说完电池呢,就是给大家介绍一下这个,咱们跟电池一起搭配的这个。刚才提到的这个报警器啊,以及充电器的一些使用,然后可以给大家做一下演示。呃。我们可以看哈电池上呃,正常使用的时候正常的这个锂电池呢,都是有两个口儿呃,一个是比较粗线的。一个是比较细线的,就是上面有图里面这个呃粗线的,这个就是两根儿线,就是总的输出口儿就是十一点儿一伏的电,都是从这儿输出来。嗯,它可以。用作什么呢?一个是跟这肯定的,就是电电流的输出,这肯定是。然后另外呢是?平衡充电还有普通充电,这是普通充电,我画了个画了条线啊,这里面不推荐大家对这个动力电池。进行这个普通的充电,普通充电就是啊,只用这一个输出头儿啊,反向去给它提供这个。提供提供相应的电压电流去给它充电啊,不推荐大家这样使用,然后一会儿说到这个充电器的时候演示充电器的时候也会再次跟大家说一下,这个模式是什么情况?然后输出口儿用的是软硅胶线14 awg呃,是一个美标的一个线。啊14a的fg就是线的,这个线粗线号嗯,然后软硅胶的话是能达到一个比较高的。呃,这个耐温的一个效果啊,同时这个线线材比较比较柔软啊,比较好,这个在车里面。特别是加了车壳之后,比较方便去这个布线。然后另外一个小的白色的这个接头儿呢,是这个电芯接口儿啊,是由四根线。嗯,其中一根儿是红的啊,这个是其实是把里面三个电芯儿,每个电芯儿就是都接出来了。就是两两端都接出来,因为三个电池是串联的嘛,所以一共接出来呃四根儿线,这样的话,每相邻的两根儿线之间就是相应的。电芯的电压。这个口儿呢,主要是用来平衡充电,以及做一些这做这个电压监测啊,去使用的。好,那我们又提到这个锂电池报警器。延迟报警器的话,实际上是这个。呃,里面有两颗非常大的这个蜂鸣器,或者能发出非常响亮的声音啊,一会儿我插上的时候就应该可以听到我这用手捂着点儿。声音比较大,比较比较这个刺耳一些就是这样的话,也会这个电池有什么异常情况啊,如果是插着这个报警器的话,就马上就能。就是哪怕离得很远也能听到。然后按照图中的形式,在这个电芯的接口儿,把这个电芯的接口儿,这个呃红线啊,朝着右。然后再插到这个报警器底下有一排这个排针孔,因为它支持的电压电电电池电芯儿。会很多,所以咱们就是靠靠近最左边,把它插进去。插进去之后呃,如果是插的正确了,那这个上面会会有相应的数字显示显示的是什么呢?就是。每所有这个这个呃电池总电压以及每个电芯儿的电压,你看三,然后这个是三三点儿几伏,这是每个电芯儿电压,然后all。十一点六伏就是整个电池的电压。比如可以用这个,一个是可以用这个报警器去做一个电压的监测,另外呢,我们长按这个长按上方有一个按键。长按呢,可以调整这个。然后再再去短按,可以调整它报警的最低最低的这个电压也可以,当然也可以关闭这个报警哈。就是嗯,如果大家在这这在这个自制的电路板中没有设计这个稳压的电路,那可能把这个电池。呃,报警的电压就设到了三点儿七伏,也就是到十一点儿一伏,这样的话不会影响到板卡以及电机的一些供电。呃,能让电池保持一个比较高的电压,比较这个稳定的性能能发挥出来。啊,然后如果是电路上做了这个12伏的稳压呀,等等这一系列的操作,那可以把。这个相应的报警的电压调到这个三点儿二三点儿四呃,不推荐大家把这个电压调到非常低的情况啊。调的非常低的话,这个可能会影响到电池的这个使用寿命啊,不不要不要把这个电池用到电压很低了才去充电。然后这是锂电池报警器的,这个使用如果是低于设定的电压,就是有电芯儿低于这个电压了,那它就会。这个伏鸣器非常大声的会哔哔哔响嗯,然后提醒来进行充电。嗯。然后建议呢,建议大家使用的过程中始终连着它去使用啊,这样它耗电到。一定程度之后报警也就知道什么时候要充电了,然后。OK,那后面再说一下,这个车模配套的这个小的这个充电器20瓦的一个充电器。啊,这个充电器呢?相使用起来相对比较简单,就是把它供上电之后啊,三个灯啊,分别对应着三个电芯儿。的这个呃充电状态,然后底下有两个接口,一个是充这个2s电池的七点几伏的,这个电池的另一个是充这个就是咱们这个3s十一点一伏电池的。只需要把这个呃电芯儿这个电池的电芯儿接口儿啊插进去。就哪个能插进去就是对的,插进去之后我们可以看三个灯都变红了,就代表三个电芯儿同时都在充电。也这也就是我们所说的这个平衡充电的这个效果,也就是通过这个。电池接口对三个电池呃分别进行充电,分别进行电压管理,这样的话充。这个充充满了之后,三个电芯儿都是满电的状态,而且那个。时间也都是差不多的啊,这样的话就是能极大程度保证电芯儿在放电的时候,它们的这个状态是基本一致的。呃,要不然有一颗有一颗电芯儿,它的电压低,那可能会造成两个人在干活,一个人在旁边看这样的话。这个。对对,这个另两个电芯儿可能会增。增加它们两个的压力哈,就是缩短这个整个电池的使用寿命。然后呃,充满了之后呢?充满了之后这个灯相应的会变成绿色的,就是有可能会出现先绿了一个,然后。呃,另外另外两个陆续才变绿呃,当然也有也有可能会是什么呢?就是在充电之前一定要先测一下这个电池的电压。就是各个电芯儿的电压是不是正常的呃,因为这个充电器呢,是一个普通充电器,如果里面电芯有损坏啊。或者是其他的状况发生,就是它是不会,就是有报警啊,或者是有这个,它是不会采取相应的一些智能策略去。避免这个呃,避免这个这个这个问题发生。嗯,当然它的这个好处就是比较方便啊,就是网上插上就行,不用做什么设置,然后尺寸也。体积也相对比较小。然后这里面有两个注意事项,一个是充完电之后充,充完电之后一定要把这个。这个电池接口从这个充电器上取下来,然后避免这个电池反向再给这个充电器供电。啊,造成这个里面这个呃电芯儿的电压的不平均,然后另外呢就是呃充电的时候呃务必。要有人看守,就是在同一个屋子里面啊,避免这个充电的过程中啊,发生一些危险啊。这样的话,可以及时发现。嗯,最后的话就是我们的这个大的这个锂电池充电器嗯。可以看到,这个蓝色的,这个b6的,这个充电器。相应的,它的这个呃尺寸啊,会比较大一些,然后。对应的它功率啊,还有这个功能啊,都会比这个刚才看到这个小充电器要强大。强大很多嗯,我们一般用这个啊,用这个。b6的这个充电器呢,会选择这个看PPT上面这个啊理波balance这个模式。也就是锂电池平衡充电这样的一个模式。然后我们可以看到哈,就是上电了之后,这个机器已经自动开机了,自动开机之后默认的这个。这个画面啊,离近一点儿,默认的画面显示的是呃。滤波charge就是锂电池充电就其实这是一个普通充电模式呃,这种充电模式是用什么呢?就是。用这个电池的总输出口。就是刚才说的这种普通充电形式,总输出口儿只需要插总输出口儿,然后这边儿提供一个这个12伏的这个或者是。这个12伏的这个充电电压去给这个电池充电。然后呃,这里面呢,我们还是要用这个平衡充电的形式,让每个电芯儿。均匀充电,就刚才那种形式呢,它就是一股脑的把电充进去了,就是不知道每颗电芯儿电压是多少啊,不能做精细化的管理。啊,所以我们可以按一下这个方向键啊,调到第二个,其实就是这个礼炮balance就是平衡充电的这个。这个模式啊,调到这个模式呢,就是大家买的新设备啊,可能是呃,默认的是一个比较高的电流和比较大容量的。这个大电压的电池,我们可以按这个确认键啊,这个看这个数字闪动了之后把电流调到刚才推荐的一点儿一安。然后再按一下,可以调节这个电池的这个电压啊,我们就是3s的十一点儿一伏。然后再按确定啊,确定好上面的这个电池的参数啊,一点儿一安,然后十一点儿一伏。然后我们长按确定键。然后会会小叫一声,然后你看现在会有一个报警,这个报警是因为我没插电池。没插电池,所以会产生一个报警,这个这个充电器的好处就是当你的电池出现问题的时候,它是不会给你充电的。嗯,就是避免充电的过程中发生一些危险,就是它会有一些这个策略在里面。包括充满的时候,它也会这个分明器响起来去提醒已经充满。然后我们可以在这个附带的这个呃线材盒里面去找到这样一个线啊,一头呢是跟电池上面去配套的这个梯形插头。然后另一头呢,是这个香蕉头跟这个呃设备上面的啊。这个接口相对应的,我们先把这个橡胶头插到设备上,红色对红色,黑色对黑色。然后把这个梯形插头插到电池上,然后另外呢设备这个侧面有一些白色的接口。我们要把白色的接口也接上,就是插到4p的那个能捅进去的孔插上去。OK,然后我们重复刚才的步骤,我们再长按。OK,会弹出来一个确认界面。呃,让我们确认是不是3s的电池,那我们确认。然后再按一下,就这时候就已经开始充电了,上面上面显示是锂电池3s,然后充电的电流现在已经跑到了一点一安最大电流了。然后电池的电压目前是十一点儿七四伏啊,正在充电,然后底下呃bal balance充电的模式,然后充电的时间。这样呃,在这个状态就可以,这个电池就正常进行充电了,然后充满之后啊,设备会这个蜂鸣器会响起来。啊,然后提醒你把这个电池就是取下来,已经充满了。嗯,然后如果中途呢?这个电池断。断连了,或者是这个出问题了,它也会产生报警,比如说我把这个线拔下来。OK,他这边就会就会这个产生一个报警的,一个声音嗯,然后避免这个电池充电过程中出现。这个问题出现意外啊,它会及时停止这个充电过程,然后这这里面这个我们刚才同时连接了这个。电池的屏这个电芯儿接口儿,还有这个总输出接口儿,这也是一个安全策略,就是在充电的过程中监测电电池的整个儿的电压。然后确保每个电芯儿都是没有问题的,否则分开管理的话,可能一号儿电芯没问题,二号儿电芯没问题。三号儿电芯可能出了问题,但是三号儿电芯自己不知道啊,监测一下总电压就知道可能会。可能是某个电芯儿出了问题,然后设备就会产生相应的报警嗯,同样的这个。充电的时候啊,这个设备充电的时候也必须要有人去看守啊,避免这个充电过程中啊,电池出现一些危险的情况。嗯,然后同时呢这个呃。这个锂电池充电器呢,还有一些。还有很多其他的功能哈,其实不不只是充锂电池,就是锂电池充电的功能里面呢,我们可以再往后按,刚才是从这个charge普通充电模式,然后平衡充电模式,再往后的话就是。这个快速充电的一个模式啊,然后我们其实我们的这个。呃,我们的这个这个动力锂电池哈,不推荐去用其他的那个平衡充电。以外的其他模式去充,偶尔一两次可能着急还OK,但是经常这么充的话,对电池的寿命影响非常大。然后再往后摁的话,会有一个这个锂锂电池,这个s一个储储存的一个模式。也就是电池电压会不会充满会充到一个呃中间位置比较适合储存的电压,就是比如说呃今年。这个呃比赛比赛结束之后,电池需要存起来,可能几个月之内不会用啊,把电池设置到这个档,然后去充到相应的电压。比较合适的电压啊,就可以长期的这个储存。再往后的话,会有一个。呃,discharge就是放电的一个模式。啊,这个锂电池的话,用的可能相对会比较少。嗯。然后就再按的话就回去了啊,这样的话就是锂电池这几个充电的功能,然后我们按最左边儿这个。呃,电池类型的这个按钮呢?它会弹出来,现在我们默认的是啊,锂电池的模式,我们再摁的话会有。涅氢电池,涅癖电池,还有铅酸电池。啊,后面是一些设置啊,等等,这几种常见类型的也是这个之前智能车比赛所用的电池的类型。也都可以用这个充电器来充,前提是大家就是已经熟悉了这个充电器的这个呃操作模式啊,还有这个。呃,内容当然像这个涅合电池这种存在记忆效应的,里面的这个涅合电池里面也会有相应的放电功能。啊,就是啊,把电池啊电量放干了之后啊,再去充电,这样的话可能保持电池的这个容量。啊,这是针对那个涅硅电池啊,型电池这块儿的这个一些内容啊,这也也就不多说了嗯,就是。有需要或者是感兴趣的同学呢,也可以,就是详细的去呃了解或者设置一下这块儿的内容。行,然后这个关于电池的使用呢,还是需要再提醒一下大家这个。我们的这个动力锂电池呢?放电电流呃,非常大啊。相应的,它这个也是比较活跃啊,可能会在这个充电以及使用过程中可能会发生一些危险。啊,大家这个在使用过程中尽量避免啊,尽量这个有人去看守,尽量监测它的电压,避免损坏,还有这个危险的发生。嗯,好,那关于这个。呃,车模的这个。就实际的这个调整啊,还有这个里面呃电池相关的一些描述呢,就是主要就是这些。呃,然后嗯,后面呢就是主要是看大家有没有什么其他的这个呃问题啊,我和胜座这边儿。也可以为大家去做一些。跟大家做一些交流。嗯,好的,大家有什么问题吗?可以,就是跟我们的结构工程师嗯,刘老师和那个张老师进行嗯,就是。交流一下。啊,我看哈就是有同学已经发出来了,一个是小车。上坡防撞会卡。啊,实际上我们这个车模的它的这个防撞结构,还有这个底盘是分离的。分离的这样的一个尺寸呃,如果这个。如果是这个,大家在上坡儿的时候,这个呃上面会有一些,这个就是刮蹭啊什么的,可以适当的。把这个防撞结构往上调。嗯,或者是呃,这个自己设计,其他的结构去改变它这个整个儿的这个形状啊,都是没问题的。这个我们车模上也是预留了这样的,这个这样的一个调整方式。嗯,然后我们看已经推荐的左泥油呃,这个螺纹油。呃,这个具体没有。没有品牌去推荐哈,就是呃,基本上在这个淘宝上去找到的这些。这个螺纹胶应该说的是螺纹胶,然后阻尼油呃是都基本上都能满足要求,这个也没有什么。特别的这个推荐啊,就是特就是这里面可能就一个粘轮胎的,这个胶有一个特特别推荐3m的,这个七零幺。用的相对比较多啊,其他的东西都是其实都是普通的,普通的就能满足要求嗯。嗯。好,如果是呃,现在一时想不起来,或者是没有做到这个呃,没有在这个结构上做太多的这个处理啊,大家没有其他问题的话也。
对线上程序的研究 2024.12.15
运行线上基线程序可能会出现的报错
TypeError: declarative() got an unexpected keyword argument ‘full_graph’
目前采用的是2.5的版本 没有问题
基线代码解析
%cd ~ #魔术指令
# 注意,如果你开启的环境不是GPU模式请自行更换环境
!git clone https://gitee.com/PaddlePaddle/PaddleDetection -b release/2.6
在 Jupyter Notebook 或 JupyterLab 的代码单元格中,可以使用 ! 前缀执行系统命令,包括 pip install。
https://blog.csdn.net/jd1813346972/article/details/137274345 魔术指令详细介绍
#安装PaddleDetection
%cd PaddleDetection
!pip install -r requirements.txt
# 编译安装paddledet
!python setup.py install
%cd ~
# 解压数据集
!unzip -oq /home/aistudio/data/data257994/Car2024.zip
import os
#生成train.txt、val.txt
xml_dir = '/home/aistudio/Car2024/annotations'
img_dir = '/home/aistudio/Car2024/images'
#初始化一个空列表path_list,用于存储图像路径和对应的XML标注文件路径的元组。
path_list = list()
#使用os模块的listdir函数列出img_dir目录下的所有文件(在这个上下文中指的是图像文件),并对每个#文件进行迭代。
for img in os.listdir(img_dir):
#使用os.path.join函数将图像目录路径和图像文件名合并,形成完整的图像文件路径。
img_path = os.path.join(img_dir,img)
#将图像文件名中的.jpg扩展名替换为.xml,以匹配XML标注文件的文件名,并将XML目录路径和修改后的文#件名合并,形成完整的XML文件路径。
xml_path = os.path.join(xml_dir,img.replace('jpg', 'xml'))
#将图像路径和对应的XML路径作为元组添加到path_list列表中。
path_list.append((img_path, xml_path))
#打开或创建一个名为 train.txt 的文件用于写入('w' 模式),路径是 #/home/aistudio/Car2024/train.txt。
train_f = open('/home/aistudio/Car2024/train.txt','w')
#。。
val_f = open('/home/aistudio/Car2024/val.txt','w')
#遍历 path_list 列表,enumerate 函数用于获取每个元素的索引(i)和值(content)。
for i ,content in enumerate(path_list):
#将 content 元组中的两个元素分别赋值给 img 和 xml 变量,这里假设 content 是一个包含图像路径和#对应XML标注文件路径的元组。
img, xml = content
#text = img + ' ' + xml + '\n':创建一个包含图像路径、空格、XML路径和换行符的字符串。
text = img + ' ' + xml + '\n'
#检查索引 i 是否是5的倍数,如果是,这意味着当前的路径组合是每5个中的一个,通常用于划分数据集。
if i % 5 == 0:
#如果当前的索引是5的倍数,将文本字符串写入验证文件 val.txt。
val_f.write(text)
else:
#将文本字符串写入训练文件 train.txt。
train_f.write(text)
train_f.close()
val_f.close()
xml文件https://blog.csdn.net/rainingCSDN/article/details/143905744
# 本部分代码为统计标签数量
import os
from unicodedata import name
#导入xml.etree模块并将其别名为ET,这个模块用于解析和创建XML文件。
import xml.etree.ElementTree as ET
#导入glob模块,它提供了一个函数glob,用于查找符合特定规则的文件路径名。
import glob
def count_num(indir):
#改变当前工作目录到indir参数指定的目录。
os.chdir(indir)
#列出当前目录下的所有文件和目录。
annotations = os.listdir('.')
#使用glob模块搜索所有以.xml结尾的文件,并将它们存储在annotations列表中。
annotations = glob.glob(f'{str(annotations)}*.xml')
#初始化一个空字典dict用于存储不同标签的数量。
dict = {}
for file in annotations:
in_file = open(file, encoding = 'utf-8')
#解析XML文件并返回一个ElementTree对象。
tree = ET.parse(in_file)
#获取XML文档的根元素。
root = tree.getroot()
for obj in root.iter('object'):
#在object元素下查找名为name的子元素,并获取它的文本内容,即标签名。
name = obj.find('name').text
#如果标签名已在字典中,增加其计数,否则在字典中为该标签名设置计数为1。
if name in dict: dict[name] += 1
else: dict[name] = 1
print("各类标签的数量分别为:")
for key in dict:
print(f'{key}: {str(dict[key])}')
indir='/home/aistudio/Car2024/annotations' # xml文件所在的目录
count_num(indir) # 调用函数统计各类标签数目
%cd ~/PaddleDetection
# 生成训练集
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir /home/aistudio/Car2024/annotations/ \
--voc_anno_list /home/aistudio/Car2024/train.txt \
--voc_label_list /home/aistudio/Car2024/label_list.txt \
--voc_out_name /home/aistudio/Car2024/train.json
# 生成验证集
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir /home/aistudio/Car2024/annotations/ \
--voc_anno_list /home/aistudio/Car2024/val.txt \
--voc_label_list /home/aistudio/Car2024/label_list.txt \
--voc_out_name /home/aistudio/Car2024/val.json
# 这里的命令指的是替换配置文件中的数据集文件,以免有些同学不会修改
!echo "romve the old dataset config"
!rm ~/PaddleDetection/configs/datasets/coco_detection.yml
!echo "copy new config to target dir"
!cp -p ~/coco_detection.yml ~/PaddleDetection/configs/datasets/
!echo "complete! is your show time please~"

# 模型训练
# 这里的代码已经开启边训练边评估,如果需要节约时间就吧--eval参数删除
# 如果要恢复训练,则加上 -r output/picodet_m_320_coco_lcnet/best_model
# 这里因为开启了eval,所以会每次评估的时候更新最优模型
%cd ~
%cd PaddleDetection
!python tools/train.py \
-c configs/picodet/picodet_m_320_coco_lcnet.yml \
# --eval \
--use_vdl=True \
--vdl_log_dir="./output" \
关于训练模型 https://gitee.com/paddlepaddle/PaddleDetection/tree/release/2.6/configs/picodet
模型配置参数
#这是一个基础配置列表,包含了几个YAML(Yet Another Markup Language)配置文件的路径,这些文件定义了数据集、运行时的环境设置、优化器设置等基础配置。
_BASE_: [
'../datasets/coco_detection.yml',
'../runtime.yml',
'_base_/picodet_v2.yml',
'_base_/optimizer_300e.yml',
'_base_/picodet_320_reader.yml',
]
#指定了预训练权重的URL,这是在开始训练之前加载的权重,可以帮助模型更快收敛或者提高性能。
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_0_pretrained.pdparams
#指定了训练完成后模型权重保存的路径。
weights: output/picodet_l_320_coco/best_model
#设置为 True 表示在训练过程中检查未使用的参数。
find_unused_parameters: True
#设置为 true 表示使用指数移动平均(Exponential Moving Average)来跟踪模型参数。
use_ema: true
# 指定了训练的最大轮数。
epoch: 250
#指定了保存模型快照(snapshot)的频率,这里是每10个epoch保存一次。
snapshot_epoch: 10
# 定义了网络的特定部分,scale 和 feature_maps 指定了网络结构的一些参数。
LCNet:
scale: 2.0
feature_maps: [3, 4, 5]
#定义了另一个网络组件的输出通道数。
LCPAN:
out_channels: 160
#定义了检测头的配置,包括卷积特征的名称、输入输出特征图的维度、卷积层的数量、步幅(stride)、归一化类型等。
PicoHeadV2:
conv_feat:
name: PicoFeat
feat_in: 160
feat_out: 160
num_convs: 4
num_fpn_stride: 4
norm_type: bn
share_cls_reg: True
use_se: True
feat_in_chan: 160
#定义了学习率的策略,包括基础学习率和两个调度器(scheduler)的配置。
LearningRate:
base_lr: 0.12
schedulers:
- !CosineDecay
max_epochs: 300
- !LinearWarmup
start_factor: 0.1
steps: 300
#义了训练数据读取器的配置,比如批量大小(batch_size)。
TrainReader:
batch_size: 24
微信公众号 程序介绍https://mp.weixin.qq.com/s/4pp__UeCyl5yQG6WLnXUwA
研究基线代码 2024.12.15
对于icar:
61行
shared_ptr<Detection> detection = make_shared<Detection>(motion.params.model);
C++ 中使用智能指针 std::shared_ptr 来管理一个 Detection 类型的对象
std::shared_ptr:这是 C++11 标准库中的一个模板类,用于实现共享所有权的智能指针,它会自动处理对象的内存管理,包括构造和析构。Detection:这是一个类类型,根据上下文,它可能是一个用于目标检测的类。make_shared:这是一个函数,用于创建一个std::shared_ptr管理的对象。这个函数通常用于避免直接使用new和delete操作符,从而简化内存管理。<Detection>:这是std::shared_ptr的模板参数,指定了智能指针将管理Detection类型的对象。motion.params.model:这可能是一个对象,其中包含了用于初始化Detection对象的参数。model可能是motion.params对象的一个成员,用于存储模型相关的参数。detection:这是std::shared_ptr智能指针的变量名,它将指向由make_shared函数创建的Detection对象。
这里的motion类中(了解一下配置参数的加载原理)
std::ifstream config_is(jsonPath);
在 C++ 中,std::ifstream 是标准库中的一个类,用于从文件中读取数据。这行代码的作用是打开一个名为 config_is 的输入文件流(ifstream 表示 “input file stream”),并且 jsonPath 变量可能包含文件的路径。
std::ifstream:这是 C++11 标准库中的输入文件流类,用于从文件中读取数据。config_is:这是一个std::ifstream类型的对象,它将被用来打开和读取文件。jsonPath:这是一个变量,其值应该是一个字符串,包含了要打开的文件的路径。这个变量应该在之前的代码中已经被定义并赋值。():这是std::ifstream类的构造函数,它尝试打开jsonPath指定的文件。如果文件成功打开,流的状态将是良好的,否则会进入失败状态。- 整体上,这行代码的作用是初始化一个输入文件流,用于后续的文件读取操作。通常,这行代码会跟在文件读取操作之前,例如,使用
config_is >>来提取文件内容。
nlohmann::json js_value;
在 C++ 中,nlohmann::json 是一个流行的 JSON 库,用于解析和生成 JSON 数据。js_value 是 nlohmann::json 库中的一个类,用于表示 JSON 值。
nlohmann::json:这是nlohmann::json命名空间,它包含了处理 JSON 数据所需的所有类型和函数。js_value:这是一个变量名,它被声明为nlohmann::json库中的json类型。json类是nlohmann::json库中用于表示 JSON 值的主要类型,它可以存储各种 JSON 类型,如对象、数组、字符串、数字、布尔值和 null。nlohmann::json js_value;:这行代码声明了一个名为js_value的变量,它的类型是nlohmann::json::json。这个变量可以用来存储和操作 JSON 数据。
try
{
params = js_value.get<Params>();
}
catch (const nlohmann::detail::exception &e)
{
std::cerr << "Json Params Parse failed :" << e.what() << '\n';
exit(-1);
}
try:开始一个异常处理块。在 C++ 中,try块用于捕获和处理在随后的代码块中可能抛出的异常。{:开始try块的大括号,表示接下来的代码将被尝试执行。params = js_value.get<Params>();:尝试从js_valueJSON 值中解析出Params类型的对象。这里假设Params是一个用户定义的类,它能够从 JSON 值中构造。get<Params>()是nlohmann::json库提供的一个模板函数,用于将 JSON 值转换为 C++ 类型。}:结束try块的大括号。catch (const nlohmann::detail::exception &e):定义一个catch块,用于捕获try块中抛出的异常。这里捕获的是nlohmann::detail::exception类型的异常,这是nlohmann::json库在解析 JSON 时可能抛出的异常类型。{:开始catch块的大括号。std::cerr << "Json Params Parse failed :" << e.what() << '\n';:如果捕获到异常,使用标准错误输出流std::cerr打印错误消息。e.what()是一个函数,它返回异常的描述字符串。exit(-1);:如果解析 JSON 参数失败,调用exit函数退出程序,并返回错误码-1表示程序因错误而终止。}:结束catch块的大括号。
capture = VideoCapture("/dev/video0"); // 打开摄像头
这行代码是使用 PaddlePaddle 框架中的 VideoCapture 类来打开摄像头的示例。下面是这行代码的详细解释:
capture = VideoCapture("/dev/video0");:这行代码创建了一个VideoCapture类的实例,名为capture。VideoCapture是 PaddlePaddle 中用于视频捕获的类。"/dev/video0":这是 Linux 系统中摄像头设备文件的典型路径。在 Linux 中,摄像头通常被挂载为/dev/video0、/dev/video1等设备文件。/dev/video0通常代表第一个连接的摄像头。// 打开摄像头:这是一条注释,用于说明这行代码的作用是打开摄像头。在实际的代码中,这行注释不会影响代码的执行。
2024.12.17
关于opencv mat 介绍 https://blog.csdn.net/weixin_46999174/article/details/140575433
注意代码是 基于C++/OpenCV2/Python3.7/PaddleDetection/Edgeboard环境搭建;


2024.12.20 研究如何打开摄像头窗口
#include <iostream> //输入输出流,摄像头画面获取过程
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture capture;//摄像头实例化
capture = VideoCapture("/dev/video0");
if(!capture.isOpened()){
cout << "video failed" << endl;
return 0;
}
Mat frame;//创建矩阵类对象
namedWindow("smartcar",(640,480));
while(1)
{
capture >> frame;
imshow("smartcar",frame);
waitkey(1);
}
return 0;
}
CMake 编译代码
# 指定CMake的最低版本要求,这里是在3.4到3.18之间的任何版本
cmake_minimum_required(VERSION 3.4...3.18)
# 设置项目的名称,这里是"intelligentCar"
project(smartcar)
# 设置C++标准为C++17
set (CMAKE_CXX_STANDARD 17)
#---------------------------------------------------------------------
# [ Include、Lib : Define ] ==> []
# 这部分定义了项目中使用的公共库和头文件的目录
#---------------------------------------------------------------------
# 设置公共库目录的路径,库文件位于lib文件夹下
set(COMMON_LIB_DIR "${PROJECT_SOURCE_DIR}/lib/")
# 设置代码包含文件目录的路径src
set(COMMON_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/src")
# 链接目录,这里添加了我们定义的公共库目录
link_directories(${COMMON_LIB_DIR})
# 包含目录,这里添加了我们定义的公共头文件目录
include_directories( ${COMMON_INCLUDE_DIR} )
#---------------------------------------------------------------------
# [ Include、Lib : Path ] ==> [ glib opencv ]
# 这部分通过PkgConfig和find_package查找外部库glib和OpenCV,并添加它们的包含目录
#---------------------------------------------------------------------
# 查找并加载PkgConfig,PkgConfig用于帮助查找库
find_package(PkgConfig)
# 使用PkgConfig查找glib-2.0库,并设置REQUIRED表示这是必需的
pkg_search_module(GLIB REQUIRED glib-2.0)
# 添加glib的包含目录
include_directories(${GLIB_INCLUDE_DIRS})
# 查找OpenCV库,并设置REQUIRED表示这是必需的
find_package(OpenCV REQUIRED)
# 添加OpenCV的包含目录
include_directories( ${OpenCV_INCLUDE_DIRS} )
#---------------------------------------------------------------------
# [ bin ] ==> [ main ]
# 这部分定义了可执行文件及其依赖的源文件
#---------------------------------------------------------------------
# 设置生成的可执行文件的名称,这里是"icar"
set(PROJECT_NAME "car")
# 设置源文件路径是src目录下的car.cpp
set(INTELLIGENTCAR_CAR_PROJECT_SOURCES ${PROJECT_SOURCE_DIR}/src/car.cpp)
# 添加一个可执行文件目标,名称为PROJECT_NAME,源文件为INTELLIGENTCAR_CAR_PROJECT_SOURCES
add_executable(${PROJECT_NAME} ${INTELLIGENTCAR_CAR_PROJECT_SOURCES})
# 链接pthread库到可执行文件,这对于多线程程序是必需的 “多线程”
target_link_libraries(${PROJECT_NAME} PRIVATE pthread )
# 链接OpenCV库到可执行文件
target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})
Windows 配置cmake方法 https://blog.csdn.net/naonao8986421/article/details/140656035
编译不通过的方法 删除build文件里面的,重新下载一遍
threshold(gray,binaryImg,0,255,THRESH_BINARY | THRESH_OTSU)
详细介绍后面的参数中两种算法 阈值计算https://blog.csdn.net/AI_dataloads/article/details/133909889
int main()
{
VideoCapture cap("/dev/video0");
if(!cap.isOpened()){
cout << "failed" << endl;
return 0;
}
nameWindow("smarter",(640*480)); //创建一个名为smartcar,大小为640*480的窗口
Mat img; //实例化矩阵类
while(1)
{
cap>>img;//将摄像头获取的图像赋值给img
/*
图像处理
图像rgb to gray
图像二值化,只有白色和黑色
识别一个直道:前提是会获取一个点的像素值,会修改一个点的像素值
识别一个弯道:动态中点,动态顶点
识别十字路口并且补线
识别环岛并且补线
*/
cvtColor(img,gray,COLOR_BGR2GRAY)//图像rgb to gray 第一种方法
threshold(gray,binaryImg,0,255,THRESH_BINARY | THRESH_OTSU)
imshow("smartcar",img);//在smartcar窗口显示img
imshow("car1",binaryImg);//新方法 二值化
imshow("car1",gray);//显示灰白窗口
waitKey(1);//延时
//上下位机串口通信
//
}
return 0;
}

int imgpoint = binaryImg.at<uchar>(100,100);//显示的是图像中y=100 x=100的图像
图像识别中的具体点的值大小
2024.12.22
uart串口通信代码
//使用串口通信需要在cmakelist文件内引入serial库
//target_link_libraries(${PROJECT_NAME} PRIVATE serial)
#include <iostream>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <cstring>
class SerialPort {
public:
SerialPort(const std::string& portName, speed_t baudRate)
: portName_(portName), baudRate_(baudRate), fd_(-1) {}
~SerialPort() {
closePort();
}
/*
SerialPort serial("/dev/ttyUSB0", B9600); // 假设串口是/dev/ttyUSB0,波特率是9600
if (!serial.openPort()) {
return -1;
}
serial.sendpwm(1500,10);
*/
bool openPort() {
fd_ = open(portName_.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
if (fd_ == -1) {
std::cerr << "Error opening " << portName_ << std::endl;
return false;
}
struct termios tty;
if (tcgetattr(fd_, &tty) != 0) {
std::cerr << "Error from tcgetattr: " << strerror(errno) << std::endl;
closePort();
return false;
}
cfsetospeed(&tty, baudRate_);
cfsetispeed(&tty, baudRate_);
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars
tty.c_iflag &= ~IGNBRK; // disable break processing
tty.c_lflag = 0; // no signaling chars, no echo,
// no canonical processing
tty.c_oflag = 0; // no remapping, no delays
tty.c_cc[VMIN] = 0; // read doesn't block
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
// enable reading
tty.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty.c_cflag |= 0;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CRTSCTS;
if (tcsetattr(fd_, TCSANOW, &tty) != 0) {
std::cerr << "Error from tcsetattr: " << strerror(errno) << std::endl;
closePort();
return false;
}
return true;
}
void closePort() {
if (fd_ != -1) {
close(fd_);
fd_ = -1;
}
}
bool sendData(const uint8_t* data, size_t length) {
if (fd_ == -1) {
std::cerr << "Port is not open" << std::endl;
return false;
}
ssize_t bytesWritten = write(fd_, data, length);
if (bytesWritten < 0) {
std::cerr << "Error writing to " << portName_ << ": " << strerror(errno) << std::endl;
return false;
}
return bytesWritten == length;
}
void sendpwm(int duty,int speed)// duty:1200~1800;speed:-20~+20
{
uint8_t datesend[] = {0X01,0X00,(uint8_t)speed/10,(uint8_t)speed%10,(uint8_t)((duty-1000)/100),(uint8_t)((duty-1000)%100),0X00,0X02};
size_t dataLength = 8;
sendData(datesend,dataLength);
std::cout << "Data sent successfully" << std::endl;
}
private:
std::string portName_;
speed_t baudRate_;
int fd_;
};
2025.2.25 车模组装
电机编码器部分,似乎上个人焊错了,现在还差内六角螺丝刀重新装一下。
电池差个挡板
舵机不知道是不是中值,因为插上之后一直在往返转。
2025.2.26 电路分析
供电
降压电路 TPS5430 给舵机供电 6V?
12V转5v典型电路 https://blog.csdn.net/qq_45583758/article/details/145033442
ME6211C33M5G-N 低压差线性稳压器(LDO)5V转3V3 电量计3V3
在usb转ttl(用CH340G)这地方似乎有点问题 按理应该是VBUS接VCC?

2025.2.27
cmake学习
keil报错问题
https://blog.csdn.net/qq_41754202/article/details/126052978
安装Compiler Version5(即ARM Compiler 5,简称AC5)5编译
解决代码不兼容6 报错问题
https://blog.csdn.net/tytyvyibijk/article/details/125589391
https://blog.csdn.net/2301_78033819/article/details/143795005
2025.3.28 记录模型训练过程
ppyoloe_crn_l_36e_coco_xpu

ppyoloe_plus_crn_m_80e_coco

十分大
ppyole+的裁剪蒸馏策略 发现 loss_class一直维持在1以上
以下是收集的有用的学习图片



















2025.3.30

