shirunqi

恩哥见字如面


  • 首页

  • 关于

  • 归档

  • 标签

控制理论基本知识点

发表于 2019-05-06
字数统计 211 | 阅读时长 1

控制理论基本知识点

  • 截止频率(剪切频率):幅频特性曲线与0dB线(即横轴ω)的交点;

  • 相角穿越频率:相频特性曲线与-180°线的交点;

  • 幅值裕度h:相角穿越频率对应的幅频与0dB的差值,即为幅值裕度的分贝数,位于0dB线下方为正(0-某幅值);

  • 相位裕度γ(相角裕度):剪切频率(截止频率)对应的相角与-180°线的相移量即为相位裕度(剪切频率对应相角+180)。

  • 带宽:带宽是在闭环频率特性上定义的,它表示了一个系统跟踪输入正弦信号的最大频率。按一般定义,输出衰减到0.707的频率称为系统的带宽。

今夜偏知春气暖,虫声新透绿窗纱。

Newton_Iteration

发表于 2019-03-30
字数统计 368 | 阅读时长 1

Newton Iteration

程序链接:https://github.com/shirunqi/Newton_Iteration

1.程序里给出的算例是求解方程的根,因此f(x)的形式是已知的,因此可以求微分。但是实际情况往往是无法得到f(x)的解析式,只能求取f(x)的值,所以这里用求差分代替求微分,牛顿迭代式则可以写为:


2.最初是想写一个通用的牛顿迭代函数,希望将要迭代求解的方程作为函数的输入,不过将函数作为参数传递不像我想的那么简单。。。
一开始写了一种以普通函数作为参数传递的牛顿迭代函数,但是真正用的时候带求解的方程是另一个类里的成员函数,这就需要写一种以成员函数作为参数传递的牛顿迭代函数。必须说明的是,目前我写的这个通用性受限,需要在我写好的方程类里写方程,将来可以将该牛顿迭代函数声明为模板函数。

一个插曲:之前用Macdown输入公式的时候也知道可以以LaTeX形式输入,但就是搞不出来,看自带的帮助例子也没搞懂,今天偶然发现就是没有进行设置!!!

  • 设置方法:

Preferences→Rendering→勾选"TeX-like math syntax"以及"Use dollar sign($) as inline delimiter"

曾经沧海难为水,除却巫山不是云。

MATLAB机器人工具箱安装方法

发表于 2019-03-29
字数统计 103 | 阅读时长 1

MATLAB机器人工具箱安装方法

  • 1.将机器人工具箱文件夹(名称为:rvctools)放在MATLAB安装目录下的toolbox文件夹下

  • 2.在MATLAB里添加rcvtools的路径

    1
    2
    具体步骤:
    HOME→Set Path→Add with Subfolders...→选择rvctools文件夹→Save→Close

  • 3.运行rvctools文件夹下的startup_rvc.m文件

rvctools下载链接:https://github.com/shirunqi/robotic-toolbox-for-matlab

垆边人似月,皓腕凝霜雪。

关于使用MATLAB处理数据的三个问题

发表于 2019-03-24
字数统计 505 | 阅读时长 2

关于使用MATLAB处理数据的三个问题

1. 批量保存和载入多个文件

仿真时,通常会通过改变某一自变量的值来研究该自变量对因变量的影响规律。在这种情况下,保存数据时可以保存成有规律的名字,以便将来使用。

按规律保存数据的方法:

假设计算结果此时存在矩阵B中,即

B = [1 2 3;4 5 6;7 8 9];

此时想要将矩阵B的每一行分别存在文件“i-data.dat”(后缀名可以更改)中,实现方法:

1
2
3
4
5
for i = 1 : 1 : 3
chr = [num2str(i), '-data.dat'];
b = B(i,:);
save(chr,'b');
end
  • 注意:实际使用时矩阵B是不必出现的。

    这种方法可以实现对数据的动态批量保存。

2. 归一化处理

处理数据时会遇到需要将一组数据映射到某一区间的情况。比如需要归一化处理。事实上,“归一化”的定义很多,一种定义如下:

