微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于嵌入式Linux的移动机器人控制系统

基于嵌入式Linux的移动机器人控制系统

时间:09-09 来源:单片机与嵌入式系统 点击:

随着科学技术的发展和社会的需要,移动机器人技术得到了迅速发展,正在渗透到各行各业中,使人们的生活更加便利。现今以单片机为核心的移动机器人存在处理数据量有限、控制系统速度低、人机交互机制单一等缺点,不能满足机器人多任务的要求。系统中增加协处理器的系统结构也得到了广泛应用,虽然可以管理多种传感器,但这种结构却增加了硬件的冗余度和复杂度,见参考文献。为此,提出了以嵌入式处理器S3C2440为核心的多任务机器人控制系统。

1控制系统硬件设计

控制系统选用两轮独立驱动小车为移动式机器人平台,后轮为一个尼龙万向轮。处理器为三星公司的S3C2440,系统主频最高可达533 MHz,外接512 MB的NAND Flash和64 MB的SDRAM,支持SPI、I2C、UART等接口,满足移动机器人控制系统的需求,如图1所示。



图1系统硬件组成

整个控制系统工作过程如下:语音识别芯片LD3320通过SPI总线接口接人ARM处理器,处理器可以对识别的结果进行分析和汇总,并通过查表提取出操作人员的命令码;同时,处理器通过串口读取机器人当前的航向信息;超声波测距和红外线地面检测模块由处理器的GPIO引脚控制;通过控制两自由度的云台,可以进行多方位的超声波障碍物检测,利用LD3320模块的MP3播放功能播放所检测到的障碍物距离和路况信息。控制系统根据传感器的数据和所识别的操作人员的命令码,利用信息融合技术提取环境特征,通过路径规划技术作出决策,控制电机状态,最终控制机器人的姿态。

2控制系统软件设计

在软件设计中,将系统中所有要处理的任务划分为不同的、相互独立的任务模块。根据系统的性能指标和技术要求,可将任务划分为:语音识别、航向测量与计算、超声波测距、电机控制、信息处理等任务。

2.1进程的创建与状态转换

移动机器人控制系统在初始化完成后,利用系统调用fock机制分别为语音识别、航向测量与计算和超声波测距等任务产生相应的子进程,实现方式如图2所示。进程创建成功后,操作系统会根据调度算法进行进程调度,这使系统在行驶过程中,能够及时响应语音命令。



图2系统多进程设计的实现方式

2.2进程间通信机制

在信息处理进程中,需要对不同任务返回的有效数据进行信息处理和融合。由于不同进程的数据段、堆栈段是相互隔离的,因此,采用共享内存的进程间通信方式,在程序中可以使用shmget从系统中取出一块未使用的物理内存并映射到用户空间,如图3所示。



图3共享内存机制示意图

在两个进程之间建立共享内存的具体实现步骤如下:

①在调用fock()前,使用shmget创建新的共享内存,返回值为共享内存标识码:

shmid = shmget(IPC_PRIVATE,1,PERM)

//申请一个字节共享内存

②调用fock()函数,创建子进程,根据fock()的返回值区分父进程和子进程,并分别在两个进程中使用shmat映射一块共享内存,即允许当前进程访问创建的共享内存:

if(fock()) p_addr= shmat(shmid,0,0);

//将共享内存映射到父进程

else{c_addr=shmat(shmid,0,0);}//将共享内存映射到子进程

其中,shmid为shmget()函数的返回值,即共享内存标识码。

从用户的角度看,在父进程中可以对p_addr进行读写操作,实际访问的是申请的共享内存。子进程则可以对c_addr进行读写,从而实现两个进程间的通信。共享内存的映射和进程之间的关系,如图4所示。



图4进程和共享内存映射关系

2.3系统控制流程

在程序初始化完成后,为每项任务创建了相应的进程,并建立了共享内存,如图5所示。在每个进程中采用循环执行方式,语音识别进程中利用select函数监控是否有识别结果输出,并将识别结果写入到相应的共享内存区。



图5系统控制流程图

航向测量和计算进程循环读取陀螺仪的角度信息并存储。超声波测距进程在接收到信息处理进程的控制命令后进行测距并将数据返回至信息处理进程。信息处理进程融合了多传感器的数据,根据设定的路径规划方案,将控制信息传输到电机控制进程,实现机器人姿态的调整。

2.4语音识别

在系统运行过程中,语音识别进程独立完成对语音模块的初始化和读取识别结果的任务,因此,能够及时响应操作人员发出的语音指令。程序中使用了select()函数监控read()是否可读。当语音识别模块LD3320有识别结果时,将在中断引脚输出高电平以触发系统中断,结束驱动程序中的等待状态,同时应用程序可以通过read()函数读取LD332O的识别结果,并写入到相应共享内存区M中。在没有中断时,read()函数将被阻塞,如图6所示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top