前言, 遇到一个小项目,要实现上位机手绘一条线条轨迹,发送给智能小车,让智能小车能按照手绘轨迹运动。要求不高,运动起来有那么个意思就行了,当然要做得好,还需要位置反馈这才运动准确,本文不涉及位置控制,就讨论实现这个意图的开环控制。

看了很多某宝上大片的智能小车,都是只能巡线和避障,或者由手柄(包括手机上的按键控制前后左右移动)。没有我想要的功能。

搜各种技术贴,各种车辆路径规划,大片的积分微分方程式,到最后也只是个matlab仿真结尾,头都大了,还是没有头绪。算了,我用种简单的方法来实现它,避免高深的知识。我来写一篇,有高中的知识就足够了。

说明: 智能小车一般有2种, 转弯用舵机控制的,这个比较简单,在此不表。

    另外一种是靠左右轮差速控制的,本文以这种智能小车来说明解决思路。

首先,我们用倒推法来分析, 看下整个架构。

倒推法:

上位机, 智能小车(下位机)需要轨迹的数据,
那我们就取轨迹上每隔一段距离(这个距离你可以自己编程控制)取一个点,把各点的坐标(x,y)取出来,依次存在数组里,这就是一种数据。

对这些坐标点,不做任何处理,就把这些数据发送给下位机,至于下位机怎么处理,上位机不管了,各人自扫门前雪。这是一种思路,但是并不好,因为(x,y)坐标点数据,对下位机不友好,STM32单片机是无法和上位机运算能力好比的,要弱很多,你把繁重的数据计算工作(这我后面说时会解释)给单片机,不厚道吧。

 稍好的做法是,你把轨迹上各点的坐标值数据,处理成相邻点之间的距离L,和相邻点之间的方位角变化值θ,比如下图,会对下位机友好很多,以下重点解释。

还有更好的,在上一段的基础上,数据再做处理,让下位机运算量更小(其实你看到本文结尾就知道,把轨迹数据处理成智能小车在各轨迹点的转弯时间,和直行时间数据,再发给下位机,下位机就吃得更舒心了)。但这需要上位机和下位机约定一个统一的轨迹长度单位映射关系,就是说,你调试时,要同时修改上位机和下位机代码来协调,这种处理我只是在这里提出来,并不做详细讨论。

A, B, C, D,E, 分别是手绘轨迹上抽取的相邻点。

L1, L2, L3,
L4 , L5 分别是相邻点间的距离

θ1,θ2,, θ3,, θ4,θ5 分别是后一段轨迹,相对前一段轨迹的方位角度变化值。

上位机发送数据时,把
各点的L 和 θ值 发送给下位机,这样,相当于上位机送了一程,下位机处理起来运算量会小很多。

 上位机的实现, 看你个人编程习惯用什么软件了,VC,QT 等等, 反正我知道,QT编程,使用其中的画图功能,在鼠标绘画线条时,有个函数,可以把线条按任意等分,可以取得各点的坐标值。

你拿到各点坐标值了,想处理各点距离和角度就是数学问题。

 又要画图,又要写字麻烦,我就手写了一张数学过程,字不好,凑合着看吧。

重点啰嗦一下: 用C语言的反正弦函数atan 计算角度时,得到的结果是弧度单位,范围是 -1/2Л~ 1/2Л(Л=3.14)。这个可以到网上一搜就知道了。

方位角变化值θ=α2-α1,这个公式的正确性,大家可以自己多画一下, 把轨迹往第二,第三,第四象限去画,并且多画些接近极限的位置,验证一下,反正我也是愚钝,在网上看到一些文章说这样算方位角变化值,我很怀疑,就自己想啊画啊弄了半天,画了各种角度位置验证,发现的确是对的。这才写出来。

方位角变化值θ=α2-α1, 这个计算结果也应该是在-1/2Л~ 1/2Л 范围内, 如果超范围了,要修正。修正的原因是,大于1/2Л,意味着车辆向某个方向转弯超过180度,可你想啊,要是朝这个方向转弯超过180度了,那我问什么不向另外一个方向转,因为那样转过的角度会是小于180度,同样能到达规定的角度方位。小于-1/2Л也是这么个道理吧?所以要修正。