归一化:把数据变成(0,1)或者(-1,1)之间的数。

给出将向量x映射到任意区间[ymin,ymax]的方法:

1
2
3
4
5
6
7
8
9
10
11
12
function y = normalization(x,ymin,ymax)
% NORMALIZATION 将数据x映射到任意区间[ymin,ymax]范围的方法
% 输入参数x:需要被映射的数据
% 输入参数ymin:映射区间[ymin,ymax]的下限
% 输入参数ymax:映射区间[ymin,ymax]的上限
% 输出参数y:映射后的数据

xmax = max(x); % 计算最大值
xmin = min(x); % 计算最小值

y = (ymax - ymin) * (x - xmin) / (xmax - xmin) + ymin;
end

3. 获得一个数的量级

获得某个数的量级的方法:

1
n = fix(log10(abs(a)));

其中,abs():保证数值为正,取对数时自变量大于0;
log10():取常用对数是获取数值量级的核心;
fix():向零方向取整,得到正确的量级

闭门即是深山,读书随处净土。

MATLAB将向量强行转为行向量或者列向量

发表于 2019-03-19
字数统计 123 | 阅读时长 1

MATLAB将向量强行转为行向量或者列向量

有时我们计算出的向量不知道是行向量还是列向量,但是下一步应用该向量计算时往往需求是固定的(比如就要求是行向量),这时我们需要对计算结果进行一个“强制转换”,方法如下:

a = a(:);  % 强制转为列向量

b = b(:)'; % 强制转为行向量

人生到处知何似?应似飞鸿踏雪泥。

MATLAB-包括当前路径下所有的文件和子文件夹路径方法

发表于 2019-03-19
字数统计 269 | 阅读时长 1

为了模块化m文件,需要将多个m文件分别放到不同的文件夹下,但是使用时需要同时使用各路径下的m文件,一种解决办法是将主函数写在根目录(这里所谓的根目录指不同文件夹共同所在的目录),之后使用语句

addpath(genpath(pwd));

即可将前路径下所有的文件和子文件夹路径全部包含。

  • 一个使用场景

    需要载入下级文件夹中的数据文件,这是只需使用load命令载入即可,不需要再考虑路径的因素。
    ps:若不使用上面的命令,那么load需要指明文件路径
    > 示例:
                         data = load('./DATA./data.dat');
    

意外收获

很久不更新博客,发现之前存储在七牛云上的图片链接失效了。网上查到了新方法:使用一个叫做iPic的软件,非常方便地生成图片外链,强烈推荐,特别好用!

江流宛转绕芳甸,月照花林皆似霰。

pwm分别控制电机和舵机

发表于 2018-07-13
字数统计 568 | 阅读时长 2

使用PWM实现对电机和舵机的控制

脉冲宽度调制(PWM),即“Pulse Width Modulation”,简称脉宽调制。它是利用微处理器的数字输出对模拟电路进行控制的一种非常有效的技术。简单来说,就是对脉冲宽度的控制。

  • 使用STM32产生PWM信号。STM32F103共有8个定时器,分为高级、通用和基本定时器三类,其中:

    高级定时器:TIM1、TIM8;
    通用定时器:TIM2~TIM5;
    基本定时器:TIM6、TIM7.
    
  • STM32的定时器除了基本定时器,其他的定时器都可以用来产生PWM输出。

  • 通用定时器的时钟来自于APB1,高级定时器的时钟来自于APB2.

  • 重要参数:

    arr:计数器自动重装值
    
    psc:时钟预分频数
    

这是PWM控制的相关程序里最重要两个参数,这两个值决定了PWM信号的周期。控制电机和舵机,实质上是调节PWM信号的占空比,占空比按我的理解就是高电平在一个周期之内所占的比率,即正脉冲的持续时间与脉冲总周期的比值。这也是脉冲宽度调制的精髓所在。arr与占空比有关。

PWM控制电机

  • 控制航模电机,PWM频率设置为50Hz,即周期为20ms,那么理论上1ms对应油门0,2ms对应油门100%,也就是占空比为5%~10%。但是在实际测试时,发现油门0要比1ms稍大一些,需在实际测试时才能准确获知。

  • PWM信号实际上是通过从搭载微处理器的开发板上相应的引脚输出的,引脚与电调相连,由电调控制电机。

