myrio小车

代码放在仓库https://github.com/gwyxjtu/myrio_car

一、实验设备与软件
1.NI myRIO一块,小车一台,自备iPad或手机。
2.软件系统:Win7系统,Labview2015开发软件,NI myRIO2015驱动程序,APP软件Data Dashboard For LabVIEW。
3.在iPad或手机上自行下载APP软件Data Dashboard For LabVIEW,Data Dashboard免费支持运行iOS,Android的智能手机和平板电脑。

  1. 由于实验室电源有限,且点亮不稳定,自行从网上购置了12V锂电池一块,红外传感器两个。
    二、实验具体内容
    实验一:手机遥控小车
    首先是按照电路控制连接电机驱动电路,连接线路板。其中D0留给之后控制小车轮子旋转方向,PWM用于控制小车轮子转速。
  2. 问题以及解决方法:
    (1) 12V不能单独引导面包板上方的联通列中,最好单独插在一行,因为12V电压较大,面包板电阻不可忽略。
    (2) myrio板子同样需要接地,否则会出现轮子一会正向转动,一会反向转动且只能受到微弱无规律的控制。
    (3) 具体芯片的调试方法可以先对调两组芯片,然后观察控制效果,如果两个轮子都不受控制,很有可能是。
    在这里插入图片描述
  3. 设计思路和程序图
    按照差分的思路设计小车路线控制,具体线路设计连线图如下,总共只用到了两个myrio的四个A组端口,分别是两个PWM,占用A组29,31端口,和d0分别输出给两个电机。
    在这里插入图片描述
    PWM的使用方法就是两个参数,两个电机的占空比分别是p1+p2,p1-p2,p1用来控制小车的整体速度,p2用来跳街两个轮子差异,也可以用来转向,在后面的实验中负责补偿小车速度。
    实验二:基于红外传感器的自动循迹小车
  4. 传感器原理以及连线
    红外循迹的传感器共有四个接线端,分别是VCC,GND,D0,A0,接线时候VCC接myrio的5V电压,GND连接地端,D0指的是红外的数字输出,A0指的是模拟输出,我们这里使用D0数字输出,即用螺丝刀调节红外传感器灵敏度,使得在黑线和普通地板返回不同的数字数值。如果使用模拟输入,则需要在程序中新增共享变量动态调整。
    Labview中加入NImyrio的digital in,同时设置myrio的端口,我们这里使用A口的15和17引脚。
  5. 程序框图以及算法设计
    开始想到的思路有两种,一种是用红外传感器识别黑线,如果离开黑线则调节,第二种思路是用两个红外传感器夹住黑线,反馈调节。
    最终我们选择了第二种思路,即用两个传感器来夹住赛道,原因是第一种的设计思路对传感器质量要求较高,同时过抖的弯道,比如垂直,第一种设计只能以十分卡顿的试错方法来过弯,而夹住赛道的方法有更多的控制手段。
    设计框图如下,现在进行详细介绍
    在这里插入图片描述
    首先将框图划分为三个区域,其中区域3就是实验一的差分控制,即p1和p2分别负责转速和转向补偿。区域1是一个逻辑判断,即四种情况,分别为:一,左侧右侧都没压黑线。二,左侧右侧都压住黑线。三,左侧压,右侧不压黑线,四,右侧压,左侧不压黑线。为了保证小车能成功通过十字路口,所以两侧都为黑线的时候直行,两侧都不压黑线的时候视为在赛道上,同样直行,如果一侧压住一侧不压,这时候就需要转向来控制,这里使用一个共享变量cons_1,在区域一的上方标记,用来控制自动转向的灵敏度,灵敏度过低会冲出弯道,灵敏度过高会左右摇摆,行进效率低下。仅仅依靠区域1和区域3的框图已经可以实现循迹,但是控制效果不佳,很容易速度过快冲出赛道。区域2在后面的优化里详细描述。

在这里插入图片描述

  1. 优化方法
    仅凭借区域1和区域3的控制不足以完成很急的弯道。所以加上区域2的优化,区域2首先判断区域一传来的函数值,让小车在弯道时一边轮子转速为0,即在输出的地方直接乘以0,在另一个轮子上给出compensate_1的转速,具体可以通过ipad调节。
    如果需要更快的车速过弯,则需要再转弯时给小车整体一个倒退的速度,即强制减速,然后旋转,这里赋值了一个常数0.7,经过测试0.5到0.8之间都可以,由于转弯速度和转弯稳定程度是不可调和的一对矛盾,这里只能取一个折中。具体的演示再视频中展示。
  2. 问题以及解决方法
    (1)弯道过激,小车冲出弯道的问题,这里使用强制减速和自转的方法调节,实际运行的情况小车会在弯道的时候减速,符合生活经验,开车在弯道时确实需要减速。
    (2)十字路口,这里选择十字路口走直线穿过。

