亿加合和智能车制作

标题: 大神进来看看吧,为什么舵机打脚总是慢半拍 [打印本页]

作者: 永远的记忆    时间: 2016-3-29 20:51
标题: 大神进来看看吧,为什么舵机打脚总是慢半拍
舵机响应总是慢半拍,原来以为是ccd刷新图像慢,但是通过上位机观察图像发现图像刷新不慢,当图像已经发生变化而舵机打脚总是慢半拍,现在头疼死了,,更奇怪的是我把采集到的数据放大二倍后舵机反应是上来了但是舵机开始抖动起来,而且放大后的图像在白天不适用,真是无语死了,有没有大神遇到过这种情况啊!给点建议吧这到底是因为什么/

作者: xhx331153066    时间: 2016-3-30 15:13
控制周期看一下,可能是周期太长了
作者: 永远的记忆    时间: 2016-3-30 15:31
xhx331153066 发表于 2016-3-30 15:13
控制周期看一下,可能是周期太长了

我用的是蓝宙自适应曝光程序,采用的是跳变沿方法,你是说把20ms的周期改一下

作者: xhx331153066    时间: 2016-3-30 15:51
永远的记忆 发表于 2016-3-30 15:31
我用的是蓝宙自适应曝光程序,采用的是跳变沿方法,你是说把20ms的周期改一下

控制周期简单一点来讲就是你多长时间改变一次舵机(或电机)的值,假如你程序10MS采一次图像,但是20MS才控制一次舵机,那你的控制周期就可以理解为20MS了,还有你说的20MS是20MS采集一次数据??CCD的话貌似周期有点长了啊,我记得我们当初两个CCD才不到10MS~
作者: majorfog    时间: 2016-3-30 15:56
楼上说的对,首先是控制周期的问题,这里指的是你实际跑起来的周期,假如说你设计的是20ms,但是在中断里面做了串口发送或其他一堆耗时的事情,也会把周期给拖长,所以得用IO或者其他方法来测量真实的周期。第二就是硬件问题,舵机供电电压是不是比较低,或者稳压部分工作异常。
作者: 永远的记忆    时间: 2016-3-30 16:50
xhx331153066 发表于 2016-3-30 15:51
控制周期简单一点来讲就是你多长时间改变一次舵机(或电机)的值,假如你程序10MS采一次图像,但是20MS才 ...

恩,我的ccd采集周期是20ms,大神问一下ccd采集回来的图像处理成这样,你感觉怎么样?如果这样的图像用跳变沿会怎么样?



[attach]84599[/attach]

作者: 永远的记忆    时间: 2016-3-30 16:52
majorfog 发表于 2016-3-30 15:56
楼上说的对,首先是控制周期的问题,这里指的是你实际跑起来的周期,假如说你设计的是20ms,但是在中断里面 ...

舵机电压没有问题,把ccd采集回来的值电压值放大两倍后舵机就放应快了,这是为何?是图像处理的不好吗?

作者: 永远的记忆    时间: 2016-3-30 16:54
xhx331153066 发表于 2016-3-30 15:51
控制周期简单一点来讲就是你多长时间改变一次舵机(或电机)的值,假如你程序10MS采一次图像,但是20MS才 ...

大神,舵机的周期不就是20ms吗?这个值还可以改变吗?

作者: majorfog    时间: 2016-3-30 16:55
永远的记忆 发表于 2016-3-30 16:52
舵机电压没有问题,把ccd采集回来的值电压值放大两倍后舵机就放应快了,这是为何?是图像处理的不好吗?
...

算法部分的问题

作者: 永远的记忆    时间: 2016-3-30 16:57
majorfog 发表于 2016-3-30 15:56
楼上说的对,首先是控制周期的问题,这里指的是你实际跑起来的周期,假如说你设计的是20ms,但是在中断里面 ...

[attach]84601[/attach]
图像处理成这样感觉怎么样?

作者: majorfog    时间: 2016-3-30 17:14
永远的记忆 发表于 2016-3-30 16:57
图像处理成这样感觉怎么样?

