自动化_刘胤伯_基于Python和C-C++混合编程的移动机器人控制系统设计

本科毕业论文(设计)

题目:基于Python和C/C++混合编程的移动机器人控制系统设计学院:自动化工程学院

专业:06级自动化3班

姓名:刘胤伯

指导教师:高军伟

2010年 6 月1日

摘 要

移动机器人是一个集环境感知、动态决策与规划、行为控制与执行等多功能于一体的综合系统。它集中了传感器技术、计算机技术、机械、电子、自动化控制以及人工智能等多学科的研究成果,是目前科学技术发展最活跃的领域之一。

为提高移动机器人控制系统的灵活性、可扩展性及跨平台性,本文在已有的激光导航的移动机器人基础上,采用Python和C/C++的混合编程技术开发了激光导航的移动机器人控制系统。建立了两轮驱动、差动转向的移动机器人运动学模型,设计了基于Lyapunov算法和Backstepping算法的移动机器人轨迹跟踪控制器,提出了一种由移动机器人激光测距仪侧得的信息获得移动机器人的当前位姿方法。通过Matlab仿真初步确定了控制参数,减少了实验时控制参数调整的时间,成功地进行了激光导航移动机器人在两种控制算法下室内走廊轨迹跟踪实验。实验结果表明,本文开发的基于Python和C/C++混合编程技术的移动机器人控制系统精度高、实时性好,可以满足移动机器人运动的需要。

关键词:移动机器人;控制系统;Python;C/C++;混合编程;轨迹跟踪

Abstract

Mobile robot is an integrated system of environmental awareness, dynamic decision-making and planning, behavioral control and implementation and other functions. It is one of the most active regions of the current science area that put sensor technology, computer technology, machinery, electronics, automation and artificial intelligence, multi-disciplinary research together.

To enhance the flexibility of mobile robot control system, scalability and cross-platform, the control system of laser navigation robot was developed with the mixed programming of Python and C/C++ based on the laser navigation robot. The kinematics model of the two-wheel drive, differential steering mobile robot was established, the trajectory tracking controller based on Lyapunov method and Backstepping was established, and also the method of location by laser finder was build. In order to shorten the time of find control parameters a simulation was done by Matlab and the parameters was certain. The tracking experiment of laser navigation robot was successful done with the two algorithms in indoor corridor. Experimental results show that the control system developed with the mixed programming of Python and C/C++ is of high precision, real time and can fit the requirement of running reliably under different environments.

Key words: Mobile robot;Control system;Python;C/C++;Mixed programming;

Trajectory tracking

目 录

第一章引言 (1)

1.1课题的提出及意义 (1)

1.2 基于Python的混合语言编程国内外研究现状 (1)

1.3本文的主要研究内容 (3)

第二章基于激光导航的移动机器人控制系统设计 (5)

2.1 激光导航的移动机器人结构及控制系统组成 (5)

2.2 基于EPOS的移动机器人运动控制研究 (7)

2.2.1 基于EPOS的移动机器人运动控制系统组成及原理 (7)

2.2.2 EPOS运动控制器的应用开发 (8)

2.3 移动机器人软件平台及程序开发环境的选择 (10)

2.4 Windows环境下的多线程机制 (11)

2.4.1 进程与线程 (11)

2.4.2 多线程的实现原理 (11)

2.4.3 线程的优先级 (12)

2.4.4线程的同步 (12)

2.4.5 Python多线程技术的开发 (12)

2.5 移动机器人软件系统的设计 (12)

2.5.1 软件开发框架 (12)

2.5.2 软件接口设计 (14)

2.5.3 编译运行模块 (17)

2.6 人机界面的设计 (17)

2.6.1 GUI开发工具简介 (17)

2.6.2 人机界面设计 (18)

2.7 本章小结 (21)

第三章移动机器人轨迹跟踪控制器设计 (22)

3.1 移动机器人轨迹跟踪控制简介 (22)

3.2 移动机器人的运动学模型 (23)

3.3 移动机器人轨迹跟踪控制其设计 (23)

3.3.1 基于Lyapunov算法的移动机器人轨迹跟踪控制器设计 (24)

3.3.2 基于Backstepping算法的移动机器人轨迹跟踪控制器设计 (24)

3.4 本章小结 (26)

第四章激光导航的移动机器人轨迹跟踪控制实验研究 (27)

4.1 实验方法 (27)

4.2 控制参数的确定 (28)

青岛大学本科生毕业论文(设计)

4.2.1 基于Lyapunov算法的移动机器人轨迹跟踪控制参数确定 (28)