PWM控制舵机

  • 控制舵机,PWM信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms~2ms之间,但是事实上脉宽在0.5ms~2.5ms之前,也就是占空比为2.5%~12.5%,脉宽和舵机的转角0度到180度对应,呈线性变化。

  • 舵机一般有三根线,棕色为地,红色为电源正,橙色为信号线。舵机直接连接开发板的相应针脚。


期待喜欢四旋翼的朋友与我交流相关知识!

用vector表示二维数组

发表于 2018-07-11
字数统计 76 | 阅读时长 1

用vector表示二维数组

// 使用vector创建一个n×m的二维数组
vector<vector<int>> array(n) // 定义一个二维数组,行数为n
for(int i = 0; i < n; i++)
{
    array[i].resize(m); // 列数为m
}

说明

  • array.size()表示二维数组的行
  • array[0].size()表示二维数组的列

K-均值聚类

发表于 2018-05-22
字数统计 141 | 阅读时长 1

K-均值聚类(K-means)

K 指可以分为K个簇;means 指簇中心采用所含值的均值来计算。

算法伪代码:

创建K个点作为起始质心(随机选择):
   当任意一个点的簇分配结果发生改变时:
      对数据集中的每个数据点:
          对每个质心:
             计算质心与数据点之间的距离      
          将数据点分配到距其最近的簇
      对每一个簇:
         求出均值更新质心

程序实现

  • K—means C++版

    下载地址:https://github.com/shirunqi/code_pratice

Xcode编写C++无法正确读取txt文件数据的解决办法

发表于 2018-03-23
字数统计 551 | 阅读时长 2

Mac使用Xcode编写C++无法从当前目录下的txt文件读取数据的解决办法

VS下读取txt文件中数据的一般方法

在VS下编写C++,若要从txt文件读取数据,只需将该txt放入相应.cpp文件所在文件夹,读取数据时,按照如下格式框架进行读取:

ifstream input(“***.txt”);
input >> 变量;
input.close();

注意:需包含头文件<fstream>

上述方法在Xcode运用时出现问题,无法读取到txt中的数据。下面给出三种解决办法

使用txt文件所在位置的绝对路径

获得该txt文件绝对路径的方法:选中该txt文件,使用快捷键“command + i”,打开“显示简介”,找到“通用 -> 位置”,复制位置信息,粘贴到“ifstream input(“***.txt”)”的“***.txt”之前,不用担心路径中有中文,粘贴到程序中自然会变成英文,当然前提是路径中不能出现我们自己建立的中文文件夹。

注意:要找到“显示简介”,还可以选中txt文件,右键,或者在屏幕顶部菜单栏的“文件”中找到“显示简介”。按照该方式,这个txt文件可以放到任意位置。

将该txt文件放入本程序对应的可执行文件所在的文件夹

如图所示:

点击“Product”下的执行文件,图中为“Read_Data”,打开后,在屏幕左侧“Identity and Type”栏中,找到“Full Path”,复制该路径,之后鼠标单击桌面或者打开一个“Finder”窗口,按下快捷键“command + shift + g”,弹出“前往文件夹”的地址栏,粘贴该地址,即可打开目标文件夹,将txt文件放入即可。

在Xcode中进行相关设置

在Xcode应用程序下,找到屏幕顶部菜单栏,依次选择“Product -> Scheme -> Edit Scheme”,打开一个窗口。
该窗口主要分为左右两部分,左边选择“Run”,右边选择“Options”,之后找到“Working Dictionary”,勾选“Use custom working directory”,并找到txt文件所在路径,最后关闭该窗口即可。

以上提到的三种方法是我都验证做通的,如有问题欢迎与我交流。

12
SRQ

SRQ

15 日志
10 标签
RSS
GitHub Twitter 微博 YouTube StackOverflow
© 2019 SRQ
由 Hexo 强力驱动
主题 - NexT.Mist
博客全站共3.6k字