智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3099|回复: 15
打印 上一主题 下一主题

摄像头组

[复制链接]

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
跳转到指定楼层
1#
发表于 2017-3-27 21:45:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中线提取后怎么发送到上位机?求程序,急急急
回复

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
来自 14#
 楼主| 发表于 2017-3-30 21:16:48 | 只看该作者


/***********************定义变量***************************/#define black 0
#define white 1
#define line 80               
#define hang 60
#define lilun 40               //摄像头理论中心位置60

int32 left,right,mid,leftblack,rightblack;   
int32 Imagesum;
int32 Imageave;
int32 error0=0,error1=0,error;
uint16 LinCout =0;
uint8 Atem8B0 = 0 ;
uint8 ALineOverCout = 0 ;                 //采集完成黑线行数
uint8 ALineCal = 0 ;         
uint8 ADdata[DATALINE][DATACOUNT] ={0} ;        //黑线AD数组存储
uint8 Buffer[hang][line]={0};                       //解压后的数组
uint16 Atemp0 ;
uint8  checkflg = 0 ;     
uint16 i=0,j=0;
uint8  ii ;
uint8 steer_turn;
uint16  black_zuo[line],black_you[line];   //只能看到一条线时的数组
uint8 left_flag [30]={0},right_flag[30]={0};
uint16  Line_Center[60];       //计算出来的中线值存放数组
uint16 lineable=0;       //有效行
uint16 temp=0;
uint8 zuo,  you;
uint8 hang1=20,line1=20;
uint8 err_cnt;
uint8 Road_mid[ hang ][line]={0,0};//赛道中心 【显示用】
int32 search_end_flg=0;
int32 controler_steer;  
vuint8 right_lose=1;
vuint8 left_lose=1;
/***************image process***************************/

int8 err[ 60 ]={0};
int8 slop1;//斜率
int8 slop2;//
int8 slop_add;//


#define STEER_LEFT 166//100 左极限
#define STEER_RIGHT 130//50 右极限
#define STEER_CENTER 145  //舵机中值


vuint8 H_youwan=0,H_zuowan=0,L_youwan=0,L_zuowan=0;

/******************加速度模块变量****************/
uint16 AAngleAcce[6] ;
uint8  AangleCount ;
/****************速度变量****************/
int16 speedcout1,speedcount2 ;
extern SPEEDCOUT speed1[10],speed2[10];
extern uint8  turncount1 ,turncount2  ;
extern vuint8 LPT_INT_count ;  //速度2的count
extern vuint8 DMA_count_Flg  ; //速度1的count
extern vint16 DMALastValue;

float ultrlen ;
extern int32 ultrtime;
/***********************图像处理的行数***************************/

uint8 table[20]={3,6,9,12,15,18,
                 21,24,27,30,33,
                 36,39,42,45,48,
                 51,54,57,60};
//将图像解压扩张
void Imge_Extend()  //字节扩张,1字节8位,以位显示
{
   uint8 i,j;
  for(i=0;i<=60;i++)
    {
              for(j=0;j<DATACOUNT;j++)
                 {
                         if(ADdata[i][j]&0x80) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x40) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x20) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x10) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x08) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x04) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x02) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x01) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;                    
                 }
    }
}
/*****************PWM波的配置*****************************/
void PWM_peizhi(void)
{
  
  FTM_PWM_init(FTM1, CH1 , 100,145);                           //舵机占空比设置初始化   MOD =19531 ;
  
  FTM_PWM_init(FTM0 , CH0, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH1, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH2, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH3, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch)
}
/*************舵机打中***********************/
void duoji(uint16 dj )
{ steer_turn=dj;
FTM_PWM_Duty(FTM2, CH0,steer_turn);  
}
/*************电机正转***********************/
void zhengzhuan_dj(uint32 D1,uint32 D2)
{
  FTM_PWM_Duty(FTM0, CH0,D1);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,0);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,D2);   //PWM2
  FTM_PWM_Duty(FTM0, CH3,0);    //PWM1
  
}
/*************电机反转***********************/
void fanzhuan_dj(uint32 D1,uint32 D2)
{
  FTM_PWM_Duty(FTM0, CH0,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,D1);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH3,D2);     //PWM1
  
}
/*************电机停止***********************/
void stop_dj()
{
  
  FTM_PWM_Duty(FTM0, CH0,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,0);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH3,0);     //PWM1
}