原始图像是不错,不过看不出来你算法处理之后的结果啊,是不是二值化做的不好

作者: 永远的记忆    时间: 2016-3-30 18:55
majorfog 发表于 2016-3-30 16:55
算法部分的问题

我在看看算法是不是有问题

作者: 永远的记忆    时间: 2016-3-30 18:59
majorfog 发表于 2016-3-30 17:14
原始图像是不错,不过看不出来你算法处理之后的结果啊,是不是二值化做的不好

我没有用二值化,我是采集到图像后滤波然后找跳变沿来确定赛道的边界,

作者: 木偶人    时间: 2016-3-30 19:37
p值小了,,
作者: 永远的记忆    时间: 2016-3-30 20:38
木偶人 发表于 2016-3-30 19:37
p值小了,,

p值不是太小


作者: xhx331153066    时间: 2016-3-31 07:35
永远的记忆 发表于 2016-3-30 16:50
恩,我的ccd采集周期是20ms,大神问一下ccd采集回来的图像处理成这样,你感觉怎么样?如果这样的图像用跳 ...

图像这个样子应该是够用了,至于二值化和跳变沿我觉得用好了都差不多,原理其实都是一样的,舵机的控制周期可以是20MS,但是大家给的都会比20MS短(摄像管组除外),至于小于20MS后到底有没有好的作用或者作用有多大我也不能肯定。但是我感觉控制周期短一些还是好的~
作者: 永远的记忆    时间: 2016-3-31 12:13
xhx331153066 发表于 2016-3-31 07:35
图像这个样子应该是够用了,至于二值化和跳变沿我觉得用好了都差不多,原理其实都是一样的,舵机的控制周 ...

恩,这样的图像不做处理怎么样,加了滤波处理后感觉没有效果?

作者: xhx331153066    时间: 2016-3-31 12:43
永远的记忆 发表于 2016-3-31 12:13
恩,这样的图像不做处理怎么样,加了滤波处理后感觉没有效果?

现在这样可以是可以,不过滤波还是要加的,毕竟跑起来可能就没有这么稳定了

作者: majorfog    时间: 2016-3-31 13:03
永远的记忆 发表于 2016-3-30 18:59
我没有用二值化,我是采集到图像后滤波然后找跳变沿来确定赛道的边界,

不都是一样的么,你提取边沿不也是需要判断跳变么,这个阈值选取的是不是过低了?

作者: 永远的记忆    时间: 2016-3-31 19:05
xhx331153066 发表于 2016-3-31 12:43
现在这样可以是可以,不过滤波还是要加的,毕竟跑起来可能就没有这么稳定了

这是滤波后的图像,我用的是五点滤波,但是滤波前后没有什么区别,是不是跳变沿太低了?跳变沿多少合适?

作者: 永远的记忆    时间: 2016-3-31 19:08
majorfog 发表于 2016-3-31 13:03
不都是一样的么,你提取边沿不也是需要判断跳变么,这个阈值选取的是不是过低了?

跳变沿是多少才合适,前天在群里有个大神说  图像的最大值不要超过125,很纠结

作者: majorfog    时间: 2016-3-31 19:32
永远的记忆 发表于 2016-3-31 19:08
跳变沿是多少才合适,前天在群里有个大神说  图像的最大值不要超过125,很纠结

我觉得用动态的值才是最合理的,有很多种方法可以得到这个动态的阈值,比如双峰法、大津法效果都很好
作者: 永远的记忆    时间: 2016-3-31 19:58
majorfog 发表于 2016-3-31 19:32
我觉得用动态的值才是最合理的,有很多种方法可以得到这个动态的阈值,比如双峰法、大津法效果都很好

好的我试试动态的大津法,谢谢大神,,,,,还有就是舵机在直道上抖动的厉害是不是因为没有滤波或者滤波不好???

作者: majorfog    时间: 2016-3-31 20:01
永远的记忆 发表于 2016-3-31 19:58
好的我试试动态的大津法,谢谢大神,,,,,还有就是舵机在直道上抖动的厉害是不是因为没有滤波或者滤 ...

