(1)水下管道智能巡检-方案STM32+树梅派+python+opencv—水下机器人

文章目录

  • 前言
  • 硬件选择
  • ***一、下位机所需要实现的功能***
    • 1.LED部分
    • 2.PWM部分
    • 3.无刷电机部分
    • 4.串口部分
    • 5.I2c驱动部分
    • 6.MPU6050配置相关寄存器部分
    • 7.解析姿态角,PID算法和EKF(滤波)
  • ***二、上位机所需要实现的功能***
    • 1.串口发送部分
    • 2.opencv部分
      • (1).直线拟合+像素点巡线
      • (2).图像的模式识别方法
  • 总结以及成品展示


前言

笔者今年参加了工程训练比赛(现在已经迈入了linux下驱动开发的大坑中)。在最近学习linux驱动的同时突然想着做一个长期博客,算是一个教程吧也就当对我自己所学习STM32的经历做一个总结回顾,会将我代码的实现过程做个罗列。大神看到有说错的地方可以留言哈。刚入门的小白看到有什么不懂的地方也可以留言看到就回复。


硬件选择

提示:笔者上位机采用书梅派4b使用Python来进行处理图像识别,下位机采用STM32f103单片机。树梅派4b的处理这么多数据也算是勉勉强强,若是想用性能更强一些的可以试试rk3399的板子,相对来说性能上比4b要强一些,尤其是做视觉处理一定要注意板子的性能能不能跟的上特别实在一些实时性要求比较高的要求下。

一、下位机所需要实现的功能

1.LED部分

需要使用多个led来代表所识别的多边形黑色附着物所以我们需要定义两到三个点亮led的驱动,这部分很简单。
看LED部分代码点我:(已更新)

2.PWM部分

我们需要控制多个无刷电机,三个悬浮电机,两个驱动电机,TIM3定时器提供了四个,再加上TIM1的一个,也可以全部使用TIM1定时器来提供所需要的5路PWM,TIM1能提供多少个PWM我忘记了。需要的花可以查阅相关资料。
看定时器部分代码点我:(已更新)

3.无刷电机部分

无刷电机不同以我们平常所见的普通直流电机,他需要配合电子调速器来使用就是我们俗称的电调,想要驱动无刷电机要看自己买的电调说明书,一般都有频率限制一般50hz—400hz最高是500hz。频率的计算有个公式能算,这里先不说明后面具体用到了再详细说明。
驱动无刷电机部分:(已更新)

4.串口部分

串口很重要,想要实现上位机和下位机之间的相互通信就需要串口这个功能。配置好串口之外还需要自己写一个数据帧,如果不对数据进行规定会出现很多接受错误,影响后面的指令。(串口的状态很重要)
串口和协议:(已更新)

5.I2c驱动部分

STM32官方有硬件I2c不过很多人都说不好用,好象是专利问题吧,我所采用得是模拟I2c,难点在于I2c的时序部分,时序部分很容易出错当时也花了不少时间调试时许,当然现在网上也有很多模拟i2c的代码基本上都是可以用的,需要在意的是延时,延时过长或者过短mcu也是接收不到的。
I2c驱动部分:(没更新别点)

6.MPU6050配置相关寄存器部分

这一部分主要就是通过I2c的读写函数对6050内部寄存器进行配置,比较简单如果你的I2c没有问题的话。
MPU6050寄存器部分:(没更新别点)

7.解析姿态角,PID算法和EKF(滤波)

PID不多说了很经典也很简单但是调节参数你得有点东西,先说说为什么需要滤波算法,我们通过6050能解算出角度(通过加速度原始数据和角速度原始数据),但是这不能直接拿来用,额你可以直接用加速度数据如果你不在意这个数据的大范围跳一枚轻喷。动,如果我们要获得相对稳定可用的数据我们就需要卡尔曼滤波(EFK),也有其他方法例如四元素奈何实在看不懂四元素不理解。简单来说经过EKF之后的数据我们差不多就可以直接拿来用了。
姿态解算和滤波:(没更新别点)

二、上位机所需要实现的功能

1.串口发送部分

Python实现串口发送还是很简单的别忘了装CH340驱动,然后安装PYserial库。代码讲到了再说。
上位机串口和协议:(已更新)

2.opencv部分

这部分我当初以为很难,接触了Opencv后又觉得很简单不是很难,但是当你慢慢的代码要处理的数据越来越多,如果有异常或者判断语句没处理到位的话,BUG就来了,我当时遇到过一个BUG在一些特定的环境下程序会出现假死的状态,后来花了两天
,慢慢排查原因出现在了try语句。。。很低级的错误。
图像识别部分:(没更新别点)

(1).直线拟合+像素点巡线

巡线的方法很多种最简单的是提取固定一行像素点找对照颜色的索引,计算中间值但是这个方法弊端很大对环境的要求很高基本上只能在一条直线或者拐弯的角度很小的情况下才使用这个方法,不然速度过快或者来个直角转弯直接GG很明显这个方法不适合我们。
原贴:https://blog.csdn.net/yzy_1996/article/details/85318179?utm_source=app&app_version=4.9.1
基于这个方法我们对这个方法做个简单升级,本来是寻找固定一行的像素点中特定元素的中间点,现在我们来遍历每一行像素点找到有特定颜色的一行来提取中间点,这样以来我们就可以实现直角转弯。但是这个 方法也有弊端,弊端在那呢就是不好调节PID 为什么呢因为当发现主角转弯时像素的索引一般都在最左边或者最右边这样的话就出现了一个情况,会给PID传入一个特别大的参数导致初期转向过大中后期修正难,笔者通过这个 方法反复的调试了多次,由于树梅派的性能图像会有延迟加上机体在水中的惯性,导致PID调节一路受阻惯性太大了PID调节不过来对于这样的惯性系统当时也没有很好的方法,如果是在陆地上的小车我相信这个方法还是可行的。后来就用上了直线拟合和基于像素的双PID来调,像素索引用来识别道路偏离值,直线拟合用来识别当前的转向角度,节效果很理想。这节我会着重来讨论直线拟合。
代码部分:(没更新)

(2).图像的模式识别方法

对于这一章节我所采用的方法是模式识别,提取物体的特征来进行一个判断,基于多边形拟合的顶点检测和图形面积的占空比两种方法结合。效果不是很稳定,识别率还行吧也算是达到了我的预期,有时候9个物体能正确识别 6,7个有时候就仅有3,5个,奈何没有tensorflow的基础不会深度学习框架,笔者还是推荐使用深度学习来进行识别,我也看过其他队伍的深度学习成果,正确率还是挺不错的,本节单单讨论模式识别方法。
代码部分:(没更新)

总结以及成品展示

总的来说,经过了几个月的不解努力,没有白费力气不管结果如何,这都是宝贵的经验。



插眼,关注,更新不迷路,感谢支持!

你可能感兴趣的:(笔记,python,单片机,人工智能,经验分享,编程语言)