4.2.2 基于Backstepping算法的移动机器人轨迹跟踪控制参数确定 (28)

4.3 实验结果及分析 (29)

4.4 本章小结 (31)

全文总结 (33)

参考文献 (34)

攻读学位期间的研究成果 (36)

致谢 (37)

附录:主程序代码 (38)

第一章引言

第一章引言

1.1 课题的提出及意义

移动机器人是一个集环境感知、动态决策与规划、行为控制与执行等多功能于一体的综合系统。它集中了传感器技术、计算机技术、机械、电子、自动化控制以及人工智能等多学科的研究成果,是目前科学技术发展最活跃的领域之一。随着机器人性能不断地完善,移动机器人的应用范围大为扩展,不仅在工业、农业、国防、医疗、服务等行业中得到广泛的应用,而且在排雷、搜捕、救援、辐射和空间领域等有害与危险场合都得到很好的应用[1-2]。因此,移动机器人开发已经得到世界各国的普遍关注。

目前许多机器人的软件系统采用Windows或Linux系统为平台进行软件的开发。由于Windows在国内的普及率比较高,且大部分研究人员都有Windows平台下的开发经历,再加上Windows下软件的入门简单,因此国内大部分机器人软件系统是以Windows为平台.Net为开发环境进行。国外的机器人软件系统开发主要采用Linux平台,由于Linux系统是开源系统,不涉及版权问题,所以在科研方面的使用率非常高,且多年来的开发使Linux下的机器人开发积累了许多资源为后续的开发者提供了方便。在机器人软件系统的开发过程中,为了能使用Linux系统下的强大资源,需要开发一个能够跨平台运行的机器人软件系统,而作为解释型语言的Python为此提供了一个良好的支持。Python语言的程序是运行在Python解释器上的,在Linux系统和Windows系统下Python解释器都可以运行,用Python语言编写的程序不需要修改就可以在不同的系统平台上运行,且Python语言的语法简单,语句便捷,容易读懂,用以开发的程序代码量少,为机器人的开发效率提供了保障。加之Python语言易嵌套其他语言,可以方便的与其他语言混合编程,适合作为主控模块的核心代码[3]。

混合语言编程充分利用了不同编程语言的各自优势,近年来日益受到重视[4-17]。C/C++语言具有简洁,灵活,运算速度快,表达能力强,产生的目标代码质量高,可移植性好,能提供丰富的数据类型和运算符等优点成为编程的优选语言[16]。如使用Python 语言来编写软件的主程序和用户图形界面,而用C/C++语言来编写计算的程序以提高求解的效率,这就使得两种语言的优势互补。

为提高移动机器人控制系统的灵活性、可扩展性及跨平台性,本文在已有的激光导航的移动机器人基础上,采用Python和C/C++的混合编程技术开发激光导航的移动机器人控制系统。因此,本文的研究具有重要的实用价值。

1.2 基于Python的混合语言编程国内外研究现状

Python 是一种解释型、面向对象、动态语义、语法优美的脚本语言,自从1989年由Guido Van Rossum设计出来后,经过20余年的发展,已经成为目前应用最广的跨平台脚本

青岛大学本科生毕业论文(设计)

语言。Python 支持现有的各种主流操作系统,如Microsoft Windows、Solaris、Mac OS、Linux 等,甚至包括Palm OS 这样的嵌入式环境。它的源程序和二进制代码可以免费获得。由于其强大灵活的功能,简洁优美的语法和源代码免费开放,Python 被著名国际自由软件项目KDE 计划选定为标准系统脚本语言,微软公司也宣布将在.NET环境中提供对Python 语言的支持。Python 的特点如下[4]:

(1)面向对象

Python 提供类,类的继承,类的私有和公有属性,例外处理等完善的对面向对象方法的支持。

(2)虚拟机

如Java 一样,Python 程序在执行前要先编译成字节码,再通过一个虚拟机解释执行。

(3)高级数据结构

Python 内置了对列表,关联数组等常用数据结构的支持。

(4)语法简洁优美

Python 的语法非常简单易学,并且采用缩进来表示程序的块层次结构。这样做不仅仅减少了不必要的块符号,更重要的是强制程序员用一种清晰统一的风格书写程序,增加了程序的可读性,降低了维护开销。

(5)易于扩展和嵌入

Python 语言本身只提供了一个编程语言所需功能的最小内核,其它许多丰富的功能都由扩展模块实现。由于在设计时就考虑到了扩展性,可以很方便地用C或者C+ +编写Python 的扩展模块以添加新的功能,或者把Python 解释器自身嵌入到其他程序内部。