从你的图像上看感觉没什么噪声,有可能是因为连续几次采样之间有电压跳变引起的,有没有试过放在直道上观察动态的图像呢

作者: 永远的记忆    时间: 2016-3-31 20:13
majorfog 发表于 2016-3-31 20:01
从你的图像上看感觉没什么噪声,有可能是因为连续几次采样之间有电压跳变引起的,有没有试过放在直道上观 ...

好的,试一下

作者: 永远的记忆    时间: 2016-3-31 20:15
majorfog 发表于 2016-3-30 15:56
楼上说的对,首先是控制周期的问题,这里指的是你实际跑起来的周期,假如说你设计的是20ms,但是在中断里面 ...

测量控制周期具体是怎么测?


作者: majorfog    时间: 2016-3-31 20:21
永远的记忆 发表于 2016-3-31 20:15
测量控制周期具体是怎么测?

跟你分享一下我常用的方法好了:找一个IO口配置成输出,在想要测量的地方翻转它的电平状态,写段伪代码:
xxx()
{
   翻转状态;
   若干程序执行语句;
}
这样便可以测量xxx这个函数的执行周期,使用示波器抓取这个IO的信号,测量的周期便是函数执行的周期,这种方法精度很高,比用定时器或其他手段更为精确。同样,可以将上面的代码改一下,比如说:
xxx()
{
   IO电平置高;
   Fn();
   IO电平置低;
}

这样不仅可以测出程序周期,而且还可以测出单个函数的执行时间,上面的Fn()函数执行耗时则为IO信号的高电平时间。

作者: 永远的记忆    时间: 2016-3-31 20:40
majorfog 发表于 2016-3-31 20:21
跟你分享一下我常用的方法好了:找一个IO口配置成输出,在想要测量的地方翻转它的电平状态,写段伪代码: ...

谢谢了

作者: 永远的记忆    时间: 2016-3-31 20:41
永远的记忆 发表于 2016-3-31 20:40
谢谢了

大神加个好友吧,第一次做车没有经验,2240962946我的qq

作者: 永远的记忆    时间: 2016-3-31 20:59
永远的记忆 发表于 2016-3-31 20:40
谢谢了

大神你qq多少???能加个好友吗?
作者: xhx331153066    时间: 2016-4-1 07:29
永远的记忆 发表于 2016-3-31 19:05
这是滤波后的图像,我用的是五点滤波,但是滤波前后没有什么区别,是不是跳变沿太低了?跳变沿多少合适 ...

你可以先这么用着,用的时候也时常看看图像,出现问题了再说,现在应该赶赶进度了,有些细节不必再纠结了

作者: 马达加斯加    时间: 2016-4-1 17:36
我就想问你的CCD前瞻是多少?前瞻太近也会这样的
作者: 马达加斯加    时间: 2016-4-1 17:37
不妨加大一下前瞻
作者: 永远的记忆    时间: 2016-4-1 19:21
马达加斯加 发表于 2016-4-1 17:36
我就想问你的CCD前瞻是多少?前瞻太近也会这样的

40cm

作者: 马达加斯加    时间: 2016-4-1 21:14
速度给多少呢?40CM的前瞻跑2.5以上很吃力的
作者: 永远的记忆    时间: 2016-4-1 21:33
马达加斯加 发表于 2016-4-1 21:14
速度给多少呢?40CM的前瞻跑2.5以上很吃力的

1.5M/s,感觉提线提的不太好

作者: 永远的记忆    时间: 2016-4-1 21:53
majorfog 发表于 2016-3-30 16:55
算法部分的问题

大神,能不能请教你个问题,你看看这两幅采集图像怎么样?其中第二幅是第一幅采集的灰度值的二倍,但是第一幅采集的图像下进去后舵机感觉很迟钝,打角很慢,有的时候不打角,图像放大后(如第二幅图像)舵机反应明显快了很多,这是为啥?[attach]84662[/attach][attach]84663[/attach]

作者: 永远的记忆    时间: 2016-4-1 21:54
xhx331153066 发表于 2016-4-1 07:29
你可以先这么用着,用的时候也时常看看图像,出现问题了再说,现在应该赶赶进度了,有些细节不必再纠结了 ...

