自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车

2023-05-16

目的:一种廉价的跟随方案,让大家都能够参与进来,技术难度不大,一些人也能够DIY一些属于自己的“跟随”机器人!并不是要做工业应用什么的。只是做出来玩玩~

/ 1 / 介绍

先看视频,视频中是一个简单的4轮模型的小型机器人,做了一个简单的应用(智能行李车)

自动跟随机器人视频1

自动跟随机器人视频2

在这我们只介绍自动跟随的方案,牵扯到机器人底盘移动等其他控制部分,在这不做过多赘述了。

如果读者有机器人相关控制基础或者做过智能小车类的项目,很容易处理好。没有也没关系,

继续关注我的知乎【张巧龙】或者公众号,后面会开源相关机器人的控制方案。

/ 2 / 硬件方案

选用单发单收超声波模块进行测距,以此来获取人与车的距离,模块可在某宝上购买,也可自己制作。由于有广告嫌疑,我这里不放购买链接。

(关注微信公号【大鱼机器人】,后台回复【自动跟随】即可获得电路等资料)

在机器人的两端各安装一个单收超声波,人手持一个单发的超声波模块。

这样左侧与右侧离人的距离就构成了一个三角形。简单示意图如下图所示:

当机器人正对着人时,装在机器人上的2个超声波模块,距离A=B,

当人左拐时,A必定小于B,

同理当人右拐时,A大于B。

当人向前走时,A和B的距离必定大于设定距离。我们只需要控制好这几个距离即可。

由此可获得人与机器人的距离以及人的行走路线,来实现机器人的自动跟随功能。

【注意】如果选用下面这收发集成一体的超声波
例如这种:


这种超声波模块也能做跟随,但是非常有限制性,为什么呢?

用收发一体的超声波模块也能做超声波跟随,但是只能做直线跟随和障碍物跟随,也就是说只能跟随前方的物体,并不能跟随特定的人。

因为该超声波只能测得前方障碍物的距离,小车通过前进后退去控制与障碍物的距离从而实现跟随功能。并且,只能使用一个收发一体超声波模块,如果2个超声波同时发射,肯定会互相干扰,因此不能实现三角形跟随算法。


所以只能做直线跟随!并不能转弯跟随!

/ 3 / 基于超声波的跟随算法设计

本设计选用单发单收的超声波模块进行测距,在车上的前方左右两端各安装一个单收超声波模块,人手持一个单发超声波模块,这样左右两端的超声波与移动目标的距离三点之间就构成了一个三角形。

假设左超声波A点距离移动目标C点(超声波发射器)的距离为a,右超声波B点距离移动目标C点的距离为b。

当小车与人正对时,距离a = b;当人左拐时,a < b;同理,当人右拐时,a > b。当人往前方走时,A和B距离人的距离a和b必定大于预先设定距离。综上所述可知人与车的距离,由此来实现小车的自动跟随功能。

/ 4/ 程序设计

4.1 主程序思路

4.2 跟随关键程序

选当获取到A、B距离后,如何控制呢?

对距离做一个简易的PID中的P控制即可。

#include "control.h"	

int line_Pwm,Turn_Pwm;//计算出来的pwm

int  Moto1,Moto2;//赋给电机的pwm值

void	TIM3_IRQHandler(void)   //TIM3中断
{
		if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update  )                                     ;  //清除TIMx的中断待处理位:TIM 中断源 
			line_Pwm =line_follow_pwm(distance_left,distance_right);         //===直线跟随环PID控制	
			Turn_Pwm =turns_follow_pwm(distance_left,distance_right);        //===转向跟随环PID控制	
			Moto1=line_Pwm+Turn_Pwm;                 //===计算左轮电机最终PWM
			Moto2=line_Pwm-Turn_Pwm;                 //===计算右轮电机最终PWM
			Set_Pwm(Moto1,Moto2);                                    //===赋值给PWM寄存器  	
			if(distance_left>4000||distance_right>4000||distance_right<20||distance_left<20)	  
			Set_Pwm(0,0); 	
			Led_Flash(5);//led闪烁,表明程序正在运行当中。
		}
}