若α2-α1大于1/2Л, 则修正为 θ=α2-α1-1/2Л; 若α2-α1小于-1/2Л, 则修正为 θ=α2-α1+1/2Л。这个修正和α2-α1的结果,你也可以画些极限位置来验证的。反正我是通过自己画,才得出这样修正结论的。

方位角变化值θ=α2-α1, 其值可正可负(范围在-1/2Л~ 1/2Л),那么 , 正值和负值的意义是什么?

若为正值,说明如上图坐标系的话,是下一段轨迹相对上一段轨迹要逆时针旋转θ方位(即小车应该向左转弯);若为负值,说明如上图坐标系的话,是下一段轨迹相对上一段轨迹要顺时针旋转θ方位(即小车应该向右转弯)。
这点非常重要,因为后面说到要控制小车转弯, 你得知道遇到正负值的方位角变化值θ,你该怎么控制小车左右轮的转动方向。

经过这样处理,上位机就可以发送 轨迹长度L,方位角变化值θ的数据给下位机了。

回应一下,前文说过,如果只发坐标数组(x,y), 各位看以上可知,如果下位机接收到的是坐标数字(x,y), 单片机要进行开方, 和三角函数运算,这会降低智能小车的反应能力的。

再说下位机(单片机智能小车), 倒推法。

下位机运动算法思路:

1
转弯,当左轮以某个角速度向前转动,右轮以同样的角速度向后转动,小车就原地转弯,如下图

转弯的算法问题,实际就是,计算在每个轨迹点上,小车的车辆应该以某个设定的车轮角速度(两轮转动方向相反)转动时间Δt 的问题。

2
直行, 就更简单了, 已知相邻两点间距离L, 同样直行的车轮转动角速度可以编程给出某个设定值,相当于直行时的车轮角速度时已知量。只要求出直行所需的时间Δt即可。Δt=L/(ω*d)

最后,写一下下位机的编程思路

1
对智能小车通过PWM脉冲频率设定,来设定转弯时的车轮角速度,和直行的车轮角速度,或者设定为一样大小都是可以的,请随意。

2
取出接收到的相邻段轨迹,方位角变化数组【L, θ】中的第一个数值。

3
用θ解算出对应点转弯车轮需要转动的时间T转弯。

4
用L解算出对应直线轨迹段直行车轮需要转动的时间T直行。

5
编程实现,让小车以T转弯长的时间左右车轮转动(转速相等,但转动方向相反),实现转弯;

6
接着,编程实现,编程实现,让小车以T直行长的时间左右车轮以相同速度前进,实现直行;

7
然后,再取数组中下一组【L, θ】,重复4,5步骤,知道数组的末尾,小车就能实现按上位机手绘轨迹运动了。

写在最后的补充,也许有人会说,小车运动的轨迹长度是多少,因为小车实际行驶的轨迹长度是可测量的。
这就是个映射关系了。上位机手绘轨迹,取出来的坐标点是没有单位的(就是绘图窗口定义的坐标系,单位是像素),你可以对此数据比例映射为毫米,或者米都是可以的,让智能小车按相同的单位换算就可以了。