uint16 steer_value,last_steer_value;



uint16  m=0;                 //换行变量
//***************************************************************************************************************
//没有偏振片  实验室里屋桌子内侧三个灯亮,外侧一个灯亮   内侧 阈值最好为191  舵机>1500中间值向左打角,<1500右打角   左偏减小 右偏增大
//****************************************************************************************************

//************* 黑线的中值滤波辅助程序***********************//
int get_mid(unsigned int a,unsigned int b,unsigned int c) //三个数排序  取最大和最小之间的中间值
{ int32 x=0;
if(a>b){x=b;b=a;a=x;}     
if(b>c){x=c;c=b;b=x;}   
if(a>b){x=b;b=a;a=x;}  
return b ;
}
//************* 求绝对值***********************//
uint16 f_abs(int16 t)
{
  if(t>0)
    return t;
  else
  {
    t=-t;
    return t;
  }
}
uint8 n=0;
///////////////////找黑线算法///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void vedge()
{     
  
  static u8 i;
  static u8 left=0,right=0;


   
   H_youwan=0;
   H_zuowan=0;
   L_youwan=0;
   L_zuowan=0;
   
   err_cnt=0;

  Imge_Extend();
  for(hang1=0;hang1<60;hang1++)
  {
    right=0;
    left=0;
    right_lose=0;
    left_lose=0;
   
    for(line1=40;line1<80;line1++) //两边向中间找 扫描范围比较宽  要求图像质量要非常好。
    {  
      if((Buffer[hang1][line1-2]==white)&&
         (Buffer[hang1][line1-1]==white)&&
           Buffer[hang1][line1]==white&&
             Buffer[hang1][line1+1]==black&&
               Buffer[hang1][line1+2]==black )
      {
        right=j;
        right_lose=1;
        break;
      }        
              
    }
    for(line1=40;line1>0;line1--)
    {  
      if((Buffer[hang1][line1+2]==black)&&
         (Buffer[hang1][line1+1]==black)&&
           Buffer[hang1][line1]==white&&
             Buffer[hang1][line1-1]==white&&
               Buffer[hang1][line1-2]==white )
      {
        left=j;
        left_lose=1;
        break;
      }
  
    }
   
    if((left_lose==1)&&(right_lose==1)) //  (左边界+右边界)/2
    {  
      Line_Center[n]=(right+left)>>1;    //((right+left)>>1);       表示除以2            
    }
    /*右弯*/if((left_lose==1 )&&(right_lose==0)) //可能的情况是弯道一边全丢,只扫描到一边另外一边扫描到赛道外面的白点干扰
    {
      H_youwan++;
    }     
    /*左弯*/if((left_lose==0 )&&(right_lose==1)) //可能的情况是弯道一边全丢,只扫描到一边另外一边扫描到赛道外面的白点干扰
    {
      H_zuowan++;
    }  
    if((left_lose==0 )&&(right_lose==0))
    {
      Line_Center[n]=40;
      err_cnt++;
    }
  }
  ////////////////////////////////////////一行图像的信息处理完毕///////////////////////////// ////////////
  //分段部分     
  /////////////////////////////黑线的中值滤波程序////////////////// /////////////////////////////////////////   
for(i=1;i<=19;i++)   
{  
         if(f_abs(Line_Center[i]-Line_Center[i+1])>=3)  
         {
           Line_Center[i]=(Line_Center[i-1]+Line_Center[i+1]*3)<<2;      
         }
         Line_Center[i]=get_mid(Line_Center[i-1],Line_Center[i],Line_Center[i+1]);
         Road_mid[i][ Line_Center[i] ]=black;//中心线显示用     
}   

}
//////////////////////////找黑线完毕///////////////////////////////////////////////////
/*
void shi()
{
  uint8 i;
  vedge();
  for(i=0;i<=20;i++)
  {
    Line_Center[i]=black;
  }
}
void xianshi()
{
  uint8 i,j;
  
  shi();
  for(i=0;i<20;i++)
  {
    for(j=0;j<20;j++)
    {
       uart_putchar(UART3,Buffer[i][Line_Center[j]]);
    }
  }
  
}*/