由于具有以上特点,Python 特别适用于混合语言编程开发。

近年来,国内外许多学者对基于Python语言的混合编程技术开展了大量研究工作,取得了很多有应用价值的成果。

美国布林莫尔学院的Douglas Blank等,在2002年发表了“A python-based versatile programming environment for teaching robotics”的研究论文[4],首先将基于Python语言编程技术引入移动机器人的教学中,探讨了如何让缺乏编程经验的学生实现机器人及其高级问题的快速开发。在文中,作者对比了开发效率和性能的问题,并指出对于机器人的一般性问题,Python的执行效率即可满足其需要,对于一些复杂的诸如图形显示和复杂控制器并用的程序,Python在运行速度上较慢,但由于其很容易与C/C++语言向结合,可以采用混合编程的方法来解决该问题。美国约翰霍普金斯大学的Kazanzides Peter等采用了多线程技术,利用C++语言开发了机器人软件库,并用Python建立了一个的交互式研究环境,该系统能够被Python脚本配置和执行[5]。英国普利茅斯大学的Lauria S等提出了使用Python 和C语言混合编程,来实现机器人的自编程达到让机器人自己决策的能力[6]。美国的哈维玛德学院的Tribelhorn等采用 Python作为主驱动模块,用蒙特卡洛定位(MCL)建立了机器人在地图中的定位方法,机器视觉方面调用了C的库函数,在Mac OS X系统下研究了机器人的人工智能问题[7]。纽约城市大学的Kamil Wnuk等提出了蒙特卡洛定位法在小成

第一章引言

本机器人定位方面的应用,在其软件接口方面引入了Python和C++两种接口,并指出了Python在机器人开发中由于其易学习和快速开发等原因而被广泛应用的原因[8]。

国内许多许多院校和科研院所的研究人员对基于Python语言的混合编程技术也开展了大量研究工作,也取得了很多有应用价值的成果。北京邮电大学的赵曦和杨福兴设计了一种基于Linux 操作系统和32 位嵌入式处理器的分布式智能机器人控制平台,软件系统采用了混合式体系结构,应用模块在嵌入式Linux 平台上使用自顶向下分层设计,以多任务和基于TCP 协议的可靠多机器人通讯机制管理各功能模块,并引入Python 脚本解决任务策略变换的灵活性问题。该系统具有良好的开放性,为人机混合控制和多机器人协作提供了可靠的平台[10]。江南大学的徐剑飞和薄亚明在开发用于电磁场工程中参数提取的求解器过程中,为兼顾计算效率和方便的界面设计,采用C 语言和Python 语言混合编程技术,使用Python 语言来编写软件的主程序和用户图形界面,而用C 语言来编写计算的程序以提高求解的效率,使得两种语言的优势互补,并探讨了两种语言在求解器中的接口设计方案[11]。西安电子科技大学的董焰民和王保保结合Python 与Matlab 各自的优势,提出几种混合语言编程的方法,旨在通过混合编程提高软件开发的效率[12]。上海理工大学的邹轩和黄义萍针对C语言编写的车辆内置控制器的性能测试Softcar 和SoftcarRT专业软件包,为使其能面向更多的用户,采用Python 语句来操作控制Softcar 及SoftcarRT,设计、编译及构建其中的软件接口,以达到拓展专用测试软件包的功能及强化其适用性的目的[13]。山东大学的李心成和孙殿柱基于Python 语言,利用GTK+和VTK接口函数的Python绑定(Binding),解决了在界面中的嵌入问题,通过Glade图形界面生成器生成GTK+图形界面,采用C/C++语言编写GUI应用程序功能模块并封装成接口函数库,完成了界面模块、渲染模块和功能模块的有机集成[14]。华中科技大学的王晓宇,陈吉红和黄植红Windows用平台下Python与C/C++语言的两种API接口,实现了Python与C/C++语言的混合语言编程,提出了一种基于Python的软件结构[15]。北京航空制造工程研究所的石庆华,曹正华和丁立民本采用Python 脚本语言,对ABAQUS 前处理进行了二次开发,讨论ABAQUS 对象模型、Python 语言接口以及详细的ABAQUS 前处理开发过程中各种主要对象模型的调用方法,表明采用Python 语言进行二次开发,可以节省大量建模时间,提高工作效率[16]。.中国科学院武汉岩土力学研究所的刘振平等提出了基于脚本语言Python的三维地质建模复合系统开发模式,采用Python语言来建立三维可视化系统,通过调用相关的C或者C++模块来弥补Python 处理大数据量的不足,提高了系统的开发效率[17]。