好的

作者: 永远的记忆    时间: 2016-4-1 21:55
xhx331153066 发表于 2016-3-30 15:51
控制周期简单一点来讲就是你多长时间改变一次舵机(或电机)的值,假如你程序10MS采一次图像,但是20MS才 ...

大神,能不能请教你个问题,你看看这两幅采集图像怎么样?其中第二幅是第一幅采集的灰度值的二倍,但是第一幅采集的图像下进去后舵机感觉很迟钝,打角很慢,有的时候不打角,图像放大后(如第二幅图像)舵机反应明显快了很多,这是为啥?
[attach]84664[/attach] [attach]84664[/attach]

作者: majorfog    时间: 2016-4-3 13:36
永远的记忆 发表于 2016-4-1 21:55
大神,能不能请教你个问题,你看看这两幅采集图像怎么样?其中第二幅是第一幅采集的灰度值的二倍,但是第 ...

你可以把你提取到的边沿位置放进去观察一下,目测应该就是阈值的事

作者: 永远的记忆    时间: 2016-4-4 13:53
majorfog 发表于 2016-4-3 13:36
你可以把你提取到的边沿位置放进去观察一下,目测应该就是阈值的事

阈值有问题,我查一下

作者: 永远的记忆    时间: 2016-4-5 18:10
majorfog 发表于 2016-4-3 13:36
你可以把你提取到的边沿位置放进去观察一下,目测应该就是阈值的事

大神谢谢了,确实是阈值的问题

作者: 永远的记忆    时间: 2016-4-5 20:41
majorfog 发表于 2016-3-30 15:56
楼上说的对,首先是控制周期的问题,这里指的是你实际跑起来的周期,假如说你设计的是20ms,但是在中断里面 ...

大神,你觉得车进十字容易出十字难是不是和前瞻有关系?还有大神你的十字判定和处理的思想是啥?我的思想是观察两边跳变沿附近
点的灰度值变化,但是这样判定感觉效果不理想????

作者: majorfog    时间: 2016-4-5 20:58
永远的记忆 发表于 2016-4-5 20:41
大神,你觉得车进十字容易出十字难是不是和前瞻有关系?还有大神你的十字判定和处理的思想是啥?我的思想 ...

别这么叫我了。。  我不是大神。。。 你现在的前瞻有多少测过么

作者: majorfog    时间: 2016-4-5 21:00
永远的记忆 发表于 2016-4-5 20:41
大神,你觉得车进十字容易出十字难是不是和前瞻有关系?还有大神你的十字判定和处理的思想是啥?我的思想 ...

是这样的,一般四轮的光电车都需要做十字和丢线的识别,因为转向没有直立那么灵活,很容易就会看到外面去,这个部分的识别每个人做的都不太一样。

作者: xuxuxuxu    时间: 2016-4-5 21:13
asdf
作者: 永远的记忆    时间: 2016-4-5 21:31
majorfog 发表于 2016-4-5 20:58
别这么叫我了。。  我不是大神。。。 你现在的前瞻有多少测过么

那叫前辈吧,测过了,前瞻40cm,车子过十字时能够过去,但是总是在十字里转圈有时偶尔能够从十字里出来,大多说情况是出不来,我试试加大速度直接冲但是效果不理想,好像和车子入弯和出弯车子没有摆正有关??前辈的十字处理思想是啥?

作者: 永远的记忆    时间: 2016-4-5 21:32
xuxuxuxu 发表于 2016-4-5 21:13
asdf

。。。。。什么意思?


作者: 永远的记忆    时间: 2016-4-5 22:29
xhx331153066 发表于 2016-3-30 15:51
控制周期简单一点来讲就是你多长时间改变一次舵机(或电机)的值,假如你程序10MS采一次图像,但是20MS才 ...

大神你的十字处理的思想是啥?


作者: xhx331153066    时间: 2016-4-6 07:36
永远的记忆 发表于 2016-4-5 22:29
大神你的十字处理的思想是啥?