实验三:可以避障的自动循迹小车

  1. 传感器原理以及连线
    避障使用的是实验室提供的红外测距传感器,共有三个接线端,分别是5V vcc,GND接地端,A0模拟信号输出。这里使用两个传感器,这样可以判断转向方向。
  2. 程序框图以及算法设计
    这里设计的避障优先级高于寻路,所以避障有权利给寻路的输出乘以0然后加上自己的输出。右上方是d0,即当两个传感器都检测距离低于一个阈值的时候倒退。
    在这里插入图片描述
    情形一:两个距离很远
    按照循迹来,给循迹的输出乘以1,并且加上0,d0全部对F进行或运算,即不变。
    情形二:两个距离都很近
    输出乘以0,并且给一个avoid_acc,同时d0反转。即过近自转的速度,实际展示为贴近墙壁后旋转的角度,这里设置为0.3,旋转的角度略大于90度。
    情形三:一侧距离过近,一侧距离过远
    让一个轮子不转,另一个轮子旋转,绕过障碍。
  3. 优化方法
    先前版本的设计是检测距离过近的时候直线后退,这样有一个致命问题,就是小车会卡在距离阈值那里,前前后后运动,所以这里没有选择直线倒退,选择两个传感器都过近的时候自转。即为一侧前进,一侧后退,具体的演示参考视频,效果很不错。

三、调试经验总结
1)轮子完全不转

  1. 可以尝试点击程序前面板的停止,如果停止后轮子转动,则程序已经运行。估计是程序逻辑的问题,或者参数初始化失败,重新赋值参数。
  2. 如果点击停止后轮子仍然不转,则检查电路,我们遇到的情况有,电机正负交叉,接地失败,电池没电,myrio电池没电等等。
    2)轮子一直全速转动,不受控制
    大可能是程序没烧上去,原因是myrio电量不足,程序是调试模式,是存储在DRAM里的,断电重连后需要重新烧写程序。
    3)轮子不受控制,或控制逻辑完全错误
    可能是myrio没有接地,myrio也需要接地,否则会随机控制,或控制失败。
    4)轮子一侧转一侧不转,一边受控制,一边不受控制
    1. myrio端口连接错了一位,就是一侧受控一侧不受控。
    2. 测距红外没有提示灯,这时候可以对调测距红外来检查是否是传感器的问题。
      其他调试思路:
  3. 元器件芯片一般不会坏掉,尤其是不可能两个芯片同时坏掉,如果错误是对称的,一般不要怀疑芯片,如果错误不对称,则对调两个芯片查看错误是否对调。
  4. 通过观察myrio上的红色指示灯,是wifi模块,如果每次ipad控制红色灯都会闪烁,则说明myrio已经收到了信号,通信过程错误可以排除。
  5. 可以通过dashboard来判断是否读取到信号,用手机先退出dashboard,在重新连接启动,如果能保存到上次运行的参数,则说明myrio已经存储了数据,通信过程没有问题。

互联网加工作小结

起因

腾飞杯虽然得到了电子信息赛道的特奖,但是对于我个人来说还是有一些遗憾,对项目也是很不舍得,希望能做到更好!

这里展示一下自己所作的内容,其中部分源代码暂时不能开发,等评奖结束后可以开源,目前包括csdn异步http和异步mysql爬虫,哔哩哔哩批量视频爬虫等。

开工前的期望

后端和爬虫

  1. 爬取的范围更为广阔,搜索撸棒性更强。
  2. 保留原文格式,方便读者阅读。

前端

  1. 晃动问题,不能让所有节点完全离开界面,不能让用户找不到节点的位置,这个是腾飞杯版本的最难受的地方。

驱动

  1. 模式切换问题,切换操作过于复杂。

总工作量

  1. 前期图书馆预约和维持脚本,并尝试团队维持脚本,虽然最后由于稳定性原因没有推广。
  2. 新版数据库设计,关系表和内容表分离,提高效率。
  3. 配合小明的爬虫写了一套异步数据库接口,和小明的异步http爬虫配合不错,最终分四天大致上完全部数据。
  4. 提供少量python的数据库调试接口,这个比较简略。
  5. 完善后端java中socket和前端通信部分,升级为新版数据库所对应的版本,目录升级为二级目录,内容更为丰富。
  6. 调试前端,debug。
  7. 节点关系表存储设计和接口。

部分后端的AI推荐算法相关工作等待若哥和钱龙完成,我这里使用random代替。

新版爬虫数据系统设计_v2

搜索正文存储表 spyder_main_table

id keyword link tittle abstract content child_len value
int char 50 char 100 char 200 TEXT TEXT int int
主键 搜索的关键词 本文连接 文章标题 内容摘要(第一轮的摘要在搜索界面存储) 内容全文 子链接的总个数 节点权重价值,目前没有使用