1.3 本文的主要研究内容

本文主要针对提高移动机器人控制系统的灵活性、可扩展性及跨平台性开展研究工作,其主要研究内容如下:

(1)在已有的激光导航的移动机器人的基础上,采用Python和C/C++混合编程技术开发移动机器人控制系统。

(2)建立两轮驱动、差动转向的移动机器人运动学模型,设计基于Lyapunov算法和

青岛大学本科生毕业论文(设计)

Backstepping算法的移动机器人轨迹跟踪控制器。

(3)利用激光导航的移动机器人,在两种控制算法下进行室内走廊轨迹跟踪实验,验证基于Python和C/C++混合编程技术的激光导航的移动机器人控制系统的正确性和可行性。

第二章 基于激光导航的移动机器人控制系统设计

第二章基于激光导航的移动机器人控制系统设计

2.1 激光导航的移动机器人结构及控制系统组成

激光导航的移动机器人结构如图2.1所示。该移动机器人的整体尺寸为长0.81m、宽0.66m、高0.51m,采用四轮两轮驱动差动转向的方式。两个驱动轮布置于机器人的前侧,均采用橡胶充气轮胎,具有良好的附着和减震性能。每个驱动轮分别由独立的电机驱动,可通过上位工控计算机向EPOS运动控制器发送相关命令来控制驱动电机的转速、转向、加速度等运动参数,从而实现机器人的前进、后退以及差速转向运动。从动轮采用实心橡胶万向轮,仅起支撑作用。机器人对外界信息的感知是通过激光测距仪获得的,机器人利用获得的信息完成避障、导航等工作。

图2.2 LMS200型激光测距仪

图2.1 激光导航的移动机器人结构示意图

激光测距仪为德国施克(SICK)公司生产的LMS200型激光测距仪,该测距仪为无接触式测量系统,具有速度快、精度高、测量范围大等优点。LMS200型激光测距仪的扫描范围为180°,扫描距离为0~80m可调,分辨率为10mm,检测方式为漫反射型。LMS200具有0.25°、0.5°和1°三种可调扫描间隔模式,其响应时间分别为53.33ms、26.67ms、13.33ms。

青岛大学本科生毕业论文(设计)

图2.2 激光导航的移动机器人

工控机选用研华AIMB-560工业控制微机,CPU 主频为3.0GHz 的Intel Pentium4处理器,内存1G ,配有CAN 总线适配卡,RS232串行通讯接口。

EPOS 运动控制器是模块化结构的数字伺服控制器,它具有转矩、速度、位置等多种运动控制方式,可以比较容易的实现各种复杂控制,目前已广泛的应用于各种机器人运动控制中。EPOS 可以采用RS232串行通讯总线与上位机(主机)进行通讯,也可采用CAN 总线与上位计算机通讯,实现多个EPOS 运动控制器的实时同步控制。由于本机器人只有两个EPOS 运动控制器,为降低成本,采用两个RS232与上位机(主机)进行通讯。

图2.2所示为激光导航的移动机器人。

移动机器人控制系统如图2.3所示。控制系统主要由环境信息感知系统、上位计算机主控制系统、运动控制系统等组成。环境感知系统由LMS200激光测距仪组成;上位计算机主控制系统主要由工控机以及各种外围器件组成;运动控制系统主要由EPOS 运动控制器、编码器、直流伺服电机等组成。

工控机通过激光测距仪感知当前环境,通过串口给EPOS 运动控制器发出相应的命令,EPOS 运动控制器根据得到的命令对驱动电机进行控制实现机器人避障导航。机器人还可通过无线网卡与笔记本电脑通讯,进行远程控制,实现机器人运动。

第二章 基于激光导航的移动机器人控制系统设计

图2.3 移动机器人硬件系统工作原理

2.2 基于EPOS的移动机器人运动控制研究

2.2.1 基于EPOS的移动机器人运动控制系统组成及原理

图2.4为EPOS运动控制器与上位机、驱动电机的硬件结构图。该运动控制系统主要由EPOS运动控制器、编码器、直流伺服驱动电机和工控机等组成。工控机通过串口给EPOS 运动控制器发出相应的命令,EPOS运动控制器根据得到的命令对驱动电机进行控制以实现机器人运动。同时EPOS运动控制器通过编码器得到当前电机的位置和速度,构成闭环控制。

图2.4 EPOS运动控制器与上位机、驱动电机的硬件结构图