//-----根据处理的中心线数据控制------------------------------------------------------
void imageProc(void)
{

unsigned int mm=0; // unsigned int sum;
/* 计算小车偏离象素点个数 */
for(mm=0;mm<hang;mm++)
{
    err[mm]=lilun-Line_Center[mm]; /*40 为摄像头象素中间位置 */  
}
slop1 = Line_Center[5]-Line_Center[20];//远端斜率  
slop2 = Line_Center[20]-Line_Center[35];//近端斜率  
slop_add = slop1+slop2;   
if(H_youwan<10&&H_zuowan<10)//直道或小S弯
{
    if(slop1*slop2<0)     //判断赛道类型为小S
    {
        if (slop_add>=-3&&slop_add<=3)        
        {  
          controler_steer=err[9];     
        }  
         else if((slop_add>=-7&&slop_add<-3)||(slop_add>3&&slop_add<=7))      
         {
           controler_steer=err[15];  
         }
         else if((slop_add>=-10&&slop_add<-7)||(slop_add>7&&slop_add<=10))     
         {  
          controler_steer=(3*err[0]+4*err[15]+3*err[30])/10;              
         }     
          else if((slop_add>=-20&&slop_add<-10)||(slop_add>10&&slop_add<=20))     
          {
          controler_steer=(5*err[0]+3*err[15]+2*err[30])/10;      
          }   
     }   
   else     
   {   
     if(slop_add>=-5&&slop_add<=5) // 直道     
     {
      controler_steer=err[0];  
      }   
    else if ((slop_add>-8&&slop_add<-5)||(slop_add>5&&slop_add<8))     
    {
       controler_steer=err[0];  
    }
      else if((slop_add>=-15&&slop_add<=-8)||(slop_add>=8&&slop_add<=15))   
      {
      controler_steer=(3*err[0]+4*err[15]+3*err[30])/10;      
      }  
    else if((slop_add>=-25&&slop_add<=-15)||(slop_add>=15&&slop_add<=25))   
    {
      controler_steer=err[0];   
    }
      else if((slop_add>=-40&&slop_add<=-25)||(slop_add>=25&&slop_add<=40))
    {
      controler_steer=(6*err[0]+4*err[30])/10;   
    }
   }   
}   
else //大S
  {
      if(H_youwan>=10 )  //S右偏  有出赛道情况     
      
      {
         controler_steer=-(H_youwan*2+L_youwan);   
      }     
      if(H_zuowan>=10 ) //S左偏      
      {
         controler_steer=H_zuowan*2+L_zuowan;  
      }  
      if(err_cnt>=10)
      {
           stop_dj();
      }
      else
      {
           zhengzhuan_dj(300,300);//1500
      }   
      // 舵机控制
      if (controler_steer >  15)  
      {
        controler_steer=15;
      }
      if (controler_steer < -15)
      {
        controler_steer=-15;
      }
      steer_turn=(int)(controler_steer*5+STEER_CENTER);//  
      
      if(steer_turn<=STEER_RIGHT)
      {
        steer_turn=STEER_RIGHT;
      }
      if(steer_turn>=STEER_LEFT)  
      {
        steer_turn=STEER_LEFT;
      }
      duoji(steer_turn);
  }

}   

这是主函数上面的子函数,求高手帮忙分析下,被这个问题困扰太久了
回复 支持 反对

使用道具 举报

56

主题

4914

帖子

3

精华