/**************************************************************************
函数功能:直线跟随
入口参数:左右超声波的值
返回  值:直线速度控制PWM
作    者:张巧龙
**************************************************************************/
int line_follow_pwm(int distance_left,int distance_right)
{  
		static int line_pwm;
		static float line_distance1,line_distance2;
		float kP_ultrasonic_zhixian=8;//直线超声波PID环控制参数
		float set_distance=800;							//控制小车在800mm之内
		line_distance1=distance_left-set_distance;//超声波当前距离与我们设定距离的差
		line_distance2=distance_right-set_distance;
		//=============自动跟随部分=======================//
		if((line_distance1>0&&line_distance2>0)||(line_distance1<0&&line_distance2<0))		
		{
			line_pwm=kP_ultrasonic_zhixian*((line_distance1+line_distance2)/2);		 
			//在此我们做了一个简单的比例运算,并且将2个接收超声波的数据做一个均值处理之后再进行比例运算。
		}
	  if(distance_left>4000||distance_right>4000) line_pwm=0;   
		return line_pwm;
}
/**************************************************************************
函数功能:转向PD控制
入口参数:电机编码器的值、Z轴角速度
返回  值:转向控制PWM
作    者:张巧龙
**************************************************************************/
int turns_follow_pwm(int distance_left,int distance_right)//转向控制
{
		static int turn_pwm;
		static float difference;			//当人移动时,小车左右接收超声波的距离必不相等,此时产生的偏差将成为跟随转向PID的入口参数
		float kP_ultrasonic_turn=45;				//转向跟随环PID的P参数
		difference=distance_left-distance_right;//计算出左右超声波的差
	
		//=============自动跟随部分=======================//
		if(distance_left>20&&distance_left<4000&&distance_right>20&&distance_right<4000&&difference<0) 	
		{
				turn_pwm=-difference*kP_ultrasonic_turn;
		}
		else if(distance_left>20&&distance_left<4000&&distance_right>20&&distance_right<4000&&difference>0) 	
		{	
				turn_pwm=-difference*kP_ultrasonic_turn;
		}
		else 
		{
				turn_pwm=0;
		}		         
		return turn_pwm;
}

这个小机器人是我之前本科的毕业设计,从思路到设计再到实体最后调试成功,前前后后花了一个多月的时间,有人可能会觉得一个本科的毕业设计也敢拿出来给大家分享嘛,这不吹牛B吗?

天都黑了~(把牛都吹上天了~)

我想说的是,做这个跟随的小机器人,不在于技术含量多高,而是这个点子很有趣,市面上如今有各式各样的跟随方案,计算机视觉跟随、定位模块跟随、电磁波信号跟随等等。

那么我这个跟随有什么用呢?

一种廉价的跟随方案,让大家都能够参与进来,技术难度不大,一些人也能够DIY一些属于自己的“跟随”机器人!做不了工业应用,我们可以做玩具嘛~

附上原贴,相关资料在链接里面

纯干货 | 自动跟随机器人方案

/ 5 / 付费教程分享

——2022.3.28晚更新——

有很多同学在做跟随相关的项目,我之前做过一个详细的教程,涵盖代码【STM32\51\ARDUINO】这三个的代码都有,也有一些参考电路图。

可以看资料截图:

参考电路图【部分截图】 :

详细的教程【部分截图】 :

详细的技术论文【部分截图】 :