EPOS运动控制器有多种控制方式,本文采用速度控制模式。如图2.5所示,设移动机器人左、右两轮的角速度分别为ωl、ωr,则移动机器人的运动速度v和航向角速度ω为

v=r(ωl+ωr)/2 (2-1)

ω=r(ωl-ωr)/B(2-2)式中,ωl=(2v-Bω)/2r;ωr=(2v+Bω)/2r;B为轮距;r为驱动轮半径。

当航向角速度ω不同时,移动机器人对应的运动状态,如表2.1所示。

青岛大学本科生毕业论文(设计)

图2.5 移动机器人速度控制示意图

表2.1 移动机器人运动状态

ωω=0 ω<0 ω>0

运动状态直线右转左转

当ωl=-ωr时,移动机器人速度v=0,此时移动机器人进行原地转向运动。由此可见,通过改变两轮的角速度ωl、ωr即可实现预期的运动状态。

在速度模式下,可通过设定电机的转速并控制电机以设定的速度连续转动。

已知移动机器人的运动速度v和航向角速度ω,为得到最终的控制命令,需要将这两个变量转化为左右两个驱动电机所需转速n,转化方法如下:

πω

l

l i

n

×

=

30

(2-3)π

ω

r

r i

n

×

=

30

(2-4)

式中,i为减速比。

2.2.2 EPOS运动控制器的应用开发

EPOS运动控制器使用Windows下的32位驱动函数库来进行开发,在开发时可用EPOS 运动控制器的API函数对EPOS运动控制器发送命令进行运动控制。

EPOS运动器提供了Definitions.h、EposCmd.lib和EposCmd.dll三个库文件,包含70多个运动控制指令函数,程序通过对这些API函数的调用来完成打开设备、初始化设备、设置运动参数、运动控制及关闭设备的工作。

表2.2所示为在EPOS的应用开发中主要调用的API函数及其功能描述。

基于移动机器人运动学模型,采用C/C++语言编写的运动控制代码如下:

第二章 基于激光导航的移动机器人控制系统设计

int go(double v, double w)

{

double wl,wr;

set_v(v);

c_t_mode(0x03);

wl=(w*WHEEL_DISTANCE+2*v)/WHEEL_DIA;

wr=(2*v-w*WHEEL_DISTANCE)/WHEEL_DIA; 表2.2 EPOS 主要API 函数及功能描述

API 函数

功能描述 VCS_OpenDevice ( ) 打开上位机应用程序与EPOS 运动控制器之间的连接

通道,返回用于表示EPOS 设备的句柄。

VCS_CloseDevice ( ) 关闭EPOS 运动控制器与上位机之间的通道,必须与

函数OpenDevice ( ) 配对使用。

VCS_SetProtocolStackSettings ( ) 设置设备与上位机间通讯速度和超时时间,

VCS_ClearFault ( ) 将EPOS 运动控制器由Fault 状态转变为Disable 状态。

VCS_SetEnableState ( ) 将EPOS 运动控制器设置为Enable 状态。

VCS_SetDisableState ( ) 将EPOS 运动控制器设置为Disable 状态。

VCS_SetOperationMode ( ) 设置设备的工作模式,常用的有速度模式(Velocity

Mode)和位置模式(Position Mode)两种。

VCS_SetVelocityProfile ( ) 应用于速度模式下,主要用来设置电机启动的加速度

和停止转动时的减速度。

VCS_MoveWithVelocity ( ) 应用于速度模式下,设定电机的转动速度并且控制电

机以设定的速度连续转动。

VCS_HaltVelocityMovement ( ) 应用于速度模式下,使电机停止转动。

VCS_SetPositionProfile ( ) 应用于位置模式下,主要用来设置电机启动的加速度、

停止转动时的减速度以及转动速度。

VCS_MoveToPosition ( ) 应用于位置模式下,设置电机转动的圈数并且控制电

机以设定的速度转动到目标位置。

VCS_HaltPositionMovement ( )

应用于速度模式下,使电机停止转动。

青岛大学本科生毕业论文(设计)

set_w_l(wl);

set_w_r(wr);

VCS_MoveWithVelocity(m_hRightEPOS, m_RightEPOSID, m_w_r,

&m_RightdErrorCode );

VCS_MoveWithVelocity(m_hLeftEPOS,

-m_w_l,

m_LeftEPOSID,

&m_LeftdErrorCode );

1;

return

}

函数中v参数为移动机器人的运动线速度,当v为正时,左电机反转、右电机正转,机器人直线前进;当v为负时,左电机正转、右电机反转,机器人直线后退。函数中w参数为移动机器人的运动角速度,当w为正时,机器人右转;w为负时,机器人左转。当v=0时,给予适当的w值,可使机器人原地转向。