搜索内容表 t_spyder_main_content

id content
主键 内容

子链接存储表 spyder_child_table

id parent_link link tittle abstract content child_len value
int char 100 char 200 char 200 TEXT TEXT int int
主键 父连接地址,作为搜索子链接的索引 当前连接 当前连接标题 当前链接摘要(之后的摘要在父文末就有,展开连接后存储新的连接内容) 当前连接内容 子链接数目 权重

推荐内容表 t_spyder_child_content

id content
主键 内容

评论存储表 t_spyder_comment_table

link target nick_name write_time content value
char 200 char 200 TEXT datetime TEXT int
链接 回复的用户昵称,如果没有回复,就存博客链接 用户昵称 评论时间 评论内容 评分

主菜单表,从大keyword映射到小keyword t_spyder_menu

main_keyword keyword
主菜单节点 子keyword

视频url映射表 t_spyder_url

keyword url
关键词 视频地址

预估搜索子链接,广搜,深度三轮左右,两轮也行。如果当前连接是最后一轮,child_len为0.

子链接存储的数据结构

爬虫设计思路:

  1. 每次get新的连接,在当前索引中存储当前连接的内容,和子链接的数目,然后根据页面的索引,去子链接的表里面存储,当前页面可以存子链接的标题和摘要,展开子链接内容后存子链接的content。

  2. 可以递归爬取三层子链接

  3. 子链接需要检验重复,就连接编号不能一致,可能会用到ignore

  4. ignore查重可能会导致不公平性,比如第一个搜索的节点没有重复内容,第二个就会出现重复内容,最后一个可能百分之七八十都是重复的,效率很低,关联方法可以优化。

关于爬虫想到的两个问题:

  1. 子节点不均衡的问题,(目前想到的办法是设置上限,或者设计多对多的关系,感觉怪怪的)

  2. 优秀博客筛选:
    内容长度大于一定限制
    标题不能含有特殊标签
    内容,标题,阅读量和发表时间。

bilibili视频爬虫

视频爬虫,哔哩哔哩,两个问题,一个是总存储量,即爬不爬第二页,第二个是弹幕,可以爬.

使用阿里云存储对象,

关键词表单

[‘C语言学习’,‘java学习’,‘python’,‘机器学习’,‘Kubernetes’,‘前端’,‘计算机网络’]
[‘C语言指针’,‘C语言结构体’,‘C语言数组’,‘C函数’,‘C语言标准库’,‘C语言算法’,‘C语言内存管理’,‘C语言字符串’,‘C语言实例’,‘C语言错误处理’,‘java数据结构’,‘Java排序算法’,‘java注解’,‘java基础’,‘jvm’,‘java框架’,‘数据库基础’,‘java高并发’,‘java泛型’,‘java反射’,‘python基础’,‘python面向对象’,‘python异步’,‘python文件系统’,‘python异常处理’,‘python数据科学’,‘pythonweb库’,‘python爬虫’,‘python机器学习’,‘python图像处理’,‘计算机视觉’,‘自然语言处理’,‘社会网络分析’,‘推荐算法’,‘数据挖掘’,‘模型诊断’,‘强化学习’,‘模型融合’,‘搜索引擎’,‘统计学习方法’,‘kubernetes环境’,‘kubernetes基础概念’,‘kubernetes基本架构’,‘kubernetes基本调度流程’,‘kubernetes API’,‘kubernetes Master’,‘kubernetes扩展’,‘kubebuilder’,‘kubernetes存储’,‘kubectl’,‘Ajax’,‘HTML’,‘CSS’,‘JavaScript’,‘Dom’,‘HTML5’,‘VUE’,‘React’,‘Angular’,‘jQuery’,‘物理层’,‘数据链路层’,‘网络层’,‘传输层’,‘应用层’,‘网络安全’,‘无线网路’,‘HTTP协议’,‘TCP’,‘DNS’,‘数字认证’]

socket通信

这里的思路是让java后端和python代码隔离,交互只能通过数据库,否则日后维护将更加困难
get_menu这里,必须维护一个手动版的初始节点

mysql win10密码忘记修改

起因

需要本地数据库加速爬虫速度

操作

首先停止mysql服务

net stop mysql

杀进程也可以,不过比较麻烦。

第二部找到安装目录地下的data文件,我一开始想要重置,总给我error说data文件夹下已经有数据,我就直接把data文件夹删除了。

第三步,执行重置操作

mysqld --initialize --user=root --console

重置后会给一个临时密码

第四步,使用刚给的临时密码正常登录

mysql -u root -p

第五步,重置密码

 alter user user() identified by "yourpasswd";

user表重置一下。完事,这下终于知道自己的密码是啥了。

  • Copyrights © 2015-2023 galaxy
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信