openflow应用如此灵活,好像可以用在校园网上欸
![](/assets/uploads/profile/727-profileavatar-1539499728337.png)
pencil 发布的帖子
-
RE: DLP4500 LightCrafter可编程投影仪学习
此陀螺仪可以通过脉冲来实现帧的切换,对时间的精度也极高,与嵌入式系统连接较方便。在需要图像操作的工业控制中有较大作用。
-
RE: ICM-20690 六轴传感器学习记录
此陀螺仪用于较高级的设备上,与平常使用的MPU6050,MPU9250等设备相比精度较高,且有与OIS防抖摄像头相连接的直接矫正系统,用于带有OIS功能的手机上极其方便。
-
RE: 一种常用工业控制算法PID
因为PID的三个参数对初学者来说比较难以调试,他们可以选择在Matlab中的Simulink软件,自己对系统进行建模,然后进行仿真,由电脑来生成三个参数
绘制的图像如下
-
一种常用工业控制算法PID
在自动控制中,PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景。
1、PID算法基本原理
PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。对于一般的研发人员来说,设计和实现PID算法是完成自动控制系统的基本要求。这一算法虽然简单,但真正要实现好,却也需要下一定功夫。首先我们从PID算法最基本的原理开始分析和设计这一经典命题。
PID算法的执行流程是非常简单的,即利用反馈来检测偏差信号,并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。其功能框图如下:
根据上图我们考虑在某个特定的时刻t,此时输入量为rin(t),输出量为rout(t),于是偏差就可计算为err(t)=rin(t)-rout(t)。于是PID的基本控制规律就可以表示为如下公式:
其中Kp为比例带,ti为积分时间,TD为微分时间。PID控制的基本原理就是如此。
2、PID算法的离散化
上一节简单介绍了PID算法的基本原理,但要在计算机上实现就必须将其离散化,接下来我们就说一说PID算法的离散化问题。在实现离散化之前,我们需要对比例、积分、微分的特性做一个简单的说明。
比例就是用来对系统的偏差进行反应,所以只要存在偏差,比例就会起作用。积分主要是用来消除静差,所谓静差就是指系统稳定后输入输出之间依然存在的差值,而积分就是通过偏差的累计来抵消系统的静差。而微分则是对偏差的变化趋势做出反应,根据偏差的变化趋势实现超前调节,提高反应速度。
在实现离散前,我们假设系统采样周期为T。假设我们检查第K个采样周期,很显然系统进行第K次采样。此时的偏差可以表示为err(K)=rin(K)-rout(K),那么积分就可以表示为:err(K)+err(K+1)+┈┈,而微分就可以表示为:(err(K)- err(K-1))/T。于是我们可以将第K次采样时,PID算法的离线形式表示为:
也可以记为:
这就是所谓的位置型PID算法的离散描述公式。我们知道还有一个增量型PID算法,那么接下来我们推到一下增量型PID算法的公式。上面的公式描述了第k个采样周期的结果,那么前一时刻也就是k-1个采样周期就不难表示为:
那么我们再来说第K个采样周期的增量,很显然就是U(k)-U(k-1)。于是我们用第k个采样周期公式减去第k-1个采样周期的公式,就得到了增量型PID算法的表示公式:
当然,增量型PID必须记得一点,就是在记住U(k)=U(k-1)+∆U(k)。
3、PID控制器的基本实现
完成了离散化后,我们就可以来实现它了。已经用离散化的数据公式表示出来后,再进型计算机编程已经不是问题了。接下来我们就使用C语言分别针对位置型公式和增量型公式来具体实现。
(1)位置型PID的简单实现
位置型PID的实现就是以前面的位置型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散位置型PID公式的计算机语言化。
首先定义PID对象的结构体:
/定义结构体和公用体/
typedef struct
{
floatsetpoint; //设定值
floatproportiongain; //比例系数
floatintegralgain; //积分系数
floatderivativegain; //微分系数
floatlasterror; //前一拍偏差
floatresult; //输出值
floatintegral;//积分值
}PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue)
{
floatthisError;
thisError=vPID->setpoint-processValue;
vPID->integral+=thisError;
vPID->result=vPID->proportiongainthisError+vPID->integralgainvPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
vPID->lasterror=thisError;
}
这就实现了一个最简单的位置型PID控制器,当然没有考虑任何干扰条件,仅仅只是对数学公式的计算机语言化。
(2)增量型PID的简单实现
增量型PID的实现就是以前面的增量型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散增量型PID公式的计算机语言化。
首先定义PID对象的结构体:
/定义结构体和公用体/
typedef struct
{
floatsetpoint; //设定值
floatproportiongain; //比例系数
floatintegralgain; //积分系数
floatderivativegain; //微分系数
floatlasterror; //前一拍偏差
floatpreerror; //前两拍偏差
floatdeadband; //死区
floatresult; //输出值
}PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue)
{
floatthisError;
floatincrement;
floatpError,dError,iError;
thisError=vPID->setpoint-processValue; //得到偏差值
pError=thisError-vPID->lasterror;
iError=thisError;
dError=thisError-2*(vPID->lasterror)+vPID->preerror;
increment=vPID->proportiongainpError+vPID->integralgainiError+vPID->derivativegain*dError; //增量计算
vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
vPID->lasterror=thisError;
vPID->result+=increment;
}
这就实现了一个最简单的增量型PID控制器,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。
4、基本特点
前面讲述并且实现了PID控制器,包括位置型PID控制器和增量型PID控制器。界限来我们对这两种类型的控制器的特点作一个简单的描述。
位置型PID控制器的基本特点:
Ø 位置型PID控制的输出与整个过去的状态有关,用到了偏差的累加值,容易产生累积偏差。
Ø 位置型PID适用于执行机构不带积分部件的对象。
Ø 位置型的输出直接对应对象的输出,对系统的影响比较大。
增量型PID控制器的基本特点:
Ø 增量型PID算法不需要做累加,控制量增量的确定仅与最近几次偏差值有关,计算偏差的影响较小。
Ø 增量型PID算法得出的是控制量的增量,对系统的影响相对较小。
Ø 采用增量型PID算法易于实现手动到自动的无扰动切换。
-
RE: 可以用于树莓派的OPENCV图像处理框架
在嵌入式开发中为什么使用Opencv不用matlab,在嵌入式开发中,若需要用到较大量的图像处理运算,简单的单片机一般是无法达到所需的速度的,这样一来就需要小型计算机来辅助计算,一般使用的miniPC或者树莓派这种都是使用Linux系统进行开发,如果使用matlab,空间占用大,极不方便使用。若使用Opencv,体积较小,而且编程语言为C++,C,或者python,方便使用串口,GPIO等外部接口,是极其便利的。
-
RE: stm32cubemx
感谢师傅传授Cubemx神技,Cubemx为stm32系列单片机提供了统一的平台,为项目的移植,RTOS的搭建起到极大的方便作用,之前都是手动一个一个配置、移植,用了这个之后简直开启了新世界的大门。
-
RE: VMware复制CentOS虚拟机后无法上网的解决方案
对,在键盘驱动被安装的情况下,仍然无法加载/dev/下的键盘文件,也有可能是/etc/udev/rules.d/下缺少相关自动生成dev规则问题。
若系统功能不全,缺少生成rules下的规则文件的脚本,在转移虚拟机时硬件地址发生改变,也有可能会产生无法检测到某些硬件的情况。 -
RE: Matlab GUI基础
再补充一篇关于MATLAB的数值运算的内容
求反函数finverse
求复合函数compose
求微分diff
求极限limit
① 默认求X→0极限
② 求无穷大极限
求不定积分
syms x a
I1=int(1/sqrt(x^2+a^2));
F1=simple(I1);
I2=int(1/sqrt(x^2-a^2));
F2=simple(I2);
F=[F1;F2];F =
log(x + (a^2 + x^2)^(1/2))
log(x + (x^2 - a^2)^(1/2))解方程组
syms x y
[x,y]= solve('x^2+xy+y=3','x^2-4x+3=0');
solution=[x,y]solution =
[ 1, 1]
[ 3, -3/2]解超越方程组
syms x y
S = solve('sin(x+y)-exp(x)*y=0','x^2-y=2');S =
x: [1x1 sym]
y: [1x1 sym]S.x
ans =
-0.66870120500236202933135901833637S.y
ans =
-1.5528386984283889912797441811191求微分方程的通解
syms x a
S1=dsolve('Dx=-ax');
S2=dsolve('Dx=-ax','x(0)=1');
solution=[S1;S2];solution =
C2exp(-at)
exp(-a*t)
-
RE: Matlab GUI基础
Guide的使用
用Guidata更新数据
若一个控件的回调函数新添加了一个handles.a=5
在没有Guidata(hObject,handles)时,在其他回调函数中利用此数据时会报错。
因此要在声明handles.a=5后加上此句。
H1=Guidata(h)可将h中的数据储存在H1中.- Get a copy of the data with the command data= guidata(object_handle).
- Make the desired changes to data.
- Save the changed version of data withthe command guidata(object_handle,data).
用Userdata和Value传递数据
Userdata什么都可以装,Value只能装数。
中断的使用
在一个回调函数的while中,若没有中断,另一个按键的回调函数不会进行。
Drawnow 可跳出循环 更新一下图形。
Waitfor(h) 在h被关闭后向下执行,Waitfor(h,’propertyname’)在子对象变化时Waitfor(h,’propertyname’ ,’propertyvalue’)在子对象值变为某一定值时继续。
Pause(n) 暂停n sec。
Getframe 存取图像,与movie(H,n)配合使用。 -
RE: Matlab GUI基础
Figure对象中的回调函数
CreatFcn:在Figure被创建时的回调函数。
DeleteFcn:在Figure被删除时的回调函数。
CloseRequestFcn:在Figure在关闭请求时的回调函数。
ResizeFcn:在Figure被改变大小时的回调函数。
ButtonDownFcn:在Figure对象上点击鼠标回调函数。
注:set(h,'SelectionType',’Value’) 设置点击类型
normal---单击鼠标左键
extend---按住shift的同时单击鼠标左键,或左右键同时按
alternate---按住ctrl的同时单击鼠标左键,或单击右键
open---双击KeyPressFcn:在Figure对象上按键回调函数。
KeyReleaseFcn:在Figure对象上松开按键回调函数。Uicontrol控件类型
(1) 触控按钮(pushbutton)
(2) 切换按钮(togglebutton)
(3) 列表框(listbox)
(4) 下拉菜单(popupmenu)
(5) 复选框(checkbox)
(6) 单选按钮(radiobutton)
(7) 滑动条(slider)
(8) 静态文本(text)
(9) 可编辑文本(edit)
(10) 框架(frame)Uicontrol对象的属性
设置回调函数的方式
如何设置回调函数 如何定义回调函数
set(h, 'StartFcn', 'myfile') function myfile
set(h, 'StartFcn', @myfile) function myfile(obj, event)
set(h, 'StartFcn', {'myfile', var1, var2, ...}) function myfile(obj, event, arg1, arg2, ...)
set(h, 'StartFcn', {@myfile, var1, var2, ...}) function myfile(obj, event, arg1, arg2, ...)1、第一种情况:字符串,不需要向回调函数传递任何参数
2、第二种情况:句柄,向回调函数传入调用回调函数的对象的句柄以及event(matlab留待以后使用)的值。
3、第三、四种情况:向回调函数传入调用回调函数的对象的句柄以及用户想要传递的参数(多个)。Matlab读写txt
打开与关闭文件fopen
返回文件句柄file_t = fopen('mytxt.txt','r');
关闭文件:fclose(句柄)
关不利索就:fclose(‘all’)'r' Open file for reading.
'w' Open or create new file for writing. Discard existing contents, if any.
'a' Open or create new file for writing. Append data to the end of the file.
'r+' Open file for reading and writing.
'w+' Open or create new file for reading and writing. Discard existing contents, if any.
'a+' Open or create new file for reading and writing. Append data to the end of the file.
'A' Open file for appending without automatic flushing of the current output buffer.
'W' Open file for writing without automatic flushing of the current output buffer.读文件textscan和fscanf
Txt含两列数据
A = textscan(file_t,'%d %d');都放A里
[C,D]= textscan(file_t,'%d %d');放在两个里
textscan(file_t,'%d %d',’headline’,5);忽略五行标题使用textscan扫描字符串数据
str_1 = 'The number is 1 2 3 4 5';
%首先使用textscan获取第前14字符,读一次,并返回读最后一个的位置
[str1,position1] = textscan(str_1,'%14c',1);
%获取字符串度
[temp1,temp2] = size(str_1);
%读取面数字字符串
str_2 = textscan(str_1(position1+1:temp2),'%9c',1);
fscanf用来扫描文件的数据如果我有的东西不想读可以按下列方式跳过
写文件fprintf
想要格式化文件从头写在fopen里设置’w’
写不进去要看看是不是fopen设置的只读‘r’
%% 每写入换行或插入想要字符
file_1 = fopen('text_w.txt','w');
%\r车符 \n换行符 必须车换行连用
fprintf(file_1,'%d\r\n',[32;34]);
%每写入数字加空格,列按列输
temp = randint(4,2);
fprintf(file_1,'%d ',temp); -
Matlab GUI基础
各种设置对话框
文件打开对话框(uigetfile)
文件保存对话框 (uiputfile)
[FileName,PathName] = uigetfile(FilterSpec,’DialogTitle’,’DefaultName’)
[FileName,PathName] = uigetfile(‘.m’,’选择m文件’,’li1.m’,’MultiSelect’,’on’);
(‘MultiSelect’,on/off设置是否可以多选)
(返回文件类型索引值,若为.jpg,第二个,则索引值为2)
[FileName,PathName,FilterIndex] =uigetfile({‘.bmp’;’.jpg’,’.gif’},’选择图片’))颜色设置对话框(uisetcolor)
C =uisecolor([0 0 1],’所选默认颜色’)
字体设置对话框(uisetfont)
A = uisefont(h,’DialogTitle’) 给h设置字体
A = uisefont(S,’DialogTitle’) A是一个结构数组 S是默认字体的结构数组进度条
更新进度:waitbar(x,h,’输入提示语句’)
弄出取消按钮:waitbar(x,h,’输入提示语句’,’CreateCancelBtn’,’点击后执行的语句’)
普通对话框Dialog
uicontrol('Style','text’)
不加text默认为按钮
单位:像素pixar
若无子对象,单击窗口使其关闭。选择对话框
错误对话框Errordlg
Findall可找多层包括隐藏
Findobj只找一层
Find常用Tag Type
找图时候直接find type image
插入图要用32x32像素
警告对话框Warndlg
帮助对话框Helpdlg
提问对话框Questdlg
练习
进度条修饰
更改警告图形