上述函数可以满足移动机器人实际运动的需要,当机器人进行导航控制时,根据环境感知模块采集的环境信息,通过决策系统来判断采取那种运动,然后设置相应的电机运动参数就能使机器人准确地到达目的点。

2.3 移动机器人软件平台及程序开发环境的选择

目前许多机器人的软件系统采用Windows或Linux系统为平台进行软件的开发。由于Windows在国内的普及率比较高,且大部分研究人员都有Windows平台下的开发经历,再加上Windows下软件的入门简单,因此国内大部分机器人软件系统是以Windows为平台.Net为开发环境进行的。国外的机器人软件系统开发主要采用Linux平台,由于Linux 系统是开源系统,不涉及版权问题,所以在科研方面的使用率非常高,且多年来的开发使Linux下的机器人开发积攒了许多资源为后面的开发者提供了方便。在机器人软件系统的开发过程中,为了能使用Linux系统下的强大资源,需要开发一个能够跨平台运行的机器人软件系统,而作为解释型语言的Python为此提供了一个良好的支持。Python语言的程序是运行在Python解释器上的,在Linux系统和Windows系统下Python解释器都可以运行,用Python语言编写的程序不需要修改就可以在不同的系统平台上运行,且Python语言的语法简单,语句便捷,容易读懂,用以开发的程序代码量少,为机器人的开发效率提供了保障。加之Python语言易嵌套其他语言,可以方便的与其他语言混合编程,适合作为主控模块的核心代码。

混合语言编程充分利用了不同编程语言的各自优势,近年来日益受到重视。C/C++ 语言具有简洁,灵活,运算速度快,表达能力强,产生的目标代码质量高,可移植性好,能提供丰富的数据类型和运算符等优点成为编程的优选语言。使用Python 语言来编写软件的主程序和用户图形界面,而用C/C++语言来编写计算的程序以提高求解的效率,这就使得两种语言的优势互补。

由于激光导航的移动机器人的EPOS运动控制器仅提供了Windows平台下的软件接

第二章 基于激光导航的移动机器人控制系统设计

口,而未提供Linux平台下的开发接口,需要自行开发。因时间有限,为了降低开发难度,本文采取了基于Windows平台的开发策略,采用Python和C/C++混合编程技术进行机器人软件系统开发,为实现系统的跨平台性奠定基础。

目前多线程技术被广泛的应用在各种软件系统中[18-20],本文在进行移动机器人的软件系统设计时采用了多线程技术,有效的解决了导航过程中各部分操作任务的同步和实时性问题。

2.4 Windows环境下的多线程机制

2.4.1 进程与线程

进程和线程是两个相对的概念。一个进程通常定义为程序的一个实例。在Win32中,进程占据4GB的地址空间。与进程在MS-DOS和16位Windows操作系统中不同, Win32进程是没有活力的,也就是说,一个Win32进程并不执行什么指令,它只是占据着4GB 的地址空间。除了地址空间,进程还占有某些资源,比如文件、动态内存分配和线程。当进程终止时,在它生命期中创建的各种资源将被清除。线程实质上是程序中的执行路径,也是 Win32 安排的最小执行单元。线程包括堆栈、CPU 寄存器的状态和系统计划程序执行列表中的项。每个线程共享所有进程的资源。一个进程至少包括一个线程,称为主线程,由系统自动生成,其它线程则可以由该主线程创建。在Windows中,一个进程可以创建同时运行的多个线程。

2.4.2 多线程的实现原理

创建一个进程时,它的第一个线程称为主线程(Primary thread),由系统自动生成。然后可以由这个主线程生成额外的线程,而这些线程,又可以生成更多的线程。在运行一个多线程的程序时,从表面上看,这些线程似乎在同时运行。而实际情况并非如此,为了运行所有的这些线程,操作系统为每个独立线程安排一些CPU时间。单CPU操作系统以轮转方式向线程提供时间片(Quantum),每个线程在使用完时间片后交出控制,系统再将CPU 时间片分配给下一个线程。由于每个时间片足够的短,这样就给人一种假象,好像这些线程在同时运行。创建额外线程的唯一目的就是尽可能地利用CPU时间。

从根本上说,线程是可由系统调度的一个最简单的代码单元。一个多线程的应用程序实际上在其内部实现了多任务扩展,为代码赋予了并行执行的特性,因而可以执行某些实时性或随机性很强的操作,提高对CPU的利用率,加快通信程序的信息处理速度。