这一套完整的教程,有需要的同学可以加微信【VX号:great_xiaolong】私聊获取,不过需要付费哈,能接受的可以加微信,加好友记得备注:跟随小车,不然可能不会通过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车 的相关文章

  • js打开新窗口的方法总结

    Window open 方法 完整代码 window span class token punctuation span span class token function open span span class token punctu
  • 一文详解堆栈(二)——内存堆与内存栈

    前言 xff1a 我们经常听见一个概念 xff0c 堆 xff08 heap xff09 和栈 xff08 stack xff09 xff0c 其实在数据结构中也有同样的这两个概念 xff0c 但是这和内存的堆栈是不一样的东西哦 xff0c
  • 《动手学ROS2》3.2ROS2工作空间介绍

    本系列教程作者 xff1a 小鱼 公众号 xff1a 鱼香ROS QQ交流群 xff1a 139707339 教学视频地址 xff1a 小鱼的B站 完整文档地址 xff1a 鱼香ROS官网 版权声明 xff1a 如非允许禁止转载与商业用途
  • Ubuntu18.04 realsenseD435i深度摄像头外参标定的问题

    Ubuntu18 04 realsenseD435i深度摄像头外参标定的问题 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱好者共同组成的社区 xff0c 欢迎一起参与机器人技术交流 进群加V xff1a fishros2048 文章信
  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    目录 一 串口通信1 1通信接口1 2串口通信1 2 1简介1 2 2硬件电路1 2 3串口参数及时序 二 STM32的USART外设2 1USART简介2 2USART框图 三 数据传输3 1数据帧3 2输入数据策略3 2 1起始位侦测3
  • 大疆M3508、M2006必备CAN总线知识与配置方法

    大疆M3508 M2006必备CAN总线知识与配置方法 文章目录 大疆M3508 M2006必备CAN总线知识与配置方法前言 xff1a 0x00 需要 额外的 CAN收发器 xff01 xff01 xff01 0x01 硬件层面分析为什么
  • 换个角度聊聊PID吧,很干。

    01 前言 大家好 xff0c 前面发了几篇关于PID的文章 xff1a 点击图片即可阅读 教你10分钟完成智能小车的PID调速 快速调试PID参数的3种方法 02 自动控制系统 在直流有刷电机的基础驱动中 xff0c 如果电机负载不变 x
  • linux发起http请求,GET、POST

    GET请求 curl 推荐 curl v 34 https test com login username 61 tyw amp password 61 123 34 curl 34 https test com 34 URL指向的是一个文
  • VSCode对C++的DEBUG调试配置

    C 43 43 vscode上的调试配置 1 调试配置2 修改编译模式 按照本 的流程可在vscode平台上实现像在windows系统下VS调试C 43 43 程序的效果 1 调试配置 当写好代码和 CMakeLists txt 之后 xf
  • VSCode的C/C++扩展功能

    VSCode的C C 43 43 扩展功能 1 在 Linux 上 使用 C 43 43 1 1 创建 Hello World1 2 探索 IntelliSense1 3 构造 helloworld cpp1 3 1 运行 build1 3
  • 从源码理解智能指针(二)—— shared_ptr、weak_ptr

    目录 计数器 Ref count Ref count del Ref count del alloc Ptr base Ptr base的成员变量 构造函数 赋值重载 获取引用计数 减少引用计数 Reset函数 Resetw函数 share
  • muduo源码学习(1):异步日志——日志消息的存储及输出

    目录 前言 日志存储的实现 日志输出的实现 总结 前言 muduo中的日志 xff0c 是诊断日志 用于将代码运行时的重要信息进行保存 xff0c 方便故障诊断和追踪 日志一般有两种 xff0c 一种是同步日志 xff0c 一种是异步日志
  • muduo源码学习(2):异步日志——异步日志的实现

    目录 什么是异步日志 异步日志的实现 前端与后端 前端与后端的交互 资源回收 后端与日志文件 滚动日志 自动flush缓冲区 开启异步日志功能 总结 在前文中分析了日志消息的存储和输出 xff0c 不过并没有涉及到异步日志 xff0c 下面
  • muduo异步日志——core dump后查找还未来得及写出的日志

    目录 前言 生成core文件 gdb调试Core文件 前言 通过异步日志的实现可以知道 xff0c 日志消息并不是生成后立刻就会写出 xff0c 而是先存放在前端缓冲区currentBuffer或者前端缓冲区队列buffers中 xff0c
  • C++知识积累:成员函数运算符重载与非成员函数运算符重载

    运算符重载 xff0c 是C 43 43 多态的表现形式之一 xff0c 可以通过对运算符进行重载来实现运算符特定的功能 运算符重载一般具有以下原则 xff1a xff08 1 xff09 不可重载不存在的运算符 xff0c 如重载 来表示
  • (二叉树)二叉树的最近公共祖先

    题目描述 给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中最近公共祖先的定义为 xff1a 对于有根树 T 的两个结点 p q xff0c 最近公共祖先表示为一个结点 x xff0c 满足 x 是 p q 的祖先且 x 的深
  • 有符号数、无符号数理解

    大家都知道 xff0c 在C C 43 43 中 xff0c 对于w位编译器 xff0c 其有符号数表示的数值范围为 2 w 1 2 w 1 1 xff0c 无符号数表示的数值范围为0 2 w 1 xff0c 举个例子 xff0c 在16位
  • ​PCB的 “ 黑科技 ” ,应该是这个。

    大家好 xff0c 我是张巧龙 xff0c 前段时间炒的很火的折叠屏手机不知道大家还记得不 xff1f 折叠屏手机之所以这么具有 34 韧性 34 xff0c 全靠背后的柔性电路板 FlexiblePrintedCircuit xff0c
  • 指针数组、数组指针——用指针访问数组方法总结

    目录 1 数组元素的访问 2 通过指针访问数组 2 1 通过指针访问一维数组 2 2 通过指针访问二维数组 2 2 1 指向元素的指针 2 2 2 指向每一行的指针 xff08 指针数组方式 xff09 2 2 3 指向整个数组的指针 xf
  • C++知识积累:如何获取虚函数表以及虚函数地址

    如果一个类中存在虚函数的话 xff0c 那么编译器就会为这个类生成一个虚函数表 xff0c 这个虚函数表中按照个虚函数的声明顺序存放了各个虚函数的地址 xff0c 需要注意的是 xff0c 这个虚函数表并不存在于类中 xff0c 而对于这个

随机推荐