搜索
bottom↓
回复: 17

分享一个自己写的超声测距扫描雷达扫描算法模拟代码

[复制链接]

出0入4汤圆

发表于 2013-1-30 15:16:57 | 显示全部楼层 |阅读模式
应用场景:
带舵机控制的超声测距雷达。舵机不停旋转,获得各个位置点距离,代码里体现为数组dist[],值为探测的距离,下标为当前舵机位置。
该算法获得足够宽度足够深度的一个提供小车前进的方向.代码是PC机上的模拟。


#define total_loc 10
unsigned char dist2[total_loc]=
{
1,2,3,4,5,6,7,8,9,10
};


unsigned char dist5[total_loc]=
{
8,7,7,7,3,4,7,8,9,10
};


unsigned char dist1[total_loc]=
{
10,9,8,7,6,5,4,3,2,1
};

unsigned char dist9[total_loc]=
{
1,1,1,1,1,1,1,1,1,1
};

unsigned char dist[total_loc]=
{
1,6,2,6,1,7,6,1,1,9
};

unsigned char dist3[total_loc]=
{
10,10,19,20,100,100,120,13,15,18
};

#define low_bar 4
#define high_bar 5


#include <stdio.h>

#define MINIMAL_SIZE 1

int calc_dir()
{
        int start_loc = -1;
        int end_loc = -1;
        int breadth = 0;
        int dir=-1;

        int i;

        for(i=0;i<total_loc; i++){
                if(start_loc == -1 ){               
                        if(dist[i] > high_bar){
                                start_loc = i;       
                                printf("above bar %d\n",dist[i]);       
                        }
                }else{
                        if(dist[i] < low_bar){
                         end_loc = i;
                         printf("start loc is %d\n",start_loc);
                         printf("end loc is %d\n", end_loc);
                         
                         if(end_loc - start_loc > breadth){ dir = (end_loc+start_loc)/2; breadth = end_loc-start_loc;}

                         start_loc = -1;
                       
                        }
                        if(i == total_loc-1){
                         end_loc = total_loc-1;
                         printf("start loc is %d\n",start_loc);
                         printf("end loc is %d\n", end_loc);
                         
                         if(end_loc - start_loc > breadth) { dir = (end_loc+start_loc)/2; breadth = end_loc-start_loc;}
                         start_loc = -1;

                        }
                }
        }
       
        if(breadth <= MINIMAL_SIZE) dir = -1;
       
        printf("final dir is %d\n",dir);
        printf("final breadth is %d\n",breadth);       

        return dir;
}

int main()
{
        calc_dir();
        return 0;
}

出0入0汤圆

发表于 2013-2-21 22:10:35 | 显示全部楼层
测试效果如何?

出0入0汤圆

发表于 2013-2-22 12:37:42 | 显示全部楼层
MARK期待效果....

出0入4汤圆

 楼主| 发表于 2013-2-25 18:22:13 | 显示全部楼层
能够用,小车要开的慢。

出0入0汤圆

发表于 2013-2-25 21:57:17 | 显示全部楼层
主要还是超声扫描测距速度不行啊。慢速车还好,快速车就力不从心了。

出0入4汤圆

 楼主| 发表于 2013-2-26 19:49:28 | 显示全部楼层
6K6K 发表于 2013-2-25 21:57
主要还是超声扫描测距速度不行啊。慢速车还好,快速车就力不从心了。

确实如此,换了几个办法,基本上还是这样。舵机转速高,噪音大,耗电也厉害

出0入4汤圆

 楼主| 发表于 2013-2-27 07:47:11 | 显示全部楼层
本帖最后由 ronic 于 2013-2-27 07:53 编辑

总结一下三种策略:
策略1. 雷达不停旋转,计算最佳方向,小车不停顿的前进。缺点是在靠近障碍物的时候,如果雷达刚好不对着障碍物,则会碰撞;另外是在碰到死角的时候,无法出来。一个办法是简单降低车速,提高雷达舵机转速。但是舵机转速过高,功耗大,噪音也大;车速也不能太低。
策略2 在雷达测到障碍物时,雷达即停止转动,如果雷达指向位置在车子左边,则驱动车子右边转动;如果雷达指向位置在车子右边,则左转。一直到雷达测到安全距离之后才驱动车子前进。
优点是能够很好的开出死角位置,缺点是如果障碍物刚好在左边,而雷达位置右边的时候扫描到障碍物,则车子左转,直接碰上障碍物。
综合前面,目前使用策略3, 一旦雷达测到障碍物,则立即停车,然后做一个全方向扫描,获得最佳方向,驱动小车向最佳方向转向,而雷达停在刚测到障碍物时候的位置,直到雷达检测到安全直行距离之后直行。目前测试相对结果较好。