2.4.3 线程的优先级

当系统需要同时执行多个进程或多个线程时,有时会需要指定线程的优先级。操作系统以优先级为基础安排所有的活动线程,系统的每一个线程都被分配了一个优先级,优先级的范围从0~31。运行时,系统简单地给第一个优先级为31的线程分配CPU时间,在该线程的时间片结束后,系统给下一个优先级为31的线程分配CPU时间。当没有优先级为31的

青岛大学本科生毕业论文(设计)

线程时,系统将开始给优先级为30的线程分配CPU时间,以此类推。除了程序员在程序中可以改变线程的优先级外,有时程序在执行过程中系统为了保证系统对终端用户的高度响应性也会自动地动态改变线程的优先级。

2.4.4 线程的同步

在线程体内,如果该线程完全独立,与其他线程没有数据存取等资源操作上的冲突,则可按照通常单线程的方法进行编程。但是,在多线程处理时情况常常不是这样,线程之间经常要同时访问一些资源。由于对共享资源进行访问引起冲突是不可避免的,这样如何保证线程之间不破坏彼此的数据就显得格外重要。为了解决这种线程同步问题,Win32 API 提供了4种同步控制对象来帮助程序员解决共享资源访问冲突,分别为:互斥体对象(Mutex)、信号对象(Semaphore)、事件对象(Event) 和临界区对象(CriticalSection)。

2.4.5 Python多线程技术的开发

在Python中,提供了两种多线程编模块:thread和threading。thread模块是实现线程的低级接口,而threading可以提供高级的方法。因为threading可以自动完成一些任务,所以大多数Python程序使用threading。

对于 Python 来说,其标准库中包括了对线程、进程和异步 I/O 的支持。在许多情况下,通过创建诸如异步、线程和子进程之类的高层模块,Python 简化了各种并发方法的使用。除了标准库之外,还有一些第三方的解决方案,例如 Twisted、Stackless 和进程模块。

在Python下创建线程是一个较为简单的任务,在Python安装包里已经提供了线程模块,需要调用时仅需导入threading模块。在线程的创建过程中需要两步即可使线程运行:即实现线程函数和启动线程。

(1)实现线程函数

线程函数完成的功能由实际应用决定。编写线程函数与编写普通函数没有区别,当一个函数作为线程被调用时首先应该声明该函数原型:

t=threading.Thread(target = threadcode , name = ‘ChildThread’)

其中, target参数指出的是一旦线程启动所需运行的函数名称。name参数指出的是该线程的的名称,只是一种标识,是可任选的,它会设置一个稍后可以通过getName()函数来得到的值。

(2)启动线程

当线程被声明后,新线程的调用以t.start()函数开始。由于前面target已经被设置,只要线程被启动,就会立刻调用threadcode()函数,从而运行该线程。

2.5 移动机器人软件系统的设计

2.5.1 软件开发框架

图2.6所示为移动机器人软件系统工作流程图。在该系统的软件设计中采用了PyDev for

第二章 基于激光导航的移动机器人控制系统设计

图2.6 激光导航的移动机器人软件系统工作流程图

Eclipse环境下的多线程技术,整个系统是由一个主线程、两个工作线程(环境处理线程、运动控制线程)组成。主线程负责整个程序的运行,同时负责避障传感器的信息获取和人机界面的信息交互工作。两个工作线程中,环境处理线程负责将激光测距仪中读取的数据进行处理后发送到公共信息区;而运动控制线程,则根据从公共信息区获得的环境信息以及障碍信息通过系统的运动控制器来对移动机器人的运动进行控制,同时将各项运动参数

青岛大学本科生毕业论文(设计)

写入公共信息区。

在整个控制软件中,采用Python语言和C/C++语言的混合编程。对运行速度没有特别要求的模块如GUI,串口通信,采用Python语言进行开发;而对于运动控制模块,由于EPOS运动控制器只提供了Windows下的应用程序接口,并且路径规划程序的运算量较大,对速度要求较高,采用C/C++语言编写。

2.5.2 软件接口设计

整个软件编程主要是用Python语言,C/C++ 语言只占了一小部分,因此设计中,将用C/C++语言编的运动控制模块做成一个扩展模块嵌入到Python语言中。下面给出了在软件中的接口设计方法。

