imuncle.github.io icon indicating copy to clipboard operation
imuncle.github.io copied to clipboard

大叔的个人小站

Results 100 imuncle.github.io issues
Sort by recently updated
recently updated
newest added
trafficstars

吵了近一年的机器学习入门计划终于下地了,从今天开始学习机器学习,之后入门深度学习,进入人工智能领域。 机器学习部分学习参照的是目前最为火爆的吴恩达的机器学习教程,浅显易懂。机器学习会涉及到很多数学知识,但吴恩达的教程是众多教程中最为对新手友好的,他尽力地不过多地涉及繁杂的数学知识,专注于讲解机器学习的原理,且循循善诱,步步深入,一看就停不下来。 该系列总结同时参考了该门课程的翻译者黄海广博士的[个人总结](https://daniellaah.github.io/2016/Machine-Learning-Andrew-Ng-My-Notes.html)。 好,机器学习就此开启吧! --- 机器学习是目前信息技术中最激动人心的方向之一。我们每天都在不知不觉中使用机器学习的算法。 每次,你打开谷歌、必应搜索到你需要的内容,正是因为他们有良好的学习算法。谷歌和微软实现了学习算法来排行网页。 每次,你用**Facebook**或苹果的图片分类程序他能认出你朋友的照片,这也是机器学习。 每次您阅读您的电子邮件垃圾邮件筛选器,可以帮你过滤大量的垃圾邮件这也是一种学习算法。 对我来说,我感到激动的原因之一是有一天做出一个和人类一样聪明的机器。实现这个想法任重而道远,许多**AI**研究者认为,实现这个目标最好的方法是通过让机器试着模仿人的大脑学习。 为什么机器学习如此受欢迎呢?原因是,机器学习不只是用于人工智能领域。 我们创造智能的机器,有很多基础的知识。比如,我们可以让机器找到**A**与**B**之间的最短路径,但我们仍然不知道怎么让机器做更有趣的事情,如**web**搜索、照片标记、反垃圾邮件。我们发现,唯一方法是让机器自己学习怎么来解决问题。所以,机器学习已经成为计算机的一个能力。 这里有一些机器学习的案例。 比如说,数据库挖掘。机器学习被用于数据挖掘的原因之一是网络和自动化技术的增长,这意味着,我们有史上最大的数据集比如说,大量的硅谷公司正在收集**web**上的单击数据,也称为点击流数据,并尝试使用机器学习算法来分析数据,更好的了解用户,并为用户提供更好的服务。这在硅谷有巨大的市场。 再比如,医疗记录。随着自动化的出现,我们现在有了电子医疗记录。如果我们可以把医疗记录变成医学知识,我们就可以更好地理解疾病。 再如,计算生物学。还是因为自动化技术,生物学家们收集的大量基因数据序列、**DNA**序列和等等,机器运行算法让我们更好地了解人类基因组,大家都知道这对人类意味着什么。 再比如,工程方面,在工程的所有领域,我们有越来越大、越来越大的数据集,我们试图使用学习算法,来理解这些数据。 **手写识别**:现在我们能够非常便宜地把信寄到这个美国甚至全世界的原因之一就是当你写一个像这样的信封,一种学习算法已经学会如何读你信封,它可以自动选择路径,所以我们只需要花几个美分把这封信寄到数千英里外。 事实上,如果你看过自然语言处理或计算机视觉,这些语言理解或图像理解都是属于AI领域。大部分的自然语言处理和大部分的计算机视觉,都应用了机器学习。 学习算法还广泛用于自定制程序。每次你去亚马逊或**Netflix**或**iTunes Genius**,它都会给出其他电影或产品或音乐的建议,这是一种学习算法。仔细想一想,他们有百万的用户;但他们没有办法为百万用户,编写百万个不同程序。软件能给这些自定制的建议的唯一方法是通过学习你的行为,来为你定制服务。 最后学习算法被用来理解人类的学习和了解大脑。

AI

偶尔会遇到要上Google Play下载APP的情况,但是Google Play上电脑还不能直接下载,我搞到Google账号之后,居然需要绑定移动设备,太麻烦了。 之前我一直用的是**apkpure**,但后来它也挂了,没办法。 后来我再Chrome应用商城中发现了一个叫[**APK Download**](https://chrome.google.com/webstore/detail/apk-downloader/fgljidimohbcmjdabiecfeikkmpbjegm?hl=zh-CN)的扩展应用,直接复制应用下载界面的url就行了。 ![image](https://user-images.githubusercontent.com/35989223/53690404-d50f6e80-3da4-11e9-94f0-64d74e36cbd3.png) 此外还可以使用[这个链接](https://apps.evozi.com/apk-downloader/)在线下载,不用安装扩展应用。

tools

最近接了一个小项目,其中一个内容就是驱动步进电机。我就地取材选择了非常普遍的**J-4218HB2401两相步进电机**,搭配**TB6600驱动器**进行控制。 其实也没啥好总结的,都加上驱动器了,那自然是非常方便,这里就简单记录一下。 步进电机因为是两相的,一共有四根线引出来,分别是A+,A-,B+,B-,驱动器外观和接口如下图所示: ![image](https://user-images.githubusercontent.com/35989223/53472863-d2123680-3aa3-11e9-898f-747a3f7d6a46.png) 驱动器上的接线如下: 接口名|接线 :--:|:--: PUL+|脉冲信号输出负 PUL-|脉冲信号输入负 DIR+|电机正、反转控制正 DIR-|电机正、反转控制负 EN+|电机脱机控制正 EN-|电机脱机控制负 A+|连接电机绕组A+相 A-|连接电机绕组A-相 B+|连接电机绕组B+相 B-|连接电机绕组B-相 VCC|电源正极 GND|电源负极 > DC 9-40V 接线有两种方法,一种是共阳极接法: ![image](https://user-images.githubusercontent.com/35989223/53473133-8a3fdf00-3aa4-11e9-980f-04737df49cae.png) 一种是共阴极接法: ![image](https://user-images.githubusercontent.com/35989223/53473280-f3bfed80-3aa4-11e9-8bae-d1964456d715.png) 我采用的是共阴极接法。 单片机我使用的是STM32F103C8T6,就简单的先来个1kHz脉冲,但是接上去,通上电,电机是自锁了,但是在脉冲输入下不转,一点反应都没有,上网一查在知道原来脉冲也要求5V高电平,而改进版的TB6600驱动器就不存在这个问题。 为了验证这个想法,我通上电后手动将PUL+碰上5V电源,果真碰一下转一下,玩的不亦乐乎,是时候展示真正的手速了! 那么,现在就下单买一个光耦继电器...

other

网上冲浪时发现一款将极简主义发挥到极致的记事工具。在这里Mark一下。 # 地址 工具的介绍点这里:[Mak - Inns](https://inns.studio/mak/),使用点这里:[Mak](https://mak.ink/) 没错,打开就是个网站,这个工具只需要一个浏览器就能工作,支持markdown语法,所以还可以用来写博客。支持GitHub账号登录,简直不要太好。 # 实现原理 网站的工作原理很简单,就是使用`localStorage`,可以手动打开DevTool查看localStorage。也正因为这个,所以哪怕网页关闭,电脑关机,只要不卸载浏览器,下次打开这个网页的时候,数据就会在那乖乖等着你。这样做安全性也得到了保障。 从工具的介绍页面来看,该工具还可以很方便地嵌入页面中,非常实用。 # 源代码 目前作者还在整理代码,根据他说的,整理好之后会开源出来。GitHub地址见[这里](https://github.com/inns/mak)。

tools

最近有用户反映[gitblog](https://github.com/imuncle/gitblog)中的用户登录功能非常不稳定,有时能登录,有时不能登录。 看似是个小问题,结果自闭了两天。仔细debug发现是如下代码出了问题: ```javascript var token = getUrlParam('access_token'); if(token != undefined && token != null) { window.localStorage.clear(); window.localStorage.setItem("access_token",token); window.location.href = window.location.origin + window.location.pathname + "?id="+getUrlParam('id'); } ``` `window.localStorage.setItem("access_token",token)`这句话执行需要一定的时间,而JavaScript默认支持异步通信,所以`token`还没有存储进localStorage页面就已经跳转了,导致登录失败。 其实不跳转问题也不是很大,但用户的`access_token`直接显示在浏览器的url中总感觉有些不妥当,所以才进行跳转。 所以其实只要能将url中的`access_token`去掉就行了。 #...

web

时间过得很快,转眼寒假就结束了,又是新的一轮调车。寒假前成功与视觉组对接,接收到了视觉组发送的角度信息。是时候用上它了。 视觉组发送的角度是相对角度,比如现在我的云台在3点钟方向,目标在2点钟方向,视觉传递给电控的数据就是-30°,即让云台向左转动30度。 视觉计算出的角度很大程度上依赖于摄像头的单目测距,但往往总是差一点距离,导致角度不是完全准确,所以我实现辅助瞄准的时候大部分时候都在强行校准角度信息。 # 辅助瞄准基本实现 先说说我是怎么实现辅助瞄准的。 就拿yaw轴来说事,在我的代码中,云台电机位置环PID的反馈值是编码器的值,也就是`real_position`,具体的可以查看我前面写的文章。在正常模式下,云台电机的位置环期望值是由遥控器控制的,在辅助瞄准模式下,这个期望值则由视觉的角度数据确定。实现代码很简单: ```c if(hero.workstate == RemoteControl) //遥控器控制模式 { if(Remote.rc.s1 == 2 && !Is_Error(1

RM

底盘作为一个机器人最基础的东西,是各位必须掌握的。但是看着大家的任务完成进度感到焦心,所以写了这篇步兵车底盘驱动代码的详解,以及底盘调试的步骤和要点。 # 工程简介 - 这篇教程里的代码使用STM32F405RGT6芯片,使用STM32CubeMX软件辅助进行开发。 - 使用的电机是由大疆创新生产的3508无刷电机,搭配C620电子调速器,使用CAN通信进行控制。 - 使用的遥控器是DT7 Robomaster比赛专用遥控器,遥控器接收机为DR16。 - 底盘采用麦克纳姆轮全向底盘,麦克纳姆轮为“O-长方形”型安装方式,四个电机的ID号位置分布如下(底盘正前方朝上): ``` 左上 1 2 右上 左下 4 3 右下 ``` 关于麦克纳姆轮的介绍可以查看这个[视频](https://www.bilibili.com/video/av17229132)的讲解,浅显易懂。 麦克纳姆轮的运动解析计算可以参考这篇博客[【学渣的自我修养】麦克纳姆轮浅谈](https://zhuanlan.zhihu.com/p/20282234),其实麦克纳姆轮底盘就是一个简单的运动合成,可以参考下面的代码进行理解。 # 遥控器通信协议 遥控器采用的是DBUS协议,需要搭配硬件对应的取反电路才能正常使用。单片机通过与接收机的串口通信获取遥控器数据。遥控器每14ms发送一个18字节的数据,在遥控器的说明书中可以看到相关的数据解析函数: ```c Typedef __packed...

RM

这段时间我在帮学校Robocon战队做辅导,遇到了JGA25-371电机。 以前我还没遇到过这种电机,一直用的是大疆的三相无刷电机,而这个是带编码器和减速箱的直流电机,一共6根线,其中四根线是编码器的,两根线是电机的电源线。 电机的驱动很简单,这里使用了L298N驱动器,使用三根线控制,两根线控制电机的转向,一根线输出PWM波控制输出的电压,进而控制电机的力矩。 这个电机关键的地方在于获取它的转速和转向,也就是获取编码器的值。我之前使用的大疆电机采用的霍尔传感器,而这个电机采用的是光电编码器,它的具体介绍可以看这个网站 [编码器速度和方向检测,371电机方向与速度检测,stm32编码器接口模式](http://www.yfrobot.com/forum.php?mod=viewthread&tid=2411&highlight=%B1%E0%C2%EB%C6%F7)。 最关键的就是下面这张图,只要理解了这张图就能读取转向和转速了。 ![](http://www.yfrobot.com/data/attachment/forum/201403/04/201617fe7zs73z4x3uq7z7.jpg) 我采用了两种方法获取电机的转速。第一种是使用定时器的输入捕获功能,设置为上升沿触发,通过记录A相或B相两次上升沿的间隔来计算电机的转速,我测量的是A相,然后在中断中判断B相的电平高低来区分电机的转向。 另一种方法是使用GPIO的外部中断,配置为上升沿中断,给每个电机设置一个计数,在中断中对计数进行++操作,通过计数的大小来计算转速。 获取到转速就可以进行PID控制了,上面的原理很简单。 这里可以提一下,在使用定时器输入捕获的时候,如果在中断中判断是又哪个通道产生的: ```c void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)) { //... } else if((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)) { //... } else...

RM

我第一次看见小陀螺的时候是在去年比赛的佛山分区赛,当时我的比赛已经彻底结束了,在备场区看比赛直播,看见了有个战队的步兵可以**360度**旋转,还可以同时实现底盘的前后左右移动,当时死活想不通是怎么实现的。 昨天逛空间的时候再次看见了这种小陀螺,跑的确实欢快,心里非常羡慕,于是今天下午决心要实现小陀螺。 但没想到稍微一想就有些思路了,其实就是一个运动的分解与合成,在此记录一下。 首先看看之前的步兵车底盘的基本运动计算方程: ```c m3508_1.speed_pid.ref = infantry.chassis.FBSpeed + infantry.chassis.LRSpeed + infantry.chassis.RotateAngle; m3508_2.speed_pid.ref = -infantry.chassis.FBSpeed + infantry.chassis.LRSpeed + infantry.chassis.RotateAngle; m3508_3.speed_pid.ref = -infantry.chassis.FBSpeed - infantry.chassis.LRSpeed + infantry.chassis.RotateAngle; m3508_4.speed_pid.ref = infantry.chassis.FBSpeed -...

RM

这段时间我一直在调英雄车的云台PID,之前我放弃了陀螺仪的角速度数据,选择用电机的编码盘反馈的位置计算角速度,结果效果很棒!详情可以点击[这里]?id=13)。 但是这个方法还有一个遗留问题,那就是计算出来的角速度有波动,曲线画出来呈锯齿状,我已经使用了`递推平均滤波算法`,而且队列长度已经设置到了24位,再往上提升效果也不是很显著,反而浪费了宝贵的RAM资源。 产生锯齿波的根本原因是编码器的精度很高,一圈又8192个刻度,稍微的影响都会使反馈值改变,这是硬件层面的现状,是无法避免的,我需要从这些锯齿波中得到角速度变化的真正趋势。 因为是锯齿波,所以我选择了低通滤波算法。这里我只使用了一阶低通滤波算法。 首先介绍一下啥是一阶低通滤波算法: 低通滤波原本是硬件层面RC滤波电路,后面有了软件模拟的低通滤波。 一阶低通滤波又叫一阶惯性滤波,算法公式为: ![](https://latex.codecogs.com/gif.latex?$$Y(n)=\alpha&space;X(n)+(1-\alpha)Y(n-1)$$) 式中:![](https://latex.codecogs.com/gif.latex?$$\alpha$$)为滤波系数,取值范围为0~1;`X(n)`为本次采样值;`Y(n-1)`为上次滤波输出值;`Y(n)`为本次滤波输出值。 显然,一阶低通滤波算法就是将本次的采样值和上次的输出值进行加权得到有效的滤波值。 一阶滤波算法的不足就是平稳度和灵敏度不可兼得,这也是大多数滤波算法的通病。 对于一阶滤波算法,滤波系数![](https://latex.codecogs.com/gif.latex?$$\alpha$$)越小,滤波结果越平稳,但是灵敏度越低;滤波系数越大,灵敏度越高,但是滤波结果越不稳定`。 我测试了![](https://latex.codecogs.com/gif.latex?$$\alpha$$)为0.2,0.25和0.3的情况,结果如下: ![](https://latex.codecogs.com/gif.latex?$$\alpha$$) = 0.3 ![image](https://user-images.githubusercontent.com/35989223/52531194-a0336d00-2d4c-11e9-8cdc-cb9b1d7c6c91.png) ![](https://latex.codecogs.com/gif.latex?$$\alpha$$) = 0.25 ![image](https://user-images.githubusercontent.com/35989223/52531206-aa556b80-2d4c-11e9-8e73-3abce3955f51.png) ![](https://latex.codecogs.com/gif.latex?$$\alpha$$) = 0.2 ![image](https://user-images.githubusercontent.com/35989223/52531210-b3463d00-2d4c-11e9-8d07-d0e00f779692.png) 从上面的对比可以确实是![](https://latex.codecogs.com/gif.latex?$$\alpha$$)越小结果越平稳。但是从下图也可以看出灵敏度的下降(曲线已经有了相位差) ![image](https://user-images.githubusercontent.com/35989223/52531214-c1945900-2d4c-11e9-9f17-ce1fa2f6e02e.png) 最后我选择了![](https://latex.codecogs.com/gif.latex?$$\alpha$$) = 0.2,平稳度和灵敏度都比较好。...

RM