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

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

搜各种技术贴,各种车辆路径规划,大片的积分微分方程式,到最后也只是个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. Mysql中字段类型之时间戳大坑
  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
  3. jenkins 发送邮件插件Email Extension Template Plugin配置及script pipeline完整脚本
  4. HAL驱动库学习-ADC
  5. python语言与c语言相比在分支结构上有什么不同_大工20春 C/C 语言程序设计 在线作业3 - 百度文库...
  6. 四种利用C#播放声音的方法
  7. JBuilder安装JDBC drive的方法略解
  8. python QQ自动添加好友
  9. HTML做成信纸格式,css实现一个写信的格式_html/css_WEB-ITnose
  10. ArcGIS在洪水普查、风险评估及区划应用
  11. docker安装时报服务失败,因为控制进程退出并带有错误代码
  12. ROS编译ORB-SLAM2或其各种变种的算法遇到的编译问题
  13. Python Rule Engine
  14. ORACLE 排序函数row_number / rank / dense_rank
  15. Linux 压缩解压和软件安装
  16. Java的LockSupport.park()实现分析(转载)
  17. 关于烛光斧影——赵光义是否谋杀赵匡胤,是否合法继位
  18. python的self使用
  19. 华为rstp配置实例
  20. 一个北漂程序员的租房经历,黑中介无底线的坑,今晚要流落街头了,在线求解决方法!

热门文章

  1. 快捷回复软件有哪些,哪些快捷回复软件可提高卖家的效率
  2. OS X10.10.3正式版和Xcode 6.3正式版下载
  3. 索尼手机c6802的Android,索尼C6802 (Xperia UL)ROOT教程,简单几步完成ROOT
  4. 需要一个3d人模型定穴位脚本也就是需要一个
  5. 冰封王座 地图与种族优势分析
  6. 【深度学习——梯度下降】区分BGD,SGD,MBGD
  7. 不服就开干,手撕智能助手背后的自然语言处理技术
  8. 内网穿透神器!远程办公时代的生产力工具
  9. 建筑的永恒之道-道与禅
  10. FindWindowEx的用法