两轮智能小车按手绘路径运动的实现思路相关推荐

  1. ps2摇杆模块控制小车_八个超赞的两轮平衡小车设计,小白最爱

    智能车种类众多,其中两轮平衡车特别受到了工程师的喜爱,整理了8个两轮平衡车的资料,一起看看这个小可爱吧. 1.基于ARM-STM32的两轮自平衡小车 小车直立和方向控制任务都是直接通过控制小车两个电机 ...

  2. 八个超赞的两轮平衡小车设计,小白最爱

    智能车种类众多,其中两轮平衡车特别受到了工程师的喜爱,整理了8个两轮平衡车的资料,一起看看这个小可爱吧. 1.基于ARM-STM32的两轮自平衡小车 小车直立和方向控制任务都是直接通过控制小车两个电机 ...

  3. 平衡小车c语言程序,【全部开源】两轮平衡小车(原理图、PCB、程序源码、BOM等)...

    同网上一般网友制作的平衡小车不一样,这个平衡小车最大的特点就是它的整体很小,PCB面积只有2.5cm*5.0cm,这个可能还没有网友制作的平衡小车的一个电机驱动板大,但是却已经实现了相同的功能.我在器 ...

  4. 用java制作一个软件控制小车_Android手机控制智能小车的手机端程序(完整版)...

    [实例简介] 本程序是我写的Android手机控制智能小车的手机端的全部的源程序,下载后直接就能用. [实例截图] [核心代码] 624ba65e-a75e-4ba0-8e72-6dbc0823fcb ...

  5. stm32两轮平衡小车项目详解

    摘要 这个项目是在20年11月初开始的,当时的我很迷茫,本应该去实习的我在线上培训,觉得无聊,便有了自己一人做项目的想法.也没想到这个项目做了将近整整一个月,才差不多做了出来.也是准备做两个项目的,这 ...

  6. 基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置

    目录 1.原理图 2.CubeMx配置 (1)创建工程 (2)配置时钟树 (3)仿真模式选择 (4)TIM2配置为PWM输出模式 (5)定时器TIM3,TIM4设置为编码器模式 (6)蓝牙串口配置 ( ...

  7. 两轮差速小车循线控制原理分析

    硬件资料设定:小车驱动来自于两个相同的电机,转向依靠两轮差速实现,小车前后左右安装超声波传感器,前后各一个,左右各两个: 功能目标:假设小车左侧有墙壁,通过超声波测距实现按指定距离沿墙行驶 参数设定: ...

  8. 基于32单片机两轮平衡小车控制系统设计

    主控MCU采用STM32F103C8T6单片机,电机驱动模块采用TB6612FNG模块,姿态监测传感器采用MPU6050芯片,蓝牙模块采用HC-05蓝牙模块. 小车的运动分为直立环.速度环和转向环分别 ...

  9. 码绘VS手绘|processing“运动”主题创作——如何让一只沙雕鸟起飞

    目录 一.代码逻辑 二.理论对比 三.参考资料 最终作品效果可以看上传在B站的视频:https://www.bilibili.com/video/av36523799 第一次码绘VS手绘指路:http ...

最新文章

  1. SVO学习笔记(一)
  2. python 匹配段落_Python3 如何使用正则表达式匹配段落开头?
  3. c语言中count的头文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...
  4. DW的代码格式化和净化功能
  5. Android多模块覆盖率,Android代码覆盖率初探—问题已解决!
  6. python 判断点在随机多边形内_初中数学必须掌握的28个考点及60个易错点,收藏起来慢慢看!...
  7. Java中interrupted()和isInterrupted()之间的区别
  8. HTML5游戏-看你有多色
  9. 64位处理器_快看看你的电脑是64位还是32位操作系统,处理器支持64位可升级
  10. 几种软件滤波算法的原理和比较(带源码)
  11. Java 网络教程: ServerSocket
  12. 请领导批阅文件怎么说_有请考过的说物业经理资格证怎么考?
  13. 深度学习 --- 卷积神经网络CNN(LeNet-5网络详解)
  14. 2022-渗透测试-口令破解-几款暴力破解和字典生成的工具
  15. 家园2简易地图编辑器
  16. Windows Internet Information Services(IIS) 与 inetpub 文件夹
  17. 传统的人事管理与人力资源管理有什么区别,后者有了什么新突破?
  18. 【每日一题】最大正方形面积——进阶,矩形面积
  19. linux基础操作合集(正在写)
  20. 化繁为简|AIRIOT智慧水务信息化建设解决方案

热门文章

  1. wpf嵌入资源html,WPF 嵌入的资源的图片读取与转换
  2. Arcgis基于格网的道路密度分析
  3. android视频编辑sdk!Android动态换肤实现原理解析,灵魂拷问
  4. android电视手机控制器,智能电视控制器
  5. MATLAB有关lsqcurvefit函数对多个未知参数函数拟合的相关问题
  6. 设计模式 适配器模式 以手机充电器为例
  7. Windows批处理中的if判断
  8. 计算机培训参加考试可以获得计算机证书有哪些
  9. 谈项目回款的难题 (转)
  10. 画出烟熏眼妆的6大要点,清纯小女生谨记