1.2 熟悉MATLAB编程
在此简单介绍一些MATLAB编程的基本语法和规则。这些内容是最基础的,也是在控制机器人的编程中需要使用的。
1.2.1 语言基础
(1)变量
所谓变量是指在运算过程中可以改变数值的量。在MATLAB中定义变量的名称时要遵守以下规则:①变量名必须以字母或者下划线开头,而不能是数字,也不能使用标点符号;②变量名的长度是有要求的,执行namelengthmax命令后的结果就是允许的变量名的最长字符数;③变量名是区分大小写的,例如A和a是不同的变量名,代表着两个不同的变量。
变量包括预定义变量和用户自定义变量。表1-1是几个常用的MATLAB预定义变量,我们在定义自己的变量时,一定不要使用这些预定义变量,因为它们是有特殊意义的。如果将我们的自定义变量也取这些特殊变量的名称,则会覆盖原来的值,就会造成使用的混乱。
表1-1 常用的预定义变量
例1-4 用户自定义变量的使用
(2)基本运算
①算术运算 算术运算符及其意义如表1-2所示。
表1-2 算术运算符及其意义
说明
在MATLAB中,存在一种特殊的除法,被称为左除(\)。例如5\6,指的是5被6除(即6除以5)。
例1-5 算术运算
>> 5/6 %计算 5除以 6 ans= 0.8333 >> 5\6 %计算 5被 6除 ans= 1.2000 >> power(5,2) %计算 5的 2次方,power是求乘方的常用函数 ans= 25
②关系运算和逻辑运算 关系运算符和逻辑运算符及其意义分别如表1-3和表1-4所示。
表1-3 关系运算符及其意义
表1-4 逻辑运算符及其意义
1.2.2 程序设计基础
(1)M文件
我们通常将编写的程序保存在一个文件里,用MATLAB编写的程序文件被称为M文件,这是因为文件的扩展名为.m。使用MATLAB文件的好处就是可以将一组MATLAB命令组合起来存成一个M文件,从而一次就全部执行这些命令。
在MATLAB的命令窗口键入如下指令就可以打开文件编辑器。我们的程序在文件编辑器里输入后就可以被保存为M文件了。
>> edit %打开文件编辑器
打开文件编辑器时就会自动创建一个未命名的空白文件,如图1-9所示。可以直接在里面输入MATLAB程序。
图1-9 文件编辑器
MATLAB的M文件可以分为两大类,分别为脚本(Script)文件和函数(Function)文件。
脚本文件通常用于执行一系列简单的MATLAB命令,运行时只需要输入文件名,MATLAB就会自动按文件中的程序顺序来执行文件中的各条命令。
函数文件和脚本文件不同,它既可以接受其他函数传来的参数,也可以将自己的计算结果返回到调用自己的原函数中。在一般情况下,用户不能单独输入函数文件的文件名来运行函数文件,而必须由其他语句或函数来调用。
(2)基本语法结构
在MATLAB的程序设计中,也有最基本的三种结构,分别是顺序结构、选择结构和循环结构。任何复杂的程序都可以由这三种基本结构组成。
因为各种编程语言在这三种结构上基本相似,所以下面只给出几个例题,而不做详细说明。
例1-6 数据输入输出
>> A=input('Please input A:') %显示字符串并等待输入变量 A的值 Please input A:3 %输入数字 3 A= %显示执行结果 3 >> B=[1 2 3;4 5 6;7 8 9]; %定义一个 3*3的矩阵 >> disp(B) %显示数据 1 2 3 4 5 6 7 8 9
例1-7 利用顺序结构绘制曲线
现在我们试用文件编辑器。首先在MATLAB的命令窗口中键入edit并回车,创建一个新的脚本文件。在编辑器里输入如下程序:
t=0:0.01:4*pi; %定义时间范围从 0到 4π,步长为 0.01 y=exp(-0.2*t).*(cos(t)+i*sin(t)); %函数表达式 plot(t,real(y),t,imag(y)) %绘制曲线
第二行语句表示函数y=e-0.2t(cost+isint)。第三行语句是利用plot函数绘制两条曲线,这两条曲线均以时间t为横坐标,分别以y的实部y=e-0.2tcost和虚部y=e-0.2tsint为纵坐标。
将该文件保存为当前默认路径下的myapp.m。在MATLAB的命令窗口输入“my-app”并回车后,得到的执行结果如图1-10所示。
图1-10 例1-7的执行结果
例1-8 利用选择结构求解二次方程的根
a=input('请输入 a:'); b=input('请输入 b:'); c=input('请输入 c:'); if(b^2-4*a*c)< 0 disp('这个方程有一对共轭复根'); elseif(b^2-4*a*c)==0 disp('这个方程有两个相同的实根'); else disp('这个方程有两个不同的实根'); end %选择结构要以 end表示选项结束
运行结果如下:
请输入 a:3 请输入 b:4 请输入 c:5 这个方程有一对共轭复根
例1-9 利用选择结构进行奇偶判定
value=input('请输入一个一位整数:'); switch(value) case{1,3,5,7,9}, disp('The value is odd.'); case{0,2,4,6,8}, disp('The value is even.'); otherwise, disp('The value is out of range.'); end
运行结果如下:
请输入一个一位整数:4 The value is even
例1-10 设x=2.1,表达式f(x)=x2-x-1,计算f(f(f…(f(x))))共10次,即求取f10(x)的值。分别用for循环和while循环完成。
①for循环
x=2.1; %设置初值 for n=1:10 %设定循环次数 y=x^2-x-1; %表达式 x=y; %将结果赋值给 x,返回进入下一次循环 end y %输出结果
运行结果如下:
y= -0.2934
②while循环
x=2.1; %设置初值 n=1; %设定循环次数初值 n=1 while n< =10 %设定总的循环次数 y=x^2-x-1; %表达式 x=y; %将结果赋值给 x n=n+1; %循环次数累计,增加 1 end y %输出结果
运行结果如下:
y= -0.2934
比较
对于同一个问题,在已知循环次数的情况下,for循环相对while循环要简洁一些。
特别提醒
在执行含有循环语句的程序时,有可能由于程序的缺陷出现死循环的状态,也就是长时间在MATLAB窗口左下角出现如图1-11所示的状况(单词Busy长时间存在)。
图1-11 循环出错的可能状态
一旦进入死循环状态,程序将一直停留在循环体内部,无法跳出循环去执行下边的内容。此时CPU将一直处于运行状态,无法停下来。
此时,有两种解决方式:一是直接关掉MATLAB软件,二是使用Ctrl+C键强制使运算终止。
当我们在编写大型程序的时候,CPU占用较高时,如果出现了死循环,严重的后果很可能是计算机死机。所以在编写循环结构的时候,一定要注意循环体内、外语句的处理,特别是循环条件的设置要合理,避免死循环的出现。
实际上,在程序设计过程中,经常会遇到各种问题。例如:显示大量出错信息、意外跳出子程序、中途意外停止循环或无法跳出循环等。下面介绍几个在复杂程序调试中可以使用的流程控制语句。
①break和continue语句
在MATLAB中,一般情况下break和continue用在循环语句中,能够影响到循环语句的流程。在循环语句中,当出现break的时候,它的作用是立即终止循环,使用方法是:
break;
与break不同,在循环语句中,当遇到continue语句的时候,它的作用是结束本次循环,但是不跳出循环,还要继续进行下一次循环。一般而言,break和continue与if语句配合使用。continue的使用方法是:
continue
②try...catch语句
在MATLAB中,try/catch语句是对异常情况进行处理的语句,用于捕捉错误。一般情况下,当程序运行时如果遇到错误,程序会终止执行。但如果将可能出错的程序放在try语句中,那么程序会执行catch语句而不会中断程序的执行,因此可以分析并发现程序中的错误。其语法结构是:
try 语句块 catch 语句块 End
③return语句
在MATLAB中,return语句用于退出正在运行的脚本或函数。这个语句通常放在一个函数的末尾,用于正常结束函数的运行。当然,也可以放置在程序的其他位置,通过对某些条件的判断,在满足条件的情况下,使用return语句终止当前运行并返回。
(3)编写MATLAB函数文件
正如前面提到的,函数文件是一种特殊的M文件。将一个完整的函数保存成一个文件便于将来直接调用它。函数文件的功能相对独立,但一般不能单独执行,需要被其他文件或函数来调用。
这一节将说明函数文件的编写和使用方法,这是因为后面在讲述机器人的控制时,我们会将控制机器人的各种功能分别保存为不同的函数文件。
MATLAB函数文件的基本格式如下。
①函数定义行(函数文件的第一行)
function[outarg1,outarg2,...]=fname(inarg1,inarg2,...)
函数文件的第一行首先书写关键字function。通过该关键字,MATLAB才能够辨识出该文件为函数文件。
方括号中的是输出变量,当变量有多个时要用逗号隔开。如果只有一个输出变量时可以省略方括号。
fname是函数名称,起名规则与前面提到的变量命名规则相同。圆括号内是输入变量。与输出变量不同的是,即使只有一个输入变量也不可以省略圆括号。
②H1行 H1行是函数文件中在函数定义行下面的一行文字,以%开头,是对整个函数内容的简要精炼概括。当用look for命令查询函数时,显示的就是该行的内容。H1行只能有一行文字,而且是很重要的一行内容,不可以省略。
③帮助文本行 该部分内容同H1行一样以%开头,是对该函数的一个较为详细的介绍,包括函数的用法、功能以及修改记录等。帮助文本行可以有多行文字。当用help命令时查询到的即是H1行和该部分的所有内容。
④函数体 函数体是函数的主要部分,就是函数的代码,这些代码用来实现函数的功能。
下面用一个实例来说明如何编写自己的函数以及如何调用自定义的函数文件。
例1-11 编写一个计算两点间距离的函数
说明
①由于MATLAB内部有相应的distance函数用于求距离,我们可以直接调用。该例只是为了学习自定义函数的编写和调用方法。
②在命名自定义函数的函数名称fname和保存函数文件的文件名称时,要注意函数名称要与文件名称相同。该名称要具有直观性、有意义,通过取名让其他人能够大致了解该函数所要实现的功能。此外,还要注意取名不能与MATLAB内所存在的函数名以及系统的保留字相同。
例如,我们希望自定义函数的名称为dist1,为了避免重复,我们可以先用如下指令检查字符串“dist1”是否已经存在。
>> which dist1 %查找 dist1 'dist1' not found. %执行结果:dist1不存在,因此可以将自定义函数 %取名为 dist1
③要注意输入变量和输出变量的个数。因为该例中输入变量为两个点的坐标值,因此输入变量为两个,分别为point1和point2。输出变量只有一个,即距离y。
首先在MATLAB的命令窗口执行“edit”,打开编辑器,输入下列内容:
将以上程序在当前目录中保存为dist1.m(请注意,文件名称一定要与函数名称一致)。然后在命令窗口进行调用:
>> A=[3,4]; >> B=[5,6]; >> result=dist1(A,B)
执行结果:
y= 2.8284
y即是计算的结果。
1.2.3 绘图基础
MATLAB作为一款功能强大的软件,不仅在数值分析方面独占鳌头,它也具有很强的图形处理功能,而且使用方便。本节先介绍一些简单的绘图函数,这些绘图函数能够较好地使用在对机器人的控制上,这是因为可以形象地描述出机器人的运动过程。
(1)二维图形
①二维绘图函数
MATLAB中绘制二维图形的常用函数是plot。它的调用格式如下:
plot(y) plot(x,y) plot(x1,y1,x2,y2…)
说明
plot(y)
以y为纵坐标,根据向量y的元素序号自动生成从1开始的序列作为横坐标。
plot(x,y)
a.x,y是同维矩阵时,则以x,y对应的列元素为横、纵坐标分别绘制曲线。曲线的条数等于矩阵的列数。
b.x是向量,y是矩阵,但y有一行或一列的维数与向量x中的元素个数相同时,则绘制出多条不同色彩的曲线。曲线的条数等于y矩阵中与x的元素个数不同的维数,x被作为这些曲线共同的横坐标。
plot(x1,y1,x2,y2…)
每对xi、yi(i=1,2,…)都必须符合plot(x,y)的要求,分别对每一对xi、yi绘制曲线。也就是说,在同一幅图中,分别绘制plot(x1,y1),plot(x2,y2)…。
例1-12 给定一组点(x,y)的坐标值,绘制曲线。
>> x=[1 2 2.5 4 5 6.5 7.5]; %定义向量 x >> y=[3 3.6 5 7 6 3.2 5]; %定义向量 y >> plot(x,y) %x为横坐标,y为纵坐标绘制曲线
绘制的曲线如图1-12所示。
图1-12 绘制例1-12的曲线
例1-13 绘制正、余弦函数
t=0:0.01:2*pi; %给定时间范围和步长 y1=sin(t); %正弦函数 y2=cos(t); %余弦函数 plot(t,y1,t,y2) %绘制函数曲线
图1-13所示的两条曲线,横坐标均为时间t,纵坐标分别为y1(正弦函数)和y2(余弦函数)。
图1-13 例1-13的函数曲线
②绘图属性的设置
在使用plot函数绘制二维曲线时,有时需要区分多条曲线或者凸显某条曲线,为此我们可以利用下面的调用格式在绘制图线的同时设置线条的不同颜色、线型、点型。
plot(x,y,'color linestyle marker')
以上命令中,color(颜色)、linestyle(线型)、marker(点型)的设置分别如表1-5~表1-7所示。
表1-5 颜色color定义符
表1-6 线型linestyle定义符
表1-7 常用的点型marker定义符
③坐标、背景等的设置
一般而言,多数情况下是用默认的设置绘制图形。但是,有时候需要修改坐标、背景等的显示属性,下面介绍相关的命令。
a.坐标轴的设置
axis([xmin xmax ymin ymax]) %设定横、纵坐标的最小值与最大值 axis auto %使用默认的坐标轴属性 axis on/off %显示/取消坐标轴
b.背景网格设置
grid on %显示网格线 grid off %去除网格线 grid %切换网格线的有无
c.其他设置指令
box on %添加坐标边界 box off %去除坐标边界 box %切换坐标边界的有无 hold on %打开追加绘图方式 hold off %关闭追加绘图方式
例1-14 绘制不同表现形式的曲线
①第一条曲线用蓝色下三角形的点线表示;
②第二条曲线用红色星号的实线表示;
③第三条曲线用绿色加号的虚线表示。
程序如下:
t=0:0.3:2*pi; %设置时间和步长 y1=sin(t); %函数表达式 y2=cos(2*t); y3=2*sin(t); grid on %显示网格线 plot(t,y1,'bv:',t,y2,'r*-',t,y3,'g+--'); %绘制曲线 xlabel('X'); %为 x、y轴加标签 ylabel('Y');
运行结果如图1-14所示。
图1-14 例1-14的运行结果
④特殊的二维绘图函数
表1-8列出的是一些特殊的二维绘图函数,读者可以利用这些函数自行绘制一些有趣的图形,以加深理解与掌握MATLAB的强大绘图功能。
表1-8 特殊的二维绘图函数
(2)三维图形
MATLAB提供了丰富的三维绘图函数。与二维绘图函数相比,三维图形具有视角、光照及透明度等设置项。三维图形包括:三维曲线图、三维网格图、三维曲面图。
①三维曲线图
函数plot3用于绘制三维曲线图,注意与之前绘制二维曲线的plot函数进行区分。格式如下:
plot3(x1,y1,z1,x2,y2,z2…)
例1-15 绘制机械阻尼振荡随时间变化的三维曲线图
程序如下:
t=0:0.1:15; %设置时间和步长 x=exp(-0.2*t).*cos(2*t); %函数表达式 y=exp(-0.2*t).*cos(2*t); plot3(x,y,t); %绘制三维曲线图
运行结果如图1-15所示,这里是以时间t为z轴绘制的。
图1-15 例1-15的运行结果
②三维网格图
mesh函数用于绘制三维网格图,格式如下:
mesh(Z) %用矩阵 Z的列、行下标作为 x轴和 y轴变量画网格线 mesh(X,Y,Z) %分别用 X、Y、Z作为 x、y、z轴的坐标
这里补充一个在三维绘图里很重要的函数meshgrid,它用于形成二维网格数据点。格式如下:
[X,Y]=meshgrid(x,y)
③三维曲面图
函数surf用于三维曲面图的绘制,用法与三维网格图绘制函数mesh相同,格式如下:
surf(Z) surf(X,Y,Z)
例1-16 绘制二元方程的三维网格图和三维曲面图。
程序如下:
x=-5:0.1:5; %设置 x、y的范围 y=-5:0.1:5; [X,Y]=meshgrid(x,y); %形成网格数据点 z=exp(-0.5*(X.^2+Y.^2)); %二元方程 subplot(2,1,1); %绘制第一个图 mesh(x,y,z); %三维网格图 subplot(2,1,2); %绘制第二个图 surf(x,y,z); %三维曲面图
运行结果如图1-16所示。
图1-16 例1-16的运行结果
④三维图形的调整
a.色彩的调整MATLAB提供了colormap函数,可以根据颜色映像矩阵对三维图形的绘图色彩进行调整,格式如下:
colormap %设置当前颜色映像矩阵 colormap('default') %恢复颜色映像矩阵为默认值 cmap=colormap %获取当前颜色映像矩阵
b.颜色渲染属性调整 对颜色渲染属性的调整运用的是shading函数,格式如下:
shading flat %平面渲染,同一个小网格面和相应的线段用同一种颜色渲染 shading faceted %平面渲染,网格线都用黑色,这是默认渲染方式 shading interp %通过颜色插值方式渲染
c.透明度调整 对透明度的调整运用的是alpha函数,格式如下:
alpha(alpha_data)
alpha_data是一个介于0到1之间的数,alpha_ data=0表示完全透明,alpha _data=1表示完全不透明。alpha_data的值越接近0,透明度越高。
d.光照属性调整 对光源的调整运用的是light函数,格式如下:
light('PropertyName',propertyvalue,...)
该函数建立一个光源,并设置光源属性(Position、Color、Style)。
e.视点位置调整 视点也就是观察者的角度,在不同的角度可以观察到图形不同的特征。在MATLAB中对视点位置的调整用view函数实现,格式如下:
view(az,el)
说明
视点的位置是由方位角(az)和仰角(el)控制的。方位角又叫旋转角,也就是视点位置在XY平面上的投影与X轴形成的角度。仰角又叫做XY平面的上仰或者下俯角,视点的位置在XY平面的上方即是正值,反之在XY平面的下方就是负值。在三维绘图时候,默认值为az=-37.5,el=30。
例1-17 绘制不同视点的三维图形。
程序如下:
z=peaks(40); %系统提供的多峰函数 subplot(2,2,1); mesh(z); %以默认方式绘制子图 1 subplot(2,2,2); mesh(z); view(-17,60); %指定子图 2的视点 subplot(2,2,3); mesh(z); view(-90,0); %指定子图 3的视点 subplot(2,2,4); mesh(z); view(-10,-10); %指定子图 4的视点
执行结果如图1-17所示。
图1-17 例1-17的运行结果
这些MATLAB编程和绘图基础是非常有用的,会大量使用在对机器人的控制处理上,特别是在突出从不同角度、以不同方式显示控制的效果时。