光电的十字具体怎么处理的我已经忘了,时间过去太久了,我们当初应该是两个CCD配合用的,但是最后也没做的太好,我觉得路径好的话十字不用太多处理的,毕竟十字之前最起码有0.5的直道的~
作者: 永远的记忆    时间: 2016-4-10 18:37
majorfog 发表于 2016-3-30 15:56
楼上说的对,首先是控制周期的问题,这里指的是你实际跑起来的周期,假如说你设计的是20ms,但是在中断里面 ...

学长问你个问题,滤波的作用是不是为了消除舵机的抖动?

作者: 申继鹏    时间: 2016-4-11 08:46
你这CCD图像有问题啊,正常采集回来不是这样。。。白天亮,反光,这种情况不能跑也就正常了
作者: 申继鹏    时间: 2016-4-11 08:54
我的CCD图像是这样,我估计你把放大和原始图像弄反了
作者: majorfog    时间: 2016-4-11 10:00
永远的记忆 发表于 2016-4-10 18:37
学长问你个问题,滤波的作用是不是为了消除舵机的抖动?

这取决于你的图像都用在哪里,噪声大的图像不仅会影响方向闭环,还会对一些关键元素的识别造成干扰
作者: 永远的记忆    时间: 2016-4-11 18:00
majorfog 发表于 2016-4-11 10:00
这取决于你的图像都用在哪里,噪声大的图像不仅会影响方向闭环,还会对一些关键元素的识别造成干扰

我的意思是对采集后的图像进行滤波,用的这个滤波程序感觉不是很好,学长你看看这个滤波程序
void lv_bo5(uchar *ccd_pixel)  //冒泡法排序后,改点值为中点值
{
  uchar a[5];//定义一个数组既它的元素为7
  uchar i,j,k,temp;//定义3个变量
  for(k=3;k<125;k++)
  {
        a[0]=ccd_pixel[k-2];
        a[1]=ccd_pixel[k-1];
        a[2]=ccd_pixel[k];
        a[3]=ccd_pixel[k+1];
        a[4]=ccd_pixel[k+2];

       for(i=0;i<4;i++)//进行6轮排序
      {
        for(j=0;j<4-i;j++) //每轮进行6-i次交换
        if(a[j]>a[j+1])
        {
          temp=a[j];
          a[j]=a[j+1];//大的沉底,小的上浮
          a[j+1]=temp;
        }
      }   
      ccd_pixel[k]=a[2];
  }  
}学长说这个滤波不完整,不知道为啥


作者: 永远的记忆    时间: 2016-4-11 18:01
申继鹏 发表于 2016-4-11 08:54
我的CCD图像是这样,我估计你把放大和原始图像弄反了

你的ccd采集的时间是多长?

作者: 笑看人生@仔仔    时间: 2016-4-11 20:20
楼主,请问你的直道抖动和打角延时是怎么解决的啊?
作者: 永远的记忆    时间: 2016-4-11 22:18
笑看人生@仔仔 发表于 2016-4-11 20:20
楼主,请问你的直道抖动和打角延时是怎么解决的啊?

滤波

作者: majorfog    时间: 2016-4-12 11:26
永远的记忆 发表于 2016-4-11 18:00
我的意思是对采集后的图像进行滤波,用的这个滤波程序感觉不是很好,学长你看看这个滤波程序
void lv_bo ...

是这样的,你这个滤波函数能够平滑图像,但是有两个问题,一个是会使跳变沿位置变的更缓,另一个是对于孤点的噪声并不能起到太好的过滤作用。

作者: 永远的记忆    时间: 2016-4-12 11:58
majorfog 发表于 2016-4-12 11:26
是这样的,你这个滤波函数能够平滑图像,但是有两个问题,一个是会使跳变沿位置变的更缓,另一个是对于孤 ...

那学长用的什么滤波方法?你的意思是让图像跳变沿点变得陡些(意思是发生跳变)???????

作者: majorfog    时间: 2016-4-12 16:09
永远的记忆 发表于 2016-4-12 11:58
那学长用的什么滤波方法?你的意思是让图像跳变沿点变得陡些(意思是发生跳变)???????