在使用C/C++语言和Python语言混合编程时,需要事先构建编程环境。由于编程环境在Windows下搭建的,需使用GCC编译器,而Windows下并没有该编译器,所以需要安装MinGW以提供GCC的开发环境。MinGW提供了一套简单方便的Windows下的基于GCC 程序开发环境,收集了一系列免费的Windows 使用的头文件和库文件;同时整合了GNU的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等,为C/C++的跨平台开发提供了良好基础支持。同时,在转化动态库文件时,会用到pexport,dlltool,也需要提前下载。在代码粘合时,要用SWIG,安装后需将其/bin路径添加到系统环境目录下。

在用C/C++语言和Python语言的混合编程中,在Windows下用SWIG来建立Python 的C/C++扩展,为了增加跨平台特性,本文应用GCC编译器来编译C/C++的代码,具体方法如下:

(1)建立libpython26.a静态库

为了创建python扩展,需要连接python的库,然而大多数python只提供可供Microsoft Visual C++下可开发调用的动态库文件,GCC编译器需要一个.a的静态库文件,所以需要将python26.lib转化为libpython26.a,在转化时需用到pexport,dlltool,执行:pexports python26.dll > python26.def

dlltool –dllname python26.dll –def python26.def –output-lib libpython26.a

然后将生成后的libpython26.a拷贝到与python26.lib相同的目录下。

(2)建立libEposCmd.a静态库

由于机器人运动控制器采用的是EPOS运动控制器,但该运动控制器没有提供Python 语言的API,所以在开发过程中须将其他语言的API转化成为Python可以调用的形式,再进行二次开发。本文选择的是对EPOS的C/C++语言API进行转化,使之能被Python调用,具体方法如下:

将EposCmd.dll转化成静态库

pexports EposCmd.dll > EposCmd.def

dlltool -U -d EposCmd.def -l libEposCmd.a

将生成的静态库放到mingw的lib目录下。

第二章 基于激光导航的移动机器人控制系统设计

(3)编写motion.i文件

motion.i文件是根据C++文件编写的,程序的motion.i文件如下:

%module mymodule

%{

#include "motion.h"

%}

extern const double WHEEL_DISTANCE = 63,//两驱动轮之间的距离

extern const double WHEEL_DIA = 28,//驱动轮直径单位cm

extern const double PI =3.1415926;

extern const double WHEEL_C = PI*WHEEL_DIA;//一级减速齿轮的传动比;extern const double BIG_GEAR1 =43;//大齿轮齿数

extern const double SMALL_GEAR1 =1;//二级减速齿轮的传动比

extern const double BIG_GEAR2 =40;

extern const double SMALL_GEAR2 =19;

extern const double PULSE_PER_C = 2000;// 电机轴转一圈的编码器的脉冲数×4 class Motion

{

public:

Motion();

~Motion();

HANDLE m_hRightEPOS; //右EPOS连接接口

HANDLE m_hLeftEPOS; //左EPOS连接接口

int init(); //1表示初始化成功

int m_speed; //当前设置的运行速度cm/s

m_w_r;

int

m_w_l;

int

m_set_wr;

double

double

m_set_wl;

m_set_velocity;

double

int m_speed_cm_s; //当前设置的运行速度 cm/s

char

m_RightMode;

m_LeftMode;

char

m_c_Rightspeed;

long

m_c_Leftspeed;

long

rightPositionIs;

long

leftPositionIs;

long

青岛大学本科生毕业论文(设计)

rightTargetPosition;

long

leftTargetPosition;

long

int m_acceleration;//

int m_acceleration_cm_s2;//

int m_deceleration;//

int m_deceleration_cm_s2;//

xe,ye,te,v_op,w_op;

double

stop();

int

int c_t_mode(char mode);

state_en();

int

state_dis();

int

get_speed();

long

long

get_palstance();

position_is();

int

target_position();

int

show_value();

void

int go(double v, double w);

int set_v(double v);

int set_w_l(double w);

int set_w_r(double w);

int set_w_lr(double w);

void xyt_e(double d,double theta);

void vw_op(double vr,double wr);

void vw2_op(double vr,double wr);

void vw_op(double k1,double k2,double k3,double vr,double wr);

void vw2_op(double k1,double k2,double k3,double k4,double vr,double wr);

int go_forward();

int go_forward(int dis);//前进cm

go_back();

int

int go_back(int dis);//退后cm

int set_speed(int v); //为1表示成功v为cm/s

int set_acceleration(int a); //设置加速度为1表示成功 cm/s2

int set_deceleration(int a); //设置减速度为1表示成功 cm/s2

int turn_right(double angle); //右转角度angle,角度需要为正值,单位为度

int turn_left(double angle);

bool if_target_reached(); //是否到达预定的位置,positon模式时使用返回1表

相关文档
最新文档