高速巡线算法
A. 怎么让舵机停下来
以后程序记得写清楚点,规范化一点,还有,需要有必要的注释好不好,不然人家怎么知道你的d1是干嘛的?
这里我当做是你的笔误吧
“
// oji1();
”
前面的“//”应该没有的吧
你的意思应该是:
不断执行oji1();
同时不断检测按键之类的。
你想想,你进入了oji1();
当你按下d1后,它怎么能停下来呢,因为d1放在了oji1();的后面
而且你想要实现及时反应的话,你的算法本身就有问题。
想过另外一个算法吧。
要不就把问题补充详细点,我帮你想一个。
对了我这里有个自己以前做巡线小车的程序,拿去看看吧
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit infl1=P3^4; //inf代表红外对管,1为外,2为内。
sbit infl2=P3^5;
sbit infr2=P3^6;
sbit infr1=P3^7;
sbit pwm=P1^0; //信号线
uchar jd,count;
void time_init() //中断初始化
{
TMOD=0x01;
TH0=0xff; //高电平单位脉冲时间定为方式1,晶振频率为11.0592,0.1ms
TL0=0xa3;
IE=0x82;
TR0=1;
}
void time_ini()interrupt 1 //中断函数
{
TH0=0xff; //重新赋新值
TL0=0xa3;
if(count<jd)
pwm=1;
else pwm=0;
count++;
count=count%200; //脉冲周期20ms
}
void keyscan() //按键扫描
{
if(infr1==0)
{
jd=11;
count=0;
while(infr1==0);
}
if(infr2==0)
{
jd=13;
count=0;
while(infr2==0);
}
if(infl1==0)
{
jd=19;
count=0;
while(infl1==0);
}
if(infl2==0)
{
jd=17;
count=0;
while(infl2==0);
}
}
void main()
{
jd=15; //舵机初始角度为90度,自己定义为0度
count=0;
time_init();
while(1)
{
keyscan();
}
}
B. 简述激光雷达的结构原理分类及特点
激光雷达发射器先发射激光,经过物体( O b j e c t ObjectObject )反射后被 C M O S CMOSCMOS (一种图像传感器,即图中 I m a g e r ImagerImager )捕捉,设捕捉点为 x 2 x_2x
2
。现过焦点 O OO 作一条虚线平行于入射光线,交 I m a g e r ImagerImager 于 x 1 x_1x
1
,由于 β \betaβ 已知,所以可得到 x 1 x_1x
1
的位置。记 x 1 , x 2 x_1,x_2x
1
,x
2
之间距离为 x xx,易得左右两个三角形相似,所以有:q f = s x \frac{q}{f}=\frac{s}{x}
f
q
=
x
s
,又有 s i n β = q d sin\beta=\frac{q}{d}sinβ=
d
q
,二者联立可得 d = s f x s i n β d=\frac{sf}{xsin\beta}d=
xsinβ
sf
.
这样就可得到物体到激光发射器的距离 d dd 了,激光雷达将这样的发射器和接收器组装在一起,经过机械旋转360°即可得到一周障碍物的距离。
TOF测距原理
由三角测距的计算公式不难发现,当距离 d dd 很大时,每变化 δ d \delta dδd 引起的 x xx 变化很小,导致精度下降,这就限制了测量范围。
而TOF(Time of flight)原理克服了测量距离这一难点,并且提高了精度:
TOF原理十分简单,就是利用光速测距。首先激光发射器发射激光脉冲,计时器记录发射时间;脉冲经物体反射后由接收器接受,计时器记录接受时间;时间差乘上光速即得到距离的两倍。
TOF原理看似简单,但是实现起来确有很多难点:
计时问题:由于光速过快,测量时间会变得很短。据网上数据得:1cm的测量距离对应65ps的时间跨度。这需要计时器的精确度很高。
脉冲问题:发射器需要发射高质量的脉冲光,接收器接受脉冲光的时候需要尽量保持信号不失真。
对于同一距离的物体测距时,得到的回波信号可能不一样,如下图的黑白纸,这就需要特殊的处理方式来处理。
但总的来说TOF原理的精度远远超过三角测距,只是由于诸多难点导致成本略高。像大一立项时因为没钱,所以用的三角测距的思岚A1,精度不是很高。而ROBOCON战队里的sick激光雷达就是TOF原理,精度非常高,贵是有道理的~
雷达分类
机械激光雷达
机械激光雷达使用机械部件旋转来改变发射角度,这样导致体积过大,加工困难,且长时间使用电机损耗较大。但由于机械激光雷达是最早开始研发的,所以现在成本较低,大多数无人驾驶公司使用的都是机械激光雷达。
MEMS激光雷达
MEMS全称Micro-Electro-Mechanical System,是将原本激光雷达的机械结构通过微电子技术集成到硅基芯片上。本质上而言MEMS激光雷达是一种混合固态激光雷达,并没有做到完全取消机械结构。
主要原理为:通过MEMS把机械结构集成到体积较小的硅基芯片上,并且内部有可旋转的MEMS微振镜,通过微振镜改变单个发射器的发射角度,从而达到不用旋转外部结构就能扫描的效果。
大致原理如下图:
相控阵激光雷达
两列水波干涉时会出现某处高某处低的情形:
光学相控阵原理类似干涉,通过改变发射阵列中每个单元的相位差,合成特定方向的光束。经过这样的控制,光束便可对不同方向进行扫描。雷达精度可以做到毫米级,且顺应了未来激光雷达固态化、小型化以及低成本化的趋势,但难点在于如何把单位时间内测量的点云数据提高以及投入成本巨大等问题。
动态原理图如下:
FLASH激光雷达
FLASH激光雷达原理非常简单:在短时间内发射出一大片覆盖探测区域的激光,再以高度灵敏的接收器,来完成对环境周围图像的绘制。
激光雷达的数据
分成N份
分成M份
N线点云数据
1线点云数据
时间戳
1个点云数据
点云数量M
X方向偏移量
Y方向偏移量
Z方向偏移量
反射强度
激光雷达数据的处理顺序一般为:
数据预处理(坐标转换,去噪声)
聚类(根据点云距离或反射强度)
提取聚类后的特征,根据特征进行分类等后处理工作。
激光雷达数据的处理顺序一般为:
数据预处理(坐标转换,去噪声)
聚类(根据点云距离或反射强度)
提取聚类后的特征,根据特征进行分类等后处理工作。