写在前面 gazebo的model editor在导入dae模型,然后做为模型导入gazebo环境之后发现没有texture,折腾了一下之后解决了这个问题。 blender里面的模型是这个样子的,我就只是修改了红框里的内容,一个是base color基础颜色,还有一个是metallic金属色泽: 但是导入到gazebo之后的模型就没有texture了: dae文件 dae文件我是在blende
写在前面 我想复现一下胡春旭老师的《ROS机器人开发实践》里的server和client案例,具体原理还请各位移步书籍查询,本篇博客主要记录案例实践过程中遇到的一些问题以及解决方法。 这次主要遇到了以下这几个问题: 1:run_depend替换; 2:缺少geometry_msgs依赖; 3:用vscode远程服务器上时报错找不到ros.h头文件 client和server 源码我是对着书写的,配
写在前面 我想复现一下胡春旭老师的《ROS机器人开发实践》里的talker和listener案例,具体原理还请各位移步书籍查询,本篇博客主要记录案例实践过程中遇到的一些问题以及最后编译成功的效果。 talker和listener源码 我先放一下这两份实现的源码,我是对着《ROS机器人开发实践》里的例程写的: /* * talker.cpp * */ #include <sstrea
private,friend private是在编译时刻检查的,也就是说如果能在编译时刻解决编译器对private的限制,那么private其实也是可以访问的(但是非常不建议这么做)。friend声明某个类,函数等是自己的friend,那么被声明的类,函数等就可以访问自己的私有变量啦。 private 首先我们来看测试程序: 《Effective C++》是本好书,接下来我写测试程序的时候尽量根
写在前面 今天主要分享的内容是const,我认为const是对程序设计者的约束。程序员在设计一个类的时候,觉得某些东西是不能被用户(或者是自己)修改的,就会给这些东西前面加上const,但是这个const又会给程序员带来不小的麻烦,因此对于const的使用应该是慎之又慎的。那么对于实在是没办法的情况,真的必须得修改const修饰的东西的时候,其实我们也有解决办法,那就是const_cast。 co
写在前面 今天来讲一些delete[]和delete的相关知识,什么情况下我们应该使用delete[],什么情况下我们应该delete,以及错误使用会带来的问题。 正文 首先呢,我们需要构建一个简单的A类,然后对其做文章,详细看下面我的测试程序: 下面more命令显示的就是.cpp文件里面的内容,可以看到我还是利用静态的全局变量记录类的构造函数和析构函数的调用情况。然后我用new *p = ne
写在前面 今天呢,主要讨论类和对象之间的一些小关系,主要想证明这几个问题: 1:成员变量分别在类的每一个对象里面,且对象里面只有成员变量(类内不含虚函数的情况下); 2:对象信息是通过this指针传递给类的; 3:C++里面class和struct的区别; 正文 首先我们来验证一下成员变量是在类的每一个对象里的这件事,要证明这件事呢,我们首先来看看用同一个类实例化出不同的对象,这些成员变量的大小是
写在前面 大家好哈哈,前段时间太忙了,好久没写啦,这次的话我准备写一个c++的系列,这个系列将包括c++基本语法以及STL编程的部分。 整个结果的验证都会在虚拟机下面的ubuntu1804下进行,利用g++进行编译源文件,所有程序都只将提供图片,不提供源码哦,希望大家看了之后能够自己动手敲程序,这样才能加深理解。 如果文章内容有错误,请在评论区指出,博主一定会第一时间进行检查并及时给予修正。 正文
写在前面 这篇文章是rrt算法系列的最后一篇文章啦,那么下面一个系列呢,我计划做c++相关语法的学习博客。 为什么要做这么一个c++系列的文章呢?因为做自动驾驶的路径规划的话,实现是必不可少的,那么为了保证算法实现的时间不会太长,高效率的c++肯定是一个不错的选项。 rrt算法效果 file:rrt.cpp brief:rrt算法实现的主体 author:AIplusX param:成员变量 r
file: rrt.h brief:这个rrt.h文件是rrt算法实现类的声明 author:AIplusX version:beta_v0.0 date:2021_12_02 update:2021_12_02 warning:记得在类的析构函数里面delete掉堆内申请的内存 remarks:因为在做这个类的时候没有考虑虚函数的问题,所以析构函数没有做成virtual的,所以在做子类的时候要
file: rrt_graph.h brief:这个rrt_graph.h文件是为了绘制rrt的地图,主要内容是包括任意障碍物的绘制方法的功能实现 author:AIplusX version:beta_v0.0 date:2021_12_01 update:2021_12_01 warning:记得在类的析构函数里面delete掉堆内申请的内存 remarks:无 todo:可以做为之后rrt
写在前面 为了保证rrt算法能在各种障碍物的情况下运行,因为做的是在非结构化的环境下路径规划,而且还是静态规划,因此要尽可能保证基本的rrt算法实现没有问题。 算法实现结果 黑色:障碍物(可由鼠标绘制);绿色线段:探索路径;绿色方块:终点红色方块:起点棕色线段:最终路径点划线:路径探索下边界绿色圆点:代表算法开始运行 障碍物绘制 首先看一下任意障碍物绘制的效果以及算法效果: 要查看不同障碍
写在前面 完事开头难,这个ros的安装真的搞了我好久,本来是在更新轨迹规划系列博客的,但是ros安装的这个问题解决了我真的是很爽快,因此插入更新一下哈哈。 结果展示 原理分析 环境:ubuntu1804 sudo rosdep init其实做的事情就是去拿https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.l
写在前面 这篇文章分享的主要是交互界面的实现,因为我是基于C++实现的,所以可视化界面需要第三方库,我选择的是easyX,然后这篇文章主要介绍atan2()的坐标转换测试的可视化以及rrt探索枝干的可视化。 程序效果 黑色:障碍物(可由鼠标绘制);绿色线段:探索路径;绿色方块:终点红色方块:起点棕色线段:最终路径点划线:路径探索下边界绿色圆点:代表算法开始运行 程序介绍 atan2()测试 首先
写在前面 这篇文章主要介绍C++基于vector实现 效果展示: 黑色:障碍物(可由鼠标绘制);绿色线段:探索路径;绿色方块:终点红色方块:起点棕色线段:最终路径点划线:路径探索下边界绿色圆点:代表算法开始运行 实现 因为C++语言的特性以及方便实现,算法实现可能与伪代码有些许区别,但是总体逻辑上是一样的。 首先是rrt算法的主体程序了: void RRT::rrt_algorithm() {
写在前面 这个系列的文章将会分享rrt算法的实现结果以及伪代码思路。rrt算法是基于采样的路径规划算法,与A*算法的基于搜索是不同的。 算法实现过程中遇到了一些困难,类似距离计算公式写错等低级错误,也有路径探索方向写错等算法理解错误,这些我都将在后续文章中提出。 为了算法的运行,我还写了一些调试函数,包括atan2()使用的使用可视化,这些我也会在后续文章中进行展示。 结果展示 黑色:障碍物(可
file: Graph.h brief:这个Graph类是用来画格子地图的,这个类可以生成地图起点终点和障碍物坐标 author:AIplusX version:beta_v0.0 date:2021_11_17 update:2021_11_17 warning:记得在类的析构函数里面delete掉堆内申请的内存 remarks:用户参数结构体里的map地图数组
file:A_star.cpp brief:基于父节点搜索邻域格点 author:AIplusX param[in|out] 输入:父节点内存的地址 | 输出:无 return:无 exception:无 note:首先根据数组索引父节点周围的格点,然后根据算法逻辑进行格点属性(G,F值)的更新 remarks:注意堆中内存的利用,如果申请的内存代表的坐标已经有
file: A_star.h brief:A_star类用法的注意事项 author:AIplusX version:beta_v0.0 date:2021_11_15 update:2021_11_15 warning:offset_x和offset_y数组的大小有2种形式,大小分别是4和8,分别对应宏定义的曼哈顿距离和欧几里得距离,因为曼哈顿距离只走4个格子,而欧
结果展示 这里对于图形化界面进行一个简单的介绍: 绿色:已搜索(待遍历)节点;浅灰色:搜索过程中的最小F数值点;红色:起点;绿色:终点;黄色:最终的生成路径;黑色:障碍物(不可走坐标); A_star类 源码如下所示: class A_star { public: A_star() {}; ~A_star(); void Astar_alg
写在前面 障碍物在算法环境中是不可缺少的,可以看成是算法的约束条件。那么如何生成不重复的随机障碍点呢?接下来我就主要介绍这个办法,以及如何利用C++将坐标点数据在不同功能函数之间高效率传递。 结果展示 绿色:已搜索(待遍历)节点;浅灰色:搜索过程中的最小F数值点;红色:起点;绿色:终点;黄色:最终的生成路径;黑色:障碍物(不可走坐标); 随机障碍物 我的思路是将地图上所有的坐标点都塞进一个vec
写在前面 A*算法之所以有可变性与其启发函数有密不可分的关系,启发函数可以决定算法在搜索的时候的搜索方式,那么今天就来比较一下不同启发函数(搜索方式)对于算法表现的影响。 绿色:待搜索节点;浅灰色:搜索过程中的最小Fn数值点;红色:起点;绿色:终点;黄色:最终的生成路径;黑色:障碍物(不可走坐标); 下面在做算法演示的时候我还是保留了一个障碍物,也是为了保证算法运行的完整性。 对比 首先以曼哈顿距
写在前面 哈哈哈,好久没更新啦,最近事情很多,所以这个A*算法的实现项目就拖了很久了。然后这两天我在停更的时候也想了很多关于之后博客的内容形式,我想以专栏的形式进行博客更新,每个项目都是一个独立的专栏,这样不但方便事后回溯,而且也方便总结。 关于专栏内容我也有了新的想法,因为我这两天也看了很多我之前写的代码,发现根本看不懂了,所以我就想着从现在开始给我的代码都写技术文档,然后附在相应算法介绍的后面
写在前面 上次的语法问题没有解决,我换了一种更为清晰的实现思路,将在接下来给出。今天也实现了A*算法的逻辑设计。 知识点 1:C++类的前向声明写法: class Graph 实现 首先是数据流转方向,具体如下图所示: 首先利用user_para在Graph对象user_graph中生成起点,终点,障碍物的坐标,并且通过user_graph对象的get方法做为接口将起点,终点,障碍物的坐标和us
写在前面 今天主要是实现A_star类的功能函数,但是还出现了一个链接时候的BUG,留待明天解决。 知识点 1:通常情况下文件、目录名称用小写,大写表示很重要的东西(如README)等; 2:类里面的const变量使用大写来表示; 3:类的成员函数,用动词+名词来表示,动词用小写,名词用大写,如:getH; 4:C++工程应该有一个专门的main.cpp文件; 5:“::”是C++的域解析符 今天
写在前面 昨天生成障碍物,起点和终点的方法比较随意,今天重新想了个办法实现了生成不重复的二维坐标,将在后面进行介绍,同时完成了A*类的构建。 知识点 1:不重复二维坐标生成方法: 我将整张图的所有格点存到一个vector里面,然后将vector进行无序化,之后按顺序取出其中数据即可实现不重复的二维坐标获取,这样做主要是为了避免障碍物,起点,终点生成的随机点重复,实现如下所示(注意,#include
写在前面 今天主要完成了基本地图Graph类的设计以及实现,我设置的控制台的大小是960X480,每个格子的大小是32,水平往右是x轴正方向,竖直向下是y轴正方向,因此x轴总共有30个格子,y轴总共有15个格子。 知识点 1:特定范围随机数生成方法: #define RANDOM(a) (rand()%a) #define RANDOM_RANGE(a,b) (rand()%(b-a+1)+a)
写在前面 接下来需要用C++做轨迹规划相关项目的学习和开发,因此C++的可用GUI库那就是必不可少的了,今天就给大家介绍一个香喷喷的开源图形库——EasyX。 效果展示 只需要一段简单的程序就可以进行图形绘制,结果如下图所示: 程序如下图所示(以下源码来自EasyX官方文档,感谢技术大大们的辛勤付出): #include <graphics.h> #include <time.
写在前面 走走停停,我自己做的第一个机器学习的项目:MNIST手写字符集的识别,终于结束了,一路走来也算是踩了大大小小的坑,在这篇文章里做一个总结。 模型配置 模型总共有4层,输入层有784个神经元,分别对应28X28个像素的MNIST手写字符集图像(预先进行归一化),隐藏层有2个,每层16个神经元,输出层有10个神经元,分别对应数字0~9。 模型结构如图所示: pytorch环境版本:1.8.
知识点 1:nn.MSELoss(x,y) 均方根值函数 如果输入的x和y参数的维度不同,维度低的tensor会进行扩张填充,扩充形式如下图所示: 因此之后在训练模型的时候要保持输入变量参数一致,养成良好的编程习惯。 2:这里对昨天一个函数的纠正: torch.max()用法: parameter,index = torch.max(data,0), 返回列最大值以及对应索引,索引在后,数值在前
写在前面 今天调通了pytorch模型,同时进行了简单的模型测试 知识点总结 1:python忽略某些特定语句的warning: import warnings with warnings.catch_warnings():#ignore some warnings warnings.simplefilter("ignore") lo
写在前面 在之后的时间内,我将会从事自动驾驶的轨迹规划的相关学习,轨迹规划的算法有很多,类似于A_这种,那么这个系列就先分享一下A_算法的原理以及实现。 需求场景 曾经有一个机器人的轨迹规划项目,示意图如下所示: 图中排成一排的机器人是障碍物,那么我的任务就是控制一台机器人按照红线的轨迹从起点运行到终点,经过对比之后,我选了A*算法。 场景转换 A*算法是基于格点来走的,所以我们首先需要将实地场
写在前面 pytorch包含了很多包括mnist在内的开源数据集,但是如果要建立自己的神经网络的话肯定需要训练自己的数据集,那么如何利用pytorch加载用户自己的数据集呢?今天就来解决这个问题。 今天的工作 需要加载用户自己的数据需要继承pytorch的Dataset类,并且重载其中的getitem方法和len方法,前者是告诉pytorch如何根据索引来获取对应的样例,后者是告诉pytorch数
写在前面 前面我曾尝试在无框架的情况下进行神经网络的构建和调参,我发现虽然网络构建起来和运行起来都问题不大,但是在调参时就会显现无框架的弊端。经过初步的调参之后,我建立的网络识别准确率只能达到45%,但是我反复演算和查看公式、代码,都没有发现问题,因此调试就十分的困难了。 所以在经过思索和衡量之后,我决定还是采用一个轻量级的工具来帮助我调试神经网络。经过我的对比搜索之后,我决定使用pytorch,
写在前面 之前模型的识别率一直上不去,所以我一直在看我的代码和公式,真的找不出问题来,于是我发现了新手从头开始写模型的坏处,那就是调试起来实在是太麻烦了,远没有带框架的程序调试起来方便. 在多种模型框架之间徘徊了一段时间之后,我最终选择了pytorch,因为他能兼容numpy,使用起来也较为简单,那么这篇文章我就主要分享pytorch环境的安装以及联合GPU的调试. pytorch环境安装 我是用
写在前面 好久不见,前几天忙着复习就没有更新啦~经过预训练之后,发现模型表现的不太好,准确率大概也就在45%,经过分析之后发现了之前程序的一个bug,并进行了修复,本篇文章将记录问题以及解决过程。 上次遗留 用ROC曲线等评估模型性能:因为模型初调的时候准确率不高,大概在45%,远不能满足要求,因此我就没有用该方法进行验证,而是通过观察程序、对照公式等方法查找问题。 模型经过初调(1w张训练集,1
8. 字符串转换整数 (atoi) class Solution(object): def myAtoi(self, s): """ :type s: str :rtype: int """ s = s.strip() if len(s) == 0: return 0
6. Z 字形变换 class Solution(object): def convert(self, s, numRows): """ :type s: str :type numRows: int :rtype: str """ if len(s) == 1 or numRows == 1:
4. 寻找两个正序数组的中位数 class Solution(object): def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """
注:标题即题目链接 1. 两数之和 我采取了暴力的遍历方法: class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """
写在前面 前几天看了篇NLP的论文,写了篇论文阅读笔记,所以耽搁了几天,今天来继续更新啦~今天主要是分享将纯python代码文件在GPU上跑起来,从而实现加速的程序,记录一下numba库的使用方法,在此方法基础上实现之前分享的神经网络。 昨天遗留 1:我将MNIST的训练集文件取出了3.2w张(6w张训练时间实在是太久了),一个epoch训练3.2w张图片,并且在一个epoch中训练集换成了320
论文实验 作者汇报了他的方法在AMR语义分析和AMR转文本方面的表现,转换的语言包括德语(DE),西班牙语(ES)和意大利语(IT)。这个模型是在英语数据集上进行的预训练和微调,但是DE,ES和IT都是在目标数据集上做的评估。 实验设置 预训练数据集 德语:WMT14英转德数据集,在预处理之后包含3.9M对句子;西班牙语和意大利语:作者使用的是德语的并行数据集,包含1.9M对英翻西班牙和1.9M对
XLPT-AMR: Cross-Lingual Pre-Training via Multi-Task Learning for Zero-Shot AMR Parsing and Text Generation 注:以下英翻中均为我自己理解之后的翻译,如有不恰当之处欢迎在评论区指出 名词缩写 AMR: Abstract Meaning Representation 抽象语义表示MTL: mult
写在前面 因为之前在DSW上训练的,每个epoch大概要24s左右,时间太长了,因此今天我就想要用GPU跑,但是DSW上没有GPU了,所以我选择转战colab,而且今天我还选择了训练过程中参数保存的方法,那就是将中间过程的参数保存成.csv文件,然后再通过.csv文件读出从而可以接下去训练。 昨天遗留 1:今天成功用GPU训练了模型,成功将每个epoch的时间从24s下降到了12s; 2:今天还
写在前面 我新开了一个系列的文章,主要是有个原因,1:神经网络的结构发生了较大的变化,2:系列文章的更新方式我也有了新的想法。 那么在这个系列里面我就打算以MNIST为例实现基础以及当下流行的神经网络模型,而且文章的结构上,首先我会解决昨天的未解决的问题,接着放出今天的进展,最后再给出第二天亟待解决的问题。 那么今天这篇文章中我主要分享最新的神经网络结构以及正向传递,权重和阈值公式的推导结果。 昨
写在前面 今天重新实现了神经网络,主要是梯度下降公式的更新和神经网络正向传输的公式更新,并且查看,分析了损失函数的图像。 昨天的问题 1:输出层的10个神经元经过训练之后都有相应的正常的输出变化,也即标签对应的神经元输出值应该是最大的,且逼近于1; 2:对单张图片训练了100次之后的损失函数如图所示: 可能是因为学习率过低 + 训练次数不够(训练真的是太慢了,训练一个epoch需要花24s左右
写在前面 今天我把这个程序跑了一遍,发现实在是找不出问题了,于是我就开始反思程序逻辑上的问题,之前我的神经网络只有2个神经元输入可能太少了,导致神经网络训练的效果本身就不理想,还有我今天有复查了一下公式,又发现了一个错误,等下放出来。 神经网络模型 我将神经网络改成了输入神经元是784个,也就是说图像上的每一个像素点都最为神经网络的输入,而且我把神经网络的2个隐层里的神经元都设置为了16个,图示如
写在前面 今天主要探索的是改变神经网络的权重和阈值的初始值的大小对于模型输出结果的影响,本篇文章首先会介绍一下我对输入数值的归一化处理,然后再通过示例查看初始化参数对于模型输出的影响。 归一化 为了减小MNIST数据本身数值大小的影响,我将MNIST图片的像素数据进行了归一化处理,归一化公式如下图所示: 程序实现如下图所示,需要注意的是,在程序中,我为了减少小数点的位数,我将归一化数值进行了放大
写在前面 经过周末的休息,脑子得到了足够的休息,所以今天调程序的时候就特别顺利,完成了标准BP神经网络的程序搭建,并且开始了参数的调整,那么今天这篇博客主要分析程序实现以及模型调优的尝试过程。 神经网络 最终我确定下来的神经网络长这样: 相较于之前的模型,我将神经网络的输入层增加到了2个神经元,一个是图像的熵率,一个是图像的颜色距离,两者的计算方法如下图所示: def calcuEntImage
写在前面 很遗憾,今天并没有取得什么实质性的进展,并且我还切实的感受到了误差函数发散的快感,今天这篇文章主要分享我的实现代码思路以及往期博客的一些纠正。 公式纠正 首先是对我上一篇博客中一个错误公式的纠正,错误公式如下图所示: 可以很明显的看到公式中出现了2个i的变量,昨天晚上脑子晕了,今天才发现,正确的公式应该如下图所示: 发散的误差函数 我的误差函数是均方根值: 我在程序里面的实现如下图
写在前面 我终于把神经网络的梯度下降公式推导完毕了!先看看为了伟大工程牺牲的草稿纸吧~ 接下来我就分享出我推导的公式以及我总结出来的规律。 梯度下降 神经网络如图所示: 前馈神经网络调整参数的过程可以看成是将误差通过神经网络的连线逐层往回传递从而调整不同层神经元之间的连接系数和神经元的阈值。那么误差是如何回传的呢?那就是通过求微分来实现了,求上层神经元输出对下层神经元输出的微分,再给一定的学习
写在前面 今天正式进入前馈神经网络的公式推导环节,综合数据处理难度和公式推导难度以及神经网络的易理解性,我将之前放出的神经网络做了一些调整,之后给出。那么这篇文章主要进行神经网络的变量讲解,以及公式分析。 神经网络图 神经网络图如下所示: 相比于之前的神经网络,我将其修正为了只有一个输入神经元,我将28X28的图像矩阵转换成了784个数据的一维向量,因此我构思的神经网络就是将该一维向量输入神经网
写在前面 之前已经完成了MNIST数据的获取,机器学习的数据预处理中包括数据清理(离散缺失值等处理),数据合成(将多个数据集合成单个数据集等处理),数据归约(降维等操作),数据变换(归一化等操作),MNIST数据集已经将数据清理,数据合成做好了,因此我们还需要做的就是数据归约和数据变换了,今天这篇文章主要进行数据降维的分析以及神经网络的建立。 MNIST图片 首先我们来看一下MNIST数据集里的图
写在前面 做为我的第一个机器学习的练手项目,我选择了较为简单的MNIST手写字符集识别,因为MNIST在网上是开源的,但是我们需要将其处理成模型可使用的格式,因此这篇文章我就分享我的MNIST字符集下载以及数据集成过程。 conda下载tensorflow 在pycharm的这个地方可以通过命令行下载tensorflow: 通过命令conda install tensorflow之后,可能会报下
写在前面 学了挺长一段时间的机器学习了,但是都是在学习理论知识,并没有进行过实践,因此我就想着做一个项目实践一下。现在深度学习这么火,所以我的第一个项目就打算写一个双隐层的BP神经网络识别MNIST数据集,特此写这一系列文章分享我的项目实现过程,包括环境配置。 那么这博客主要分享python的开发环境conda的安装和conda在pycharm里的配置。 conda 为什么要安装conda呢?它是
写在前面 2020年的电赛赛题要求我们巡一个黑白间隔的导航线,如果放在平地上的话难度是不大的,但是我们需要在一个有坡度的坡道上完成这项任务。 在坡道上的时候因为重力的原因,小车打角的时候会因为重力导致打角不太准确,车子可能会偏离预定航线比较多,因此一个稳定的巡线方案是非常必要的,这篇博客就来分享我的坡道上黑白间隔点巡线思路。 思路分析 我将整条循迹线分成了3个部分,如下图所示: 我划分各个阶段的
写在前面 在2020年电子设计竞赛中我们要完成的任务是做一辆可循黑白间隔线的电动爬坡小车,题目如下:因为当时我们用的MSP430F5529芯片只有4个定时器,一个产生电机PWM,一个产生舵机PWM,还有一个做定时中断使用,而后面2路的正交解码信号也需要2个定时中断进行解码,因此我使用了2块Ti芯片,芯片A进行正交解码,并且以波特率115200通过串口将数据传输给芯片B,由芯片B进行小车外设的控制,
原理讲解 因为我们选择的是电磁车,没有摄像头,所以我选择了线性CCD作为感知斑马线的元件,我把他挂在了电磁车的前瞻上,如图: 为什么要把它挂在前瞻上呢?让我们先来看看的过程。 小车上的CCD可以在距离斑马线一定距离的地方就可以判定前方就是斑马线,那么之后,我通过后轮差速和前轮打角就可以实现稳定入库,那么在这个过程中我们需要保证些什么东西呢? 那就是小车知道自己应该拐到什么位置停下来。因为我们这
思路讲解 我采用的电感摆放方式是这样的,电感均采用横电感的摆放方式。 流程图 示意图+讲解 当车子到达预环岛标志位之后变量就会放置1,这个时候开始编码器积分,当积到阈值之后就说明小车已经行驶到了可以入环的位置(该阈值在自己家实验室可以测试出来的),然后开始第一次角度积分,在这个积分角度里面,车子一直都是打死角的,保证车子能稳定入环,但是这个角度不能太大,当小车稳定入环,陀螺仪积分数值就超过阈值
感知方式 我采用的电感摆放方式是这样的,5个电感均采用横电感的摆放方式: 下面是我数据感知的流程图: 数据感知的基本流程图如上,接下来我主要分享的是我处理差比和数据的方法,也是我稳定车子姿态的重要一环。 根据控制的原理,偏差大是注重偏差变化,偏差小是注重偏差的变化率,我这里做了硬件的体现。我前面三个电感用于感知远方的信息,使车子能看得更远,而后面2个电感用于帮我稳定车子因为长前瞻导致过弯的时候
随着决策树的生成,我们就需要验证一下这颗决策树的性能,假如说在验证集上模型的表现不是很好,那么我们就需要通过一定的办法对决策树进行优化。 其实在决策树的生成过程中我们可以发现,每生成一个叶子结点的过程其实就是局部最优的求解过程,但是,局部最优组成的整体就不一定是最优的,这点应该也是很好理解的,因此我们就需要通过特定的方法对整棵决策树求最优解。 一种是后剪枝,那就是在整个决策树生成之后,经过验证集的
写在前面 现在购物车有一任务需求,那就是需要进行图像识别和运动控制,因此需要初始化2个进程,从而分别完成相应的动作。因为运动控制需要图像识别的结果,因此现在就涉及到了python语法实现2个进程之间的协同合作,这篇博客就结合实际的python程序通过队列实现进程交互。 程序分析 首先介绍一下我们的需要的库函数: import time from multiprocessing import Pro
随着决策树的生成,我们就需要验证一下这颗决策树的性能,假如说在验证集上模型的表现不是很好,那么我们就需要通过一定的办法对决策树进行优化。 其实在决策树的生成过程中我们可以发现,每生成一个叶子结点的过程其实就是局部最优的求解过程,但是,局部最优组成的整体就不一定是最优的,这点应该也是很好理解的,因此我们就需要通过特定的方法对整棵决策树求最优解。 一种方法是预剪枝,就是在决策树生成过程中,也就是叶子结
决策树 以二分类学习为例,机器学习中的决策树过程可以理解成模型通过样本的不同属性值进行深度分类。 让我们举个例子来说,假设我们需要评价一位英雄联盟玩家的水平,我们可以获得该玩家的某些样本属性和样本属性值,比如说KDA,MVP/SVP次数和参团率等等,KDA越高越好,但是也不能单看KDA,也需要其他的样本属性值,那么基于决策树的机器学习模型就是基于样本的各种属性值,不停得去求在某特定属性值情况下的最
本文就借助伪代码来简述BP神经网络的形成过程 伪代码 我们先来看一下BP神经网络的伪代码。 假设数据集中有m个样本 INPUT:训练集 D = {(xi,yi)}(i:1~m) 学习率 η 在(0,1)内初始化神经元的连接权值和阈值; REPEAT FOR ALL (xk,yk)IN D 根据当前样本的数据计算神经网络输出; 计算神经网络
枝干拓展 在上一篇文章中,我们计算了信息熵和信息增益,并且根据这2个概念的公式计算出了KDA的信息增益,走了一遍信息增益计算的流程。 但是根结点往下和叶子结点往下的计算方法还是有一些差别的,接下来我们举一个例子,假设我们选择KDA作为我们第一层决策树延展的样本属性,那么我们选定了KDA属性之后发现还有MVP/SVP次数,单排胜率,灵排胜率,参团率,伤害占比,承伤占比这些属性需要继续往下分类,因此我
写在前面 在这篇文章里面将分析标准BP算法 初始条件 在上一篇博客中已经分析了简单的神经元应用,那就是与、或、非功能的神经网络实现,但是实际应用中的需求往往比这复杂许多,因此两层的神经元满足不了我们的需求,于是我们就需要带有隐层的神经网络,也就是多层的神经网络在说到神经网络的层数的时候,因为输入层是不对数据做处理的,所以不算一层,因此上图左边的神经网络是单隐层神经网络,右边的神经网络是双隐层神经网
写在前面 前文回顾:【机器学习】模型的过拟合,欠拟合以及评估方法【机器学习】性能度量:错误率与精度&&查准率、查全率与Fβ【机器学习】ROC以及代价曲线【机器学习】偏差与方差和F1与BEP值的关系今天我要分享的是神经元模型以及感知机,并且介绍神经元实现简单的与、或、非运算 神经元模型 先来看看人体的神经元模型当左边的神经元接收到皮肤等感受器官的电信号之后,如果该电信号超过了阈值,那
绕射 在实际情况中,电磁波传播时总会遇到障碍物,那电磁波遇到障碍物进行绕射之后,信号会衰减成什么样呢?我们来具体分析一下,首先来看我们的应用场景我们在这里引入一个新的概念,那就是菲涅尔余隙:障碍物顶点到RP直线的距离x当障碍物阻挡电磁波传播时,菲涅尔余隙是负的当障碍物不阻挡电磁波传播时,菲涅尔余隙是正的 第一菲涅尔半径如下这个第一菲涅尔半径有什么用呢?他可以做为一个评判标准,判断电磁波经过障碍物之
写在前面 前文回顾: 【机器学习】模型的过拟合,欠拟合以及评估方法 【机器学习】性能度量:错误率与精度&&查准率、查全率与Fβ 【机器学习】ROC以及代价曲线 今天首先分享偏差与方差的概念,接着来分析一个实例,那就是若学习器A的F1值比学习器B高,那么A的BEP值是否比B高呢? 偏差与方差 这个部分主要是用来说明模型在泛化时会因为噪声,模型自身缺陷等原因出现泛化误差,那么我们就
写在前面 前篇回顾: 【机器学习】模型的过拟合,欠拟合以及评估方法 【机器学习】性能度量:错误率与精度&&查准率、查全率与Fβ 在这片博客里我将记录模型评价的ROC曲线以及AUC面积的概念以及作用,并且同样以二分类任务为例介绍一个新的犯错成本不均衡的模型评价工具,那就是代价曲线 ROC于AUC 在这里我们要引入2个新的概念,那就是真正例率(True Positi
写在前面 最近开始学习机器学习了,选用的参考书是周志华老师的《机器学习》,书的内容由浅入深,我看了书之后才发现原来机器学习就是我一直在找的有意思,上限高的工具,接下来我也将分享我的学习历程。 经验误差 我将设计出来的机器学习算法称为学习器,将训练集喂给学习器,通过学习器生成的最终输出就是模型。学习器用我的算法进行不停的优化迭代,从而积累经验,这也可以认为是一个参数整定的过程,但是,如果算法有缺陷或
写在前面 对于学习器所产生的模型,我们可以通过不同的方法取评估,评估方法参照我的上一篇博客:【机器学习】模型的过拟合,欠拟合以及评估方法以二分类任务为例,提到了评估我们就需要标准,标准之上我们可以称之为好模型,标准之下我们可以称之为坏模型,那么这些标准有哪些呢?在这篇博客里面将分享错误率与精度和查准率、查全率与F1 错误率与精度 这一般是会同时出现的一对评判标准,错误率就是模型在泛化时检测错误的样
流程图 效果展示 拨片架往右移动然后拨片拨取货物拨片架往左移动然后准备拨取货物 测试环境以及结果 所有应答命令关系如下 下图就是我的测试环境,其中与USB-HUB连接的3个USB-TTL分别代表了103与树莓派,丝杆驱动板,拨片驱动板的通信串口,因为测试环境下只是为了查看串口逻辑是否正确,即对应的串口能否正常收发数据,所以就用USB-TTL来查看串口,并没有将103的串口接到驱动板上。 首先是树
任务分析 串口数据流分配大概如上图所示,黑色的箭头即表示了串口数据流,这都还是好理解的,唯一有些难理解的就是蓝色箭头了。蓝色箭头指的是舵机驱动板和丝杆驱动板借由STM32F103芯片实现间接的互相通信。STM32F103在其中扮演着相当重要的命令,由其解析树莓派下发的命令,并且将任务准确分配到舵机驱动板和丝杆驱动板,并且其还解析丝杆驱动板和舵机驱动板上发的命令,保证2块驱动板之间也能实现通信。这样
图片概览 舵机/拨片安装方法 舵机驱动板 思路以及实现 可以看到上图中我们总共有5个拨片,每个拨片都是由一个舵机去控制的,因此我们总共需要5个小舵机,为了区分他们,我将其进行了标号并且他们的变量名称我是按照他们的位置来描述的 #include <Servo.h> Servo UpLeftServo; // 上左,从后往前看,下同 Servo UpRightServo ; // 上右
写在前面 这篇博客不同于前面的树莓派和底盘子系统的控制了,而是要进行讲解分析如何通过arduino控制步进电机移动丝杆实现拨片架的水平移动了,那么为什么要实现这么一个功能呢?原因很简单,因为我们的购物机器人依靠拨片拨取货物,但是在货架上或者仓库里的时候,购物机器人的拨片可能拨不到货物,因此就需要依靠丝杆带动拨片架去拨取货物。 实现效果 步进电机驱动介绍 TB6600型驱动器接线方法 TB6600
基本方案 在我的机器人底下的正中间有2个光电传感器,示意图如下首先来介绍一下为什么购物机器人要数白色交叉点吧,因为购物机器人在接收树莓派指令的时候会接收运动方向和运动格数,在前进或者后退的直走类过程中,购物机器人接收到要走的格数是怎么确定的呢?就是通过数白色交叉点的个数。举例子来说,假设树莓派让购物机器人前进3格,那么购物机器人就会一直按照前进的速度控制和方向控制来运动,当购物机器人数到了3个白色
问题分析 连接购物车 出发前购物机器人是车头与购物车的车头呈垂直的,因此,为了拿到购物车,我们就需要前进半格,然后左转,并且后退一格,最后再去连接购物车购物机器人完成前进,左转,后退的动作之后就是现在这个位置啦,接下来我们就要借助HC-SR04超声波传感器来进行定位连接购物车了后面的超声波传感器的位置 准备抓取货物 因为我们需要抓取货物,因此购物机器人是前端光电传感器压白色循迹线拍照停车的,但是我
图片概览 KS2A242摄像头 摄像头摆放方式 遇到的问题 在我刚开始驱动这个摄像头的时候的python程序长这样 self.cap0 = MyThreadCapture(0, CAPTURE_FRAME_WIDTH, CAPTURE_FRAME_HEIGHT) self.cap1 = MyThreadCapture(1, CAPTURE_FRAME_WIDTH,
效果展示 代码讲解 这个函数是一直跑在默认线程里面的,首先来看一下函数调用吧,这个线程是FreeRTOS里面的默认线程,也就是说停车判断是一直在执行的,get_data是数据接收标志位,当嵌入式芯片接收到树莓派发送的命令之后该标志位会置1,底盘子系统完成相应的动作之后就会将该标志位置0,只有当get_data为1的时候,底盘子系统才会执行相应的动作,否则就只会停车在原地。 void StartD
效果展示 流程讲解 自然语言 转弯的速度控制有这么一个特点,那就是起始速度一定是0,终止速度一定是0,因此在速度控制上有特别的写法。速度控制中,在开始的时候肯定是需要先加速到转弯最高速度,达到了最高速度之后进入到减速标志的判断,左转的时候是前面的光电传感器的最左边碰到了白线开始减速,右转的时候是前面的光电传感器的最右边碰到了白线开始减速,减速状态会一直保持到购物机器人到达最低速度,并且最低速度会
车子的俯瞰图 赛场循迹线 模式A和B 因为购物机器人的运动需求,我们将其运动状态分为了模式A和模式B,模式A就是购物机器人行进时其中线是和导航线重合的,而模式B前进时,购物机器人的停车条件就是前面的光电传感器感知到了白线示意图如下: 那么为什么要有这2种模式的区别呢?这是因为我们摄像头是放在前面车头的,因此在遍历仓库和货架的时候,前端停车更便于摄像头拍照,因此就设计出了模式B。 思路讲解 流程
写在前面 这篇博客讲的就是更加上层的逻辑了,那就是我们如何通过python的逻辑实现按照坐标遍历货架和仓库,我这里再放一张坐标图 程序分析 刚开始我们的位置是(0,0),我们需要走到(1,1)的位置去连接购物车,这一步的动作分解过程在函数run_to_start()里面了,所以我们从(1,1)之后开始讲解。首先我们会遍历货架,购物机器人遍历货架上时走的都是货架对应出来的第二条白线,按照行径路径来看
写在前面 我们最终的目的是为了实现树莓派做为系统的总控来控制底盘,使其能够完成在整个地图中特定路线的循迹行进任务。下图是比赛场地图,我标出了5个点的位置,根据这5个点的位置规律,可以写出场上每一个点的坐标,并且我将根据这些坐标来完成整张地图的巡线逻辑。 逻辑分析 流程图 我们要目的就是按照如下的流程图所示,具体的底盘是如何运动的,例如抓取机构抓取货物的具体动作,底盘运动的具体循迹方法都是底盘主控芯
速度PID分析 速度PID的代码比较简单,函数的调用输入就是目标编码器数值,当下的编码器数值,以及左右轮(因为我比赛用的是C车,所以是软件差速,1表示左轮,2表示右轮),输出就是电机输出量,因为调试的时候烧了4组电机,因此我也有一些个人总结: Ⅰ.I大了能使输出更加逼近设定值,但是也容易产生脉冲输出;I小了,调节P又没有作用了。 Ⅱ.P大了能更快响应,但是过大也容易产生震荡;P小了电机响应又变慢了
写在前面 我们的购物机器人要完成识别,控制,抓取等动作的话,仅靠一块嵌入式芯片是远远不够的,因此我们的购物机器人还搭载了树莓派。我将在这篇博客里面分享树莓派和嵌入式芯片(以STM32F427IIH6为例)通过DMA+USART进行通信的方法。 树莓派 树莓派端我们需要找到USB端口设备,我的树莓派上是CHASSIS_SERIAL_PORT = '/dev/ttyUSB0',获得了端口设备之后就可以
写在前面 调试完光电传感器之后就把他装到车子的前部和后部,在这篇文章里我将分享STM32F427IIH6芯片(RoboMaster A型)上运行的FreeRTOS系统通过串口+DMA方式接收传感器数据并且根据反馈数据调整机器人姿态的方法 场地图如下: 机器人后面的光电传感器: 机器人前面的光电传感器: 流程概述 上图是数据感知和姿态调整的大致流程图,接下来我将结合程序来为大家进行介绍
写在前面 购物机器人既然要购物,那么购物车自然是必不可少的,根据比赛要求,开始时购物车需要与机器人分离,所以就需要机器人主动去连接购物车,于是我们采用了电磁铁来进行连接购物车,就是说在我们的购物车上装一块铁片,然后机器人靠近购物车之后通过电磁铁吸住购物车从而进行下一步操作,那么本篇博客主要介绍电磁继电器控制电磁铁的调试,实物图如下 原理图 电路原理图如下 电磁铁 先来看一下电磁铁,这个电
写在前面 我最近在调试购物车的底盘,底盘上有一个光电传感器,是通过串口接收命令并且进行上传感应结果的,第一次使用,特此写一篇博客记录调试过程,并且会在最后放出调试结果数据流传是这样的,首先由STM32F103C8T6芯片(后简称为103)发送数据读取命令0x57给光电传感器,光电传感器接收到数据读取命令之后会通过光电传感器上的串口发送其16个灯的状态给103(亮0灭1),最后由103通过USART
Error: L6406E: No space in execution regions with .ANY selector matching 问题描述 今天往stm32f407的工程里面加入了u8g2这个12864点阵液晶的驱动库的时候,compile编译的时候没有问题,但是链接link的时候出现了错误,报了Error: L6406E: No space in executio
分析 这个模糊PID函数实现代码我是在GitHub上找的开源代码,理解之后进行了修改就运用到了我自己的程序当中,参考的是这位大佬的github程序: https://github.com/Hyf338/13th-NXP-Smart-car/blob/master/Software/Projecct/USER/src/fuzzy.c Fuzzy()这个函数就是我们模糊PID的实现了,参数是电感数值和
STM32标准库和HAL库的比较 使用STM32芯片的时候呢,大家可能都喜欢用库,什么标准库啦,HAL库啦,拿到了就一股脑的用,也没有深究其区别,这样出BUG的时候就只能两手一摊,程序瘫痪了,所以今天咱们来看看标准库和HAL库有啥区别,各个库它的优点在哪里。 串口通信 标准库初始化串口 void uart_init(u32 bound) { GPIO_InitTypeDef GPIO_Ini
解决IAR for msp430的工程文件报xxx.sfr文件有问题的warning 现象 最近在开发Ti的msp430f5529的板子,在网上找了例程,打开模板文件夹之后发现总会报这个错误,甚是烦恼,在网上几番搜索,终于找到了问题的原因。 原来是因为IAR版本变高了之后就不支持这个文件的存在了,所以高版本的IAR打开低版本的工程文件就可能出现这个问题了。 解决 关闭工程文件
程序处理逻辑 流程图 自然语言描述 自然语言描述起来的话还是比较简单的,既然要处理数据,那么最开始肯定先要把数据通过串口接收下来,这个时候就用到了HAL_UART_Receive_DMA(&huart8, uart8Rx, buffer_size);这个函数,当接收到了数据之后我们要判断帧头是否正确,如果正确的话我们就将数据复制到相应数组里面去,用的就是这个函数SERDEB_PushCm
normalplay的地位 流程图如下所示: 整个足球机器人的比赛规则中如果没有发生犯规的话,SOM软件一直执行的就是normalplay脚本。其实,在正常比赛中,因为小型机器人并没有像人一样这么智能,人会自主最大程度上的避免犯规,但是机器不会,所有犯规还是很常见的,甚至可以说在1个小时的比赛中,有半个小时甚至是半个小时以上SOM软件都是在执行犯规脚本,因此normalplay固然重要,但是也要
问题描述 今天在上嵌入式课时候又学习到了新知识哈,美滋滋~ 情况是这样的,我在STM32F429上跑RT-Thread系统,因为rtt系统里面既有.cpp文件又有.c函数(keil5以上就支持.cpp和.c在同一个工程中共存了),所以当我需要在.c文件里面调用.cpp文件里面的函数的时候就报了下面这个错误,可以看到工程在编译的时候没有问题,但是在链接(linking)的时候报了这个错误,说明工程的
概要 为了及时探测并控制住严重的山火,Victoria州的CFA需要利用无人机对山体进行监视。本文提出了一种基于神经的二进制模型(NBBM),它首先建立了各种无人机与EOC之间有效通信的目标规划模型,以确保EOC能够快速成功地接收SSA无人机的所有信息。 模型中以探测与通信的总时长作为衡量安全性的标准,其中包括探测环节、通讯环节与灭火环节;以所需的无人机总数的作为衡量经济性的标准。总体上,模
写在前面 在小型足球机器人的比赛中,因为足球机器人并不会像人一样那么智能,所以球出界是非常正常的事情。球出界之后就是进行罚球,因此罚球脚本就显得非常重要了,在所有的发球场景中,角球又是最容易进球的一个场景,因此我将分析旋转角球的task层和skill层实现。 自然语言描述 如上图所示,中场会在上半边的场内绕某点做公转的同时进行自转的操作,前锋会过去拿球,前锋拿到球过一段时间之后会将高尔夫球挑射到
写在前面 现在的裸机程序已经不能满足嵌入式机器人所需的代码结构要求了,因为一个嵌入式机器人的系统是非常庞大的,分别由感知算法,决策算法和控制算法等组成,这还没有算上一些需要联网的程序。庞大的代码需要一个芯片级的操作系统来屏蔽掉硬件对于上层算法的影响,同时向上层提供API,帮助上层的算法调用底层硬件,因此一个芯片级操作系统就十分重要了,而RT-Thread是一种国产的芯片级操作系统,而我的课程刚好也
整体框架 本系统的设计理念共分为三个层面,分别是感知层,传输层和应用层。以精确检测人体基本健康指标数据并记录为目的出发,本系统选择了HX711等一系列具有优质功能的芯片,在充分了解其工作原理并学习设计应用这些传感器后,获得了体重、高低血压、血氧、脉搏、体温和身高数据;在获得数据后,本系统选择了低功耗的STM32F103和STM32F407来进行数据的初步处理和传输,并通过ESP8266连
写在前面 2020年电赛结束了,因为疫情的原因,今年的电赛也推迟了,所以我先参加了智能车竞赛再参加的电子设计竞赛。准备时间不是很充分,就准备了一个国庆的时间,因此我们准备的小车就是智能车的舵机和电机,为了符合比赛要求,底板是我们重新打的,然后在国庆期间,我找到了Ti芯片的MSP430F5529的硬件设备库并且分别将S3010舵机,RS380电机,按键,拨码,OLED显示屏等外设调通,小车上使用了
这个是我用来看EMQ服务器里面数据的工具,MQTTX,挺好用的哦 首先,我们需要这些库,下载起来也很简单,直接百度安装即可,安装好之后import进来 以主题“weight_pub”为例 首先是进行获取MQTT的数据,函数API使用实例如下: ##MQTT操作 def MQTTWeight(): # config._init()
写在前面 这篇文章要分享的是父类的成员变量在private,public,protected三种限制情况下的继承与约束关系。 内存关系 首先来看看,在继承的时候,父类的成员变量是以何种形式存在于子类的对象中的。 首先来看测试程序: 这段程序也比较好理解,首先我创建了一个A类,在A类里面有private,protected, public的成员变量int i,k,l。 然后测试程序用B类继承了A
核心源码的部分在博客里面都已经展示了,跟着博客的思路走一遍复现一下应该问题不大,公众号的话因为个人精力已经注销,非常抱歉。之后如果大家觉得A*和rrt系列不错的话可以跟古月居官方反应一下,需求量大的话看看能不能在古月居进行开课讲解。
关注我的个人公众号,里面有资料的哦
请关注文末公众号领取相关资料哦
我这边是可以提取的呢,请查看下提取码是否正确哦
您指的是AIplusX这个公众号搜不到了,还是相关参考程序搜不到了呢
可以可以哈哈
啥东西?
关注文末公众号,在公众号导航栏里有相关源码,如果还有问题欢迎继续评论
建议增加D,减小P
关注文末公众号,公众号内发送智能车即可
在AIplusX公众号发送“智能车”即可获取哦
机器学习相关知识的公众号哦
看看电磁信号找找特征点
博客回复没有那么及时,公众号反馈会快一些
那跟我这篇文章是一个思路的,照着我这个程序思路就行,欢迎关注我的公众号AIplusX
关注我的公众号,后台回复“智能车”获取
已更正
在我的个人公众号AIplusX里面会有,关注可以下载
电感数值就是数值大小,电感数值变化量就是这次电感数值和上次电感数值的差
是的
这是增量式的,因为C车是2个电机进行控制,因此为了保证左右轮的变量互不干扰,所以这样设计
程序里面吗
因为速度快了之后纠正的姿态的频率和幅度都变了,所以需要调整这2个参数
归一化了吗
波形一样吗?
把车子放在赛道上,左右移动车子,让车子自动记录感知到的电感信号的最大值和最小值,就是D_max和D_min
已修复
没有哦,我是做电感的
下手去干就不难了
比赛结束后我会在github上开源,敬请期待
阈值设置好就不会,但是区别十字和环岛就有难度了,因此我程序里设置了只识别一次环岛的标志位
谢谢您的支持哦~我会继续努力滴~
应该跟你程序逻辑有关,看看是不是自己程序逻辑出问题了
博客里面写了,在我的代码里也有,就是看看那个时刻调用的是模糊规则表里面哪4个数据,修改这4个数据即可
我用的上位机是visual scope,在智能车论坛里有你找找
1.轮子正转一下反转一下应该是控制问题,PID参数没调好,再调调,应该是输出震荡了,P调小一点 2.四轮电机过弯应该就是全向行进组吧,这个的话就是通过四轮建模,计算好4个轮子的速度就好,网上的建模材料很多 3.环岛和十字可以,但是S弯道不行应该还是控制PID参数的问题,推荐分段PID法
谢谢老板
在同一个信号发生器的情况下,只需要采集一次电感信号的最大和最小值即可,但是换了一个信号发生器就要重新采集电感信号的最大和最小值
工程文件确实损坏了,不过你看主要实现思路即可,复现起来很快的
看当年规则的要求,十六届应该是B车模
工程可能损坏了,注重看我的博客思路,然后去对应文件里面找相应的函数实现即可
我是主要用电磁的,不用解决阳光问题
可以呀兄弟
硬件二值化可以直接判断赛道的中点线,但是不推荐,因为硬件二值化之后图像信息变少了,我还是推荐直接获取灰度图像,然后采用边缘提取算法提取赛道边缘
先做滤波,再做差比和,重要的是控制算法,电磁车要提速更重要的是要把参数调好,因为得到的信息量太少了
图像处理算法要选择好,推荐边缘提取算法
现在再试试,不行的话用git下载
有啥问题欢迎大家在评论区提出哈,我尽量都会第一时间回复大家的
古月居优秀创作者
积分
粉丝
勋章
第三方账号登入
看不清?点击更换
第三方账号登入
QQ 微博 微信