出0入4汤圆

 楼主| 发表于 2013-2-27 07:49:02 | 显示全部楼层
第一种算法效果,
http://www.amobbs.com/forum.php? ... =%E9%81%BF%E9%9A%9C

出0入0汤圆

发表于 2013-2-27 09:57:24 | 显示全部楼层
这个要标记

出0入0汤圆

发表于 2013-2-27 10:08:48 | 显示全部楼层
应该把每次不同角度扫描的结果存储下来,然后根据车前进的路线作个运算。这样就相当于同时有多个超声传感器在工作了。
这样应该可以提高点车速

出0入4汤圆

 楼主| 发表于 2013-2-27 10:27:27 | 显示全部楼层
本帖最后由 ronic 于 2013-2-27 13:24 编辑
inkfish321 发表于 2013-2-27 10:08
应该把每次不同角度扫描的结果存储下来,然后根据车前进的路线作个运算。这样就相当于同时有多个超声传感器 ...


嗯,有道理,不过需要更加复杂的计算了。。需要保持之前的“地形”信息。回头我试试看这个算法,应该有较大优化余地

出0入0汤圆

发表于 2013-2-27 10:35:35 | 显示全部楼层
这个可以有

出100入0汤圆

发表于 2013-2-27 11:39:05 | 显示全部楼层
ronic 发表于 2013-2-27 07:47
总结一下三种策略:
策略1. 雷达不停旋转,计算最佳方向,小车不停顿的前进。缺点是在靠近障碍物的时候,如 ...

我以前也做过超声波避障的,对此深有体会。
1、测距范围:市售的普通超声波模块测距范围一般4m左右,因此使用超声波模块前瞻只有4m,因此只适合小载体小范围“静态”环境当中使用;
2、检测周期:众所周知,声速传播相对较慢的,单个方向检测时长从几ms到几十ms不等,若多个方向则耗时更长,实时性不能保证,这就限制了载体的运动速度;

我之前的方案是利用空间换取时间,利用多个模块从不同角度检测,当然速度还是很慢。
http://v.youku.com/v_show/id_XNTAyMjc4ODM2.html
瓶颈虽然在此,但还是希望楼主能继续挖掘优化哈

出0入4汤圆

 楼主| 发表于 2013-2-27 13:12:02 | 显示全部楼层
北小斗 发表于 2013-2-27 11:39
我以前也做过超声波避障的,对此深有体会。
1、测距范围:市售的普通超声波模块测距范围一般4m左右,因此 ...

呵呵,你的不错了哦,还是比较快,跟我的比较。。。

出0入4汤圆

 楼主| 发表于 2013-2-27 13:28:06 | 显示全部楼层
另外,由于是四轮驱动;而且四轮不时会有其中的轮子打滑,导致转向无法精确控制。。也增加了一些麻烦

出100入0汤圆

发表于 2013-2-27 14:00:22 | 显示全部楼层
ronic 发表于 2013-2-27 13:12
呵呵,你的不错了哦,还是比较快,跟我的比较。。。

对于我当时1m/s以上的速度设计要求,还是差远了。另外我当时花的时间不长,做的也比较粗糙,后来工作了也一直没时间改进。
看到你的帖子又勾起了我的兴趣,不知道不知道你现在在工作还是在上学呢?
PS:这是我的帖子http://www.amobbs.com/thread-5516448-1-1.html

出0入0汤圆

发表于 2013-2-27 14:21:49 | 显示全部楼层
ronic 发表于 2013-2-27 10:27
嗯,有道理,不过需要更加复杂的计算了。。需要保持之前的“地形”信息。回头我试试看这个算法,应该有较 ...

不需要保存地形信息吧。只需要知道车转动的角度和行使的距离,然后根据这个角度对每个虚拟的超声传感器的值加减运算。而传感器扫描到某一角度时则更新相应角度上的虚拟传感器值。

出0入4汤圆

 楼主| 发表于 2013-2-27 15:57:24 | 显示全部楼层
inkfish321 发表于 2013-2-27 14:21
不需要保存地形信息吧。只需要知道车转动的角度和行使的距离,然后根据这个角度对每个虚拟的超声传感器的 ...

不错的想法。。可以试试
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 04:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表