自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车
目的:一種廉價(jià)的跟隨方案,讓大家都能夠參與進(jìn)來(lái),技術(shù)難度不大,一些人也能夠DIY一些屬于自己的“跟隨”機(jī)器人!并不是要做工業(yè)應(yīng)用什么的。只是做出來(lái)玩玩~
/ 1 / 介紹
先看視頻,視頻中是一個(gè)簡(jiǎn)單的4輪模型的小型機(jī)器人,做了一個(gè)簡(jiǎn)單的應(yīng)用(智能行李車)
自動(dòng)跟隨機(jī)器人視頻1
自動(dòng)跟隨機(jī)器人視頻2
在這我們只介紹自動(dòng)跟隨的方案,牽扯到機(jī)器人底盤移動(dòng)等其他控制部分,在這不做過多贅述了。
如果讀者有機(jī)器人相關(guān)控制基礎(chǔ)或者做過智能小車類的項(xiàng)目,很容易處理好。沒有也沒關(guān)系,
繼續(xù)關(guān)注我的知乎【張巧龍】或者公眾號(hào),后面會(huì)開源相關(guān)機(jī)器人的控制方案。
/ 2 / 硬件方案
選用單發(fā)單收的超聲波模塊進(jìn)行測(cè)距,以此來(lái)獲取人與車的距離,模塊可在某寶上購(gòu)買,也可自己制作。由于有廣告嫌疑,我這里不放購(gòu)買鏈接。
(關(guān)注微信公號(hào)【大魚機(jī)器人】,后臺(tái)回復(fù)【自動(dòng)跟隨】即可獲得電路等資料)
在機(jī)器人的兩端各安裝一個(gè)單收超聲波,人手持一個(gè)單發(fā)的超聲波模塊。
這樣左側(cè)與右側(cè)離人的距離就構(gòu)成了一個(gè)三角形。簡(jiǎn)單示意圖如下圖所示:
當(dāng)機(jī)器人正對(duì)著人時(shí),裝在機(jī)器人上的2個(gè)超聲波模塊,距離A=B,
當(dāng)人左拐時(shí),A必定小于B,
同理當(dāng)人右拐時(shí),A大于B。
當(dāng)人向前走時(shí),A和B的距離必定大于設(shè)定距離。我們只需要控制好這幾個(gè)距離即可。
由此可獲得人與機(jī)器人的距離以及人的行走路線,來(lái)實(shí)現(xiàn)機(jī)器人的自動(dòng)跟隨功能。
【注意】如果選用下面這收發(fā)集成一體的超聲波例如這種:
這種超聲波模塊也能做跟隨,但是非常有限制性,為什么呢?
用收發(fā)一體的超聲波模塊也能做超聲波跟隨,但是只能做直線跟隨和障礙物跟隨,也就是說(shuō)只能跟隨前方的物體,并不能跟隨特定的人。
因?yàn)樵摮暡ㄖ荒軠y(cè)得前方障礙物的距離,小車通過前進(jìn)后退去控制與障礙物的距離從而實(shí)現(xiàn)跟隨功能。并且,只能使用一個(gè)收發(fā)一體超聲波模塊,如果2個(gè)超聲波同時(shí)發(fā)射,肯定會(huì)互相干擾,因此不能實(shí)現(xiàn)三角形跟隨算法。
所以只能做直線跟隨!并不能轉(zhuǎn)彎跟隨!
/ 3 / 基于超聲波的跟隨算法設(shè)計(jì)
本設(shè)計(jì)選用單發(fā)單收的超聲波模塊進(jìn)行測(cè)距,在車上的前方左右兩端各安裝一個(gè)單收超聲波模塊,人手持一個(gè)單發(fā)超聲波模塊,這樣左右兩端的超聲波與移動(dòng)目標(biāo)的距離三點(diǎn)之間就構(gòu)成了一個(gè)三角形。
假設(shè)左超聲波A點(diǎn)距離移動(dòng)目標(biāo)C點(diǎn)(超聲波發(fā)射器)的距離為a,右超聲波B點(diǎn)距離移動(dòng)目標(biāo)C點(diǎn)的距離為b。
當(dāng)小車與人正對(duì)時(shí),距離a?= b;當(dāng)人左拐時(shí),a?< b;同理,當(dāng)人右拐時(shí),a?> b。當(dāng)人往前方走時(shí),A和B距離人的距離a和b必定大于預(yù)先設(shè)定距離。綜上所述可知人與車的距離,由此來(lái)實(shí)現(xiàn)小車的自動(dòng)跟隨功能。
/ 4/ 程序設(shè)計(jì)
4.1 主程序思路
4.2 跟隨關(guān)鍵程序
選當(dāng)獲取到A、B距離后,如何控制呢?
對(duì)距離做一個(gè)簡(jiǎn)易的PID中的P控制即可。
#include "control.h" int line_Pwm,Turn_Pwm;//計(jì)算出來(lái)的pwmint Moto1,Moto2;//賦給電機(jī)的pwm值void TIM3_IRQHandler(void) //TIM3中斷 {if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源 {TIM_ClearITPendingBit(TIM3, TIM_IT_Update ) ; //清除TIMx的中斷待處理位:TIM 中斷源 line_Pwm =line_follow_pwm(distance_left,distance_right); //===直線跟隨環(huán)PID控制 Turn_Pwm =turns_follow_pwm(distance_left,distance_right); //===轉(zhuǎn)向跟隨環(huán)PID控制 Moto1=line_Pwm+Turn_Pwm; //===計(jì)算左輪電機(jī)最終PWMMoto2=line_Pwm-Turn_Pwm; //===計(jì)算右輪電機(jī)最終PWMSet_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閃爍,表明程序正在運(yùn)行當(dāng)中。} }/************************************************************************** 函數(shù)功能:直線跟隨 入口參數(shù):左右超聲波的值 返回 值:直線速度控制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環(huán)控制參數(shù)float set_distance=800; //控制小車在800mm之內(nèi)line_distance1=distance_left-set_distance;//超聲波當(dāng)前距離與我們?cè)O(shè)定距離的差line_distance2=distance_right-set_distance;//=============自動(dòng)跟隨部分=======================//if((line_distance1>0&&line_distance2>0)||(line_distance1<0&&line_distance2<0)) {line_pwm=kP_ultrasonic_zhixian*((line_distance1+line_distance2)/2); //在此我們做了一個(gè)簡(jiǎn)單的比例運(yùn)算,并且將2個(gè)接收超聲波的數(shù)據(jù)做一個(gè)均值處理之后再進(jìn)行比例運(yùn)算。}if(distance_left>4000||distance_right>4000) line_pwm=0; return line_pwm; } /************************************************************************** 函數(shù)功能:轉(zhuǎn)向PD控制 入口參數(shù):電機(jī)編碼器的值、Z軸角速度 返回 值:轉(zhuǎn)向控制PWM 作 者:張巧龍 **************************************************************************/ int turns_follow_pwm(int distance_left,int distance_right)//轉(zhuǎn)向控制 {static int turn_pwm;static float difference; //當(dāng)人移動(dòng)時(shí),小車左右接收超聲波的距離必不相等,此時(shí)產(chǎn)生的偏差將成為跟隨轉(zhuǎn)向PID的入口參數(shù)float kP_ultrasonic_turn=45; //轉(zhuǎn)向跟隨環(huán)PID的P參數(shù)difference=distance_left-distance_right;//計(jì)算出左右超聲波的差//=============自動(dòng)跟隨部分=======================//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; }這個(gè)小機(jī)器人是我之前本科的畢業(yè)設(shè)計(jì),從思路到設(shè)計(jì)再到實(shí)體最后調(diào)試成功,前前后后花了一個(gè)多月的時(shí)間,有人可能會(huì)覺得一個(gè)本科的畢業(yè)設(shè)計(jì)也敢拿出來(lái)給大家分享嘛,這不吹牛B嗎?
天都黑了~(把牛都吹上天了~)
我想說(shuō)的是,做這個(gè)跟隨的小機(jī)器人,不在于技術(shù)含量多高,而是這個(gè)點(diǎn)子很有趣,市面上如今有各式各樣的跟隨方案,計(jì)算機(jī)視覺跟隨、定位模塊跟隨、電磁波信號(hào)跟隨等等。
那么我這個(gè)跟隨有什么用呢?
一種廉價(jià)的跟隨方案,讓大家都能夠參與進(jìn)來(lái),技術(shù)難度不大,一些人也能夠DIY一些屬于自己的“跟隨”機(jī)器人!做不了工業(yè)應(yīng)用,我們可以做玩具嘛~
附上原貼,相關(guān)資料在鏈接里面
純干貨 | 自動(dòng)跟隨機(jī)器人方案
/ 5 / 付費(fèi)教程分享
——2022.3.28晚更新——
有很多同學(xué)在做跟隨相關(guān)的項(xiàng)目,我之前做過一個(gè)詳細(xì)的教程,涵蓋代碼【STM32\51\ARDUINO】這三個(gè)的代碼都有,也有一些參考電路圖。
可以看資料截圖:
參考電路圖【部分截圖】?:
詳細(xì)的教程【部分截圖】?:
詳細(xì)的技術(shù)論文【部分截圖】?:
這一套完整的教程,有需要的同學(xué)可以加微信【VX號(hào):great_xiaolong】私聊獲取,不過需要付費(fèi)哈,能接受的可以加微信,加好友記得備注:跟隨小車,不然可能不會(huì)通過。
總結(jié)
以上是生活随笔為你收集整理的自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三清境前山隐藏任务是什么
- 下一篇: 「第四篇」电赛控制题可以准备一些什么?