我搞的时候CCD效果还不错,所以就只用了去除噪点的滤波,原理也很简单,就是判断下和前后点差值过大的点然后滤之~
作者: 永远的记忆    时间: 2016-4-12 17:20
majorfog 发表于 2016-4-12 16:09
我搞的时候CCD效果还不错,所以就只用了去除噪点的滤波,原理也很简单,就是判断下和前后点差值过大的点 ...

奥,我试试,谢谢学长

作者: majorfog    时间: 2016-4-12 17:55
永远的记忆 发表于 2016-4-12 17:20
奥,我试试,谢谢学长

别客气

作者: 永远的记忆    时间: 2016-4-12 18:40
majorfog 发表于 2016-4-12 17:55
别客气

学长用过加权递推平均滤波吗?这个滤波程序我感觉有点问题?
#define N 12
char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};

char code sum_coe= 1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buf[N];
int sum=0;
for (count=0,count<N;count++){
value_buf[count] = get_ad();
delay();
}
for ( count=0;count<N;count++) sum = value_buf[count];
return (char)(sum/sum_coe);
}

他的最后返回的值不应该是灰度值吗?返回的值的大小和N的大小有关,还有就是它怎么滤波怎么起作用的不是很清楚??

作者: 申继鹏    时间: 2016-4-13 09:14
永远的记忆 发表于 2016-4-11 18:01
你的ccd采集的时间是多长?

差不多780us,我放中断采集的,中断时间1ms

作者: majorfog    时间: 2016-4-13 14:50
永远的记忆 发表于 2016-4-12 18:40
学长用过加权递推平均滤波吗?这个滤波程序我感觉有点问题?
#define N 12
char code coe[N] = {1,2,3, ...

这段程序BUG有点多啊:
#1. sum = value_buf[count];   这里的意图是不是sum += value_buf[count] ? 不然就只是取最后一个采样的值,没有什么意义了。
#2. coe[]  这个是什么意思,权值么?似乎并没有使用。
#3. sum/sum_coe,如果2里面coe是权值的话倒是能说得通,那么这段程序就少了加权的部分  for ( count=0;count<N;count++) sum = value_buf[count] 应该改成  for ( count=0;count<N;count++)  sum += value_buf[count]*coe[count];
#4. 这里面完全没有体现到递推,每12次采样独立为一组,递推指的是滑动的若干个采样。

作者: 永远的记忆    时间: 2016-4-13 19:31
majorfog 发表于 2016-4-13 14:50
这段程序BUG有点多啊:
#1. sum = value_buf[count];   这里的意图是不是sum += value_buf[count] ? 不 ...

恩恩,学长我现在纠结一个问题,就是十字,我们是单ccd,上次你告诉我图像阈值有问题解决后速度上来了,我们就把ccd的前瞻调高了,调到44cm左右,然后十字就有问题了,十字速度快了可以直接冲过去,但是速度慢了就会出现串道,我们也尝试了一些方法来处理十字感觉没有效果,尤其我们学校实验室搭的赛道上有个十字是在一个弯道后立马就是十字,每次都是这个十字很容易串道,ccd采集的数据就一行,而且单ccd实在想不到怎么处理十字??学长你以前做车的时候怎么判定十字和处理十字的??????能不能给点思想

作者: majorfog    时间: 2016-4-14 10:56
永远的记忆 发表于 2016-4-13 19:31
恩恩,学长我现在纠结一个问题,就是十字,我们是单ccd,上次你告诉我图像阈值有问题解决后速度上来了,我 ...

弯入十字确实不好处理,单CCD需要加特殊的识别,我个人资料里有Q,私下聊吧

作者: 永远的记忆    时间: 2016-4-14 18:06
majorfog 发表于 2016-4-14 10:56
弯入十字确实不好处理,单CCD需要加特殊的识别,我个人资料里有Q,私下聊吧

学长qq多少,我加你吧,昨天调了p值小车稍微入十字稍微好点





欢迎光临 亿加合和智能车制作 (http://www.znczz.com/) Powered by Discuz! X3.2