顶级版主

北京科技大学智能汽车队公共主页管理员

Rank: 11Rank: 11Rank: 11Rank: 11

积分
56131

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
19568
贡献
13933
兑换币
3365
注册时间
2010-7-22
在线时间
11315 小时
2#
发表于 2017-3-27 23:20:54 | 只看该作者
程序需要你自己写,嵌入到你的代码里面。最简单的,发串口就行了
回复 支持 反对

使用道具 举报

56

主题

1684

帖子

2

精华

版主

有所思,有所为。

Rank: 9Rank: 9Rank: 9

积分
9497

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章资源大师奖章论坛骨干奖章

威望
6762
贡献
83
兑换币
3601
注册时间
2014-10-31
在线时间
1326 小时
3#
发表于 2017-3-28 07:37:09 | 只看该作者
串口+上位机的协议           一般用通用的上位机都会有历程的,  哪家的找哪家要
回复 支持 反对

使用道具 举报

22

主题

191

帖子

0

精华

常驻嘉宾

天才

Rank: 8Rank: 8

积分
3615
威望
1795
贡献
1146
兑换币
1173
注册时间
2014-12-13
在线时间
337 小时
毕业学校
南京气象学校
4#
发表于 2017-3-28 20:01:19 | 只看该作者
最好中线不要发送到上位机,这个数据量还是比较大的。最好是写一个上位机,捕获采集图像,然后写处理程序,然后再移植到你的芯片!
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
5#
 楼主| 发表于 2017-3-28 20:45:54 | 只看该作者
shen1994 发表于 2017-3-28 20:01
最好中线不要发送到上位机,这个数据量还是比较大的。最好是写一个上位机,捕获采集图像,然后写处理程序, ...

哦,我原本打算传到上位机上看下提取中线的程序对着没.没写过上位机,你有现成的程序没,让我研究学习下.时间有点紧,可以不.2430990510@qq.com
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
6#
 楼主| 发表于 2017-3-28 20:50:51 | 只看该作者
总体的程序写好了,但是运行的时候总会出现问题,程序没错,但是有时候电机不转,有时候是舵机没反应.现在又有了新问题:程序单步运行时听到摄像头采集图像的地方不运行了,这是什么问题,求高手赐教,急急急
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

高级会员

Rank: 4

积分
837
威望
405
贡献
256
兑换币
265
注册时间
2016-11-7
在线时间
88 小时
毕业学校
厦门大学
7#
发表于 2017-3-29 12:50:38 | 只看该作者
楼主有这样的上位机也给我一个吧  多谢啦 907895957@qq.com
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

高级会员

Rank: 4

积分
693
威望
353
贡献
216
兑换币
232
注册时间
2017-3-2
在线时间
62 小时
毕业学校
青岛理工
8#
发表于 2017-3-29 13:11:21 | 只看该作者
给我一个吧3194975376@qq.com
回复 支持 反对

使用道具 举报

56

主题

1684

帖子

2

精华

版主

有所思,有所为。

Rank: 9Rank: 9Rank: 9

积分
9497

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章资源大师奖章论坛骨干奖章

威望
6762
贡献
83
兑换币
3601
注册时间
2014-10-31
在线时间
1326 小时
9#
发表于 2017-3-30 08:40:07 | 只看该作者
章rye 发表于 2017-3-29 12:50
楼主有这样的上位机也给我一个吧  多谢啦

这有什么难的吗??  上位机只要能显示图像不就能显示中线吗??   山外,  智能车助手,  红树,  龙邱, 蓝宙。。。。等等 哪个不能啊,  都可以啊
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
10#
 楼主| 发表于 2017-3-30 19:08:26 | 只看该作者
总体的程序写好了,但是运行的时候总会出现问题,程序没错,但是有时候电机不转,有时候是舵机没反应.现在又有了新问题:程序单步运行时听到摄像头采集图像的地方不运行了,这是什么问题,求大神赐教,急急急
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-28 19:22 , Processed in 0.121765 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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