未归类

前言

零零碎碎平常学习或偶尔了解到的一点小的知识点,收录其中。

欧拉角

欧拉角来描述刚体在三维欧几里德空间的姿态。对于任何参考系,一个刚体的姿态,在使用欧拉角的描述下可用三个基本旋转矩阵来决定。可用两个坐标系来解释,其中不动的坐标系作为参考,另外一个坐标系固定于刚体,随着刚体的旋转而旋转,就像下面所展示的那样

参考下图,设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交点线,用英文字母(N)代表。

zxz顺规的欧拉角可以静态地这样定义: 是x-轴与交点线的夹角, 是z-轴与Z-轴的夹角, 是交点线与X-轴的夹角。

很可惜地,对于夹角的顺序和标记,夹角的两个轴的指定,并没有任何常规。科学家对此从未达成共识。每当用到欧拉角时,我们必须明确的表示出夹角的顺序,指定其参考轴。 实际上,有许多方法可以设定两个坐标系的相对取向。欧拉角(共有12组组合)方法只是其中的一种。此外,不同的作者会用不同组合的欧拉角来描述,或用不同的名字表示同样的欧拉角。因此,使用欧拉角前,必须先做好明确的定义。

在RTB上默认采用的是横滚一俯仰一偏航角这种情况,其旋转矩阵为(需要注意的是rpy定义有多种,比如zyx,xyz等等)

这样很容易找到机器人运动学正解的角度与姿态之间的对应关系

驱动器

大多数实验室和工业机器人是用电机驱动的。电机可以通过电流或电压控制,这里考虑电流控制的情况。假设电机驱动器或放大器提供的电流为

它与所施加的控制电压是线性相关的,其中 是放大器的跨导,单位为 A/V。由电机产生的转矩与电流成正比

其中, 是电机的扭矩常数,不同的书籍会用不同的符号去表示,自己见的比较多的是用符号 去表示,单位为Nm/A。电机动力模型由下式描述:

其中, 是电机的总惯量,B 是黏性摩擦系数, 是库仑摩擦力矩。

香农采样定理

香农采样定理:设 是一个有限带宽的信号,其上限频率为 , 为采样频率, 当 时,经采样得到的信号 f’(t)能够不失真地恢复原信号。在满足, 条件时,连续信号f(t)可以由采样值 唯一确定,其插值公式为

matlab中butter函数是butterworth滤波器,调用句式为

[b,a] = butter(n,\omega_n)

其中n为滤波器的阶数,n=6就代表6阶butterworth滤波器。 代表截止频率,即信号幅值将为原来的0.707时所对应的频率,对应bode图中幅值为-3dB所对应的频率;n和 的选取是根据你自己的需求来确定的。假如说你想得到 的信号,那么就可以设计滤波器的截止频率
为采样频率

Fs=125;%采样频率
wb=40;%截止频率
Wn = (2*wb)/Fs;
% to normalized frequency: 0.4*pi rad/sample
[B,A] = butter(5,Wn,'low');
filter_y = filtfilt(B,A,y);%滤波

docker 安装 ubuntu

先在docker 输入如下指令

docker pull ubuntu

安装好后,通过指令

docker run -t -i ubuntu:latest //bin/bash

即可在Windows/powershell下愉快的玩耍了。关于docker有很多知识是可以学习的,正因为如此,打算另写一份笔记。

信号带宽

一个信号所包含谐波的最高频率与最低频率之差,即该信号所拥有的频率范围,定义为该信号的带宽。 譬如,一个由数个正弦波叠加成的方波信号,其最低频率分量是其基频,假定为f=2kHz,其最高频率分量是其7次谐波频率,即7f =7×2=14kHz,因此该信号带宽为7f - f =14-2=12kHz。信道带宽则限定了允许通过该信道的信号下限频率和上限频率,也就是限定了一个频率通带。比如一个信道允许的通带为1.5kHz至15kHz,其带宽为13.5kHz,上面这个方波信号的所有频率成分当然能从该信道通过,如果不考虑衰减、时延以及噪声等因素,通过此信道的该信号会毫不失真。然而,如果一个基频为1kHz的方波,通过该信道肯定失真会很严重;方波信号若基频为2kHz,但最高谐波频率为18kHz,带宽超出了信道带宽,其高次谐波会被信道滤除,通过该信道接收到的方波没有发送的质量好;那么,如果方波信号基频为500Hz,最高频率分量是11次谐波的频率为5.5kHz,其带宽只需要5kHz,远小于信道带宽,是否就能很好地通过该信道呢?其实,该信号在信道上传输时,基频被滤掉了,仅各次谐波能够通过,信号波形一定是不堪入目的。

3dB带宽:3dB带宽通常指功率谱密度的最高点下降到1/2时界定的频率范围。

频率

频率(英语:Frequency),又称周波数。是单位时间内某事件重复发生的次数,在物理学中通常以符号f或 表示。采用国际单位制,其单位为赫兹(英语:Hertz,简写为Hz)。设\时间内某事件重复发生n次,则此事件发生的频率为赫兹。又因为周期定义为重复事件发生的最小时间间隔,故频率也可以表示为周期的倒数:

对于震荡和波动,角频率 定义为正弦波相位的变率。角频率的单位为弧度每秒。角频率与频率(循环次数每秒)的关系为

绘制功率谱图

在MATLAB中有信号分析工具箱可以直接绘制,若使用python,直接调用 matplotlib.pyplot.psd 即可,如果想返回实际值,可用

pxx,fre = plt.psd(yourData,NFFT=200, Fs = 1000,opts)

这里yourData是自己采样的数据,nfft表示长度段(Welch’s average periodogram method),Fs是采样周期,看了很多博客在写PSD的时候,Fs好像并没有包含在内,也没有时间去验证他们写的是不是对的,不过可以直接用Python绘制出PSD图,就没有那个心思去验证了。可以参考官方网站去设置一些选项或者是将一些分析整合在自己的代码当中。

陷波器参数

有的驱动器是用陷波器的中心频率和带宽来进行陷波的,有的则是使用陷波Q值、宽度、深度来表示,这里对后面所提及的概念进行说明。陷波Q值、宽度、深度的关系如下:

陷波滤波器Q值 = 陷波中心频率 / 陷波宽度。

陷波滤波器的宽度指的是当陷波深度为0,陷波中心频率两边功率谱下降3dB所对应的两个频率差值(品质因数越大,滤波频带越窄)。

陷波滤波器的深度,表示输入与输出的比值。

Excel/word 中对号代码

这种方法在很多地方可以适用,也就是按住Alt键,再输入对号√对应的字母,这个对号√符号就出来了,对号√对应的字母数字是41420。

知识点

1, 一般的,阻抗控制是直接控制力(电流)的方式;导纳控制是通过控制位置来控制力;

2, 瞬态响应主要取决于其极点分布。

windows 命令行对启动盘进行合并

diskpart
list diskpart #记住U盘数字编号
select disk #是上面记住的数字
clean
create partition primary
select partition 1
active
format quick fs=fat32
assign
exit

windows局域网文件共享的使用

主要在工作之中使用到的比较多,采用共享文件的形式,即可读取另一台电脑里的文件,方便进行一些操作与整理。首先在需要共享的文件夹上右击选择“共享”

点击高级共享

然后点击权限

由于共享的文件一般不是虚拟机就是自己的另一台主机,所以都选上,方便自己整理和操作。快捷键win+R,输入:cmd, 然后输入:ipconfig,即可获取本机的局域网的网段。再另一台电脑上,输入如

\\172.19.100.15

然后输入账号密码即可共享此文件。

Typora中公式无法正常显示

可用通过 偏好设置 中的 Markdown将其扩展语法全部打开即可

谷歌浏览器截取长屏幕(全屏截图)

1、打开目标网站

2、按下键盘上 “F12” 或者 “Ctrl + Shift + L” 打开调试页面

3、按下键盘上 “Ctrl+Shift+P”

4、键入内容“ Capture full size screenshot ” 后,按下回车

5、此时会下载图片

6、打开文件

7、可以看到截图的结果

取名神器

在写程序的时候,变量名的命名是非常重要的一环,要不是英语水平不过关,要不就是词不达意,可以考虑一下 CODEIF 这个在线网页

conda创建python虚拟环境

1)查看安装了哪些包

conda list

2)查看当前存在哪些虚拟环境

conda env list 
conda info -e

检查更新当前conda

conda update conda

关闭显示更多选项

步骤一

• 同时按 Win+R,输入 regedit 打开注册表编辑器

步骤二

• 切换到注册表路径: HKEY_CURRENT_USER\Software\Classes\CLSID

步骤三

1, 在 CLSID 上弹出右键菜单,选择 新建 > 项(New > Key),将新增键命名为:{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}
2, 同上操作,给 {86ca1aa0-34aa-4e8b-a509-50c905bae2a2} 添加子健 InprocServer32
3, 将 InprocServer32 的默认值设置为空白即可

GitHub shell使用不需要验证身份(macOs 操作)

brew install gh
gh auth login

会在shell中弹出对话框,选择 Github.com, 选择HTTPS, 这里需要声明一下,如果没有配置Git的通信协议的话,按照如下方式配置

git config --global http.version HTTP/1.1

然后在对话框中选择YES,再选择Login with a web browser, 会在浏览器里弹出来一个界面, 绑定后以后就不需要输入密码了,之前需要通过token去做关联,每次都要去搜一遍咋操作的。。。。

大文件分割

起初是由于利用python自动生成的sh指令太大了,搜索了一番后发现shell文件最多支持13W字符数,导致提取数据不全,搜了下将大的shell给按行分割成小的文件,然后再批量执行即可,下面直接给出从CSDN中搜索出来的答案,

split -l 500000 -d --verbose sourcelist.xlsx  target

简单的做个测试,在shell里面输入如下指令

printf "%s\n" {1..10} > test.txt | cat

这样可以得到test.txt文件,其中文件内容就是10行数字了, 通过上述操作后,把test.txt分割为十个文件,如下所示(Mac 里面不支持—verbose参数,git bash 里面是可以的)

输入如下指令就可以生成这10个txt文件了(git bash里面应该是可以的,我没有去尝试)

find ./ -name 'test0*' -printf %f\\n|awk -F'.' '{print $1}'|xargs -i{} mv {} {}.txt

但是这种指令对于用的不熟悉的人而言,还是记不住的, 等啥时候有时间再给出比较简单的解决方式了

当问了chatGPT这个问题的时候,它给出了我一个忘不掉的指令,即简洁,又容易理解(百度,CSDN等垃圾再见吧), 答案如下,可根据自己的需求随便改动代码
for file in *old*; do mv "$file" "${file/old/new}"; done

上述命令中,*old* 表示匹配包含 old 的所有文件名。${file/old/new} 表示将 old 替换为 new,${file} 表示当前文件名。"$file""${file/old/new}" 用双引号引起来,是为了避免文件名中包含空格等特殊字符时出现问题。如果要在文件名的开头或结尾添加前缀或后缀,可以使用以下命令:

for file in *; do mv "$file" "prefix$file"; done   # 添加前缀
for file in *; do mv "$file" "${file%suffix}new"; done # 替换后缀

Connection refused

解决Failed to connect to raw.githubusercontent.com port 443: Connection refused

使用vim /etc/hosts命令打开不能访问的机器的hosts文件,添加如下内容:(如果不能修改这个文件的情况下,采用sudu -i进入管理员模式对这个文件进行修改即可)

199.232.68.133 raw.githubusercontent.com
199.232.68.133 user-images.githubusercontent.com
199.232.68.133 avatars2.githubusercontent.com
199.232.68.133 avatars1.githubusercontent.com

MAC 中安装ROS

1, 安装Homebrew:打开终端,输入以下命令安装Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

2, 安装ROS:在终端中输入以下命令来安装ROS:

brew install ros

3, 设置ROS环境变量:ROS依赖于环境变量来找到它的程序和库文件。在终端中输入以下命令来设置ROS环境变量:

echo "source /opt/homebrew/opt/ros/setup.bash" >> ~/.bash_profile

vim修改权限: E45: 已设定选项 ‘readonly’ (请加 ! 强制执行)

输入 w !sudo tee % 后,在输入q退出,在打开文件时,文件已经被修改

顺带搜了一个比较实用的技巧, 即

Vim插入模式下,按 <Ctrl-r>% 可将当前文件名输入到文件中

MAC 网络故障 ping: can not resolve 的问题

这个是莫名其妙发生的, 就是突然之间,网络就用不了了, 且网上给的教程都太老了,想重置MAC网络一些选项根本就没有!可以通过如下方式来解决这一问题

1, 首先关闭WI-FI

2, cd /Library/Preferences/SystemConfiguration

3, 删除相关文件, 使用管理员权限

sudo rm com.apple.airport.preferences.plist
sudo rm com.apple.wifi.message-tracer.plist
sudo rm com.apple.network.eapolclient.configuration.plist
sudo rm NetworkInterfaces.plist

4, 重启就可以了

MAC/Parallels Desktop Windows 11 卡死在开机界面问题

还以为需要重新安装一次, 吓死了。。。。配置了那么久的Windows11。。。。这个问题其实是由于Windows软件还没关闭, 但是占用了比较多的CPU,然后直接将虚拟机关闭导致的(个人猜测), 这个问题解决起来比较简单, 但是却很重要, 找到MAC的Activity Monitor, 活动监视器, 类似于win上的任务管理器, 把Windows11给关闭掉,然后再打开就行了。

AWK 相关使用

AWK是一种文本处理工具,它可以帮助您从文本文件中提取和操作数据。下面是一些常见的AWK命令和示例:

1, 打印文件的某一列

awk '{print $1}' file.txt

这个命令会打印文件file.txt的第一列。

2, 计算文件的行数

awk 'END{print NR}' file.txt

这个命令会计算文件file.txt的行数。

3, 查找匹配的行

awk '/pattern/ {print}' file.txt

这个命令会打印文件file.txt中包含“pattern”的行。

4, 计算文件的平均值

awk '{sum+=$1} END {print sum/NR}' file.txt

这个命令会计算文件file.txt的第一列的平均值。

5, 在文件中搜索并替换

awk '{gsub(/oldtext/, "newtext"); print}' file.txt

这个命令会在文件file.txt中查找所有的“oldtext”并替换为“newtext”。

6, 过滤掉某些行

awk '!/pattern/' file.txt

这个命令会过滤掉文件file.txt中包含“pattern”的行。

7, 打印文件中最长的行

awk '{ if (length($0) > max) {max = length($0); longestLine = $0}} END {print longestLine}' file.txt

这个命令会打印文件file.txt中最长的一行。

8, 按列排序

awk '{print $2, $1}' file.txt | sort

这个命令会按文件file.txt的第二列进行排序,并打印第一列和第二列。

SED 的使用

sed 是一种流编辑器,用于从文本流中读取数据,对数据进行编辑和转换,然后将编辑后的结果输出到标准输出或文件中。sed 在命令行中使用,可以对文件或文本进行编辑操作。

以下是 sed 命令的语法:

arduinoCopy code
sed [选项] '动作' 文件名

其中,选项 用于指定不同的操作方式,常用的选项包括:

-n:仅显示处理过的行
-i:直接修改文件内容

动作sed 命令的核心部分,用于指定要执行的操作,常用的操作包括:

s/old/new/g:替换指定字符串,其中 old 为要替换的字符串,new 为替换后的字符串,g 表示全局替换。
p:打印当前行
d:删除当前行
a:在当前行后添加一行文本
i:在当前行前插入一行文本

以下是一些常见的 sed 命令示例:

1, 将文件中的所有 foo 替换为 bar 并输出到标准输出:

sed 's/foo/bar/g' file.txt

2, 删除文件中所有包含 foo 的行:

sed '/foo/d' file.txt

3, 在文件的第 5 行后面添加一行文本 Hello World 并将结果写入新文件 newfile.txt

sed '5a\
Hello World' file.txt > newfile.txt

4, 在文件的第 5 行前面插入一行文本 Hello World 并将结果写入新文件 newfile.txt

sed '5i\
Hello World' file.txt > newfile.txt

以上是 sed 命令的一些常见用法示例,更多的用法可以通过查看 sed 的官方文档来了解。

VIM 对于Python3第三方库的自动补全

ycm实际是用的jedi的模块和功能来补全python,因此参考https://vi.stackexchange.com/questions/2403/vim-code-completion-for-python-3的意见,直接下载jedi并安装。

git clone --recursive https://github.com/davidhalter/jedi-vim.git ~/.vim/bundle/jedi-vim

然后在~/.vimrc中添加:

"为了Python3的第三方库安装Jedi插件
Plugin 'davidhalter/jedi-vim' " 注意, 这个是需要放在Vundle下面的
"===============================Jedi==================================
if has('python3')
let g:loaded_youcompleteme = 1 " 判断如果是python3的话,就禁用ycmd。
let g:jedi#force_py_version = 3
let g:pymode_python = 'python3'
endif
"===============================Jedi===================================

如果报错的话,就安装一下jedi

pip3 install jedi

补全效果可以参考如下所示, 用起来感觉还行(MACOS系统)

FRF 频率响应函数

FRF(Frequency Response Function)是一种用于描述系统对输入信号频率变化的响应特性的数学工具。它在信号处理、控制系统、结构动力学等领域中被广泛应用。

FRF可以用于分析线性系统,它描述了系统在不同频率下输入信号和输出响应之间的关系。通常,输入信号是一个单一频率的正弦波或复杂信号,而输出响应是系统对该输入信号的相应输出。FRF表示了在给定频率下,输出信号的幅度和相位与输入信号的幅度和相位之间的关系。

FRF通常表示为复数形式,包含两个部分:幅度响应和相位响应。幅度响应表示输出信号的幅度相对于输入信号的幅度的增益或衰减情况,而相位响应表示输出信号的相位相对于输入信号的相位的偏移。

FRF可以通过实验测量或数学模型来获取。在实验中,通过将系统激励于不同频率的输入信号,并测量输出信号的幅度和相位,可以得到系统的频率响应曲线。在数学建模中,可以使用系统的微分方程或传递函数来计算频率响应。

FRF在许多应用中都具有重要的作用。例如,在信号处理中,可以使用FRF来分析音频设备的频率响应,以优化音频信号的质量。在控制系统中,FRF可以用于设计和调整控制器,以使系统对不同频率的输入信号具有期望的响应。在结构动力学中,FRF可以用于分析结构物的振动特性,并评估其对外界激励信号的响应。

总之,FRF是一种描述系统对输入信号频率变化的响应特性的数学工具,它在各个领域中都具有广泛的应用。通过分析FRF,可以更好地理解和控制系统的频率行为。

未来有时间专门写一篇来介绍这部分;

报错解决:AttributeError: module ‘lib’ has no attribute ‘OpenSSL_add_all_algorithms’

在shell中输入如下指令可解决这一问题

pip install cryptography==38.0.4

提示某程序已损坏

对于苹果电脑所需的设置

sudo xattr -r -d com.apple.quarantine + 空格 + 在应用中程序找到APP拖入终端即可;

ifconfig

在Linux中,使用ifconfig命令确认本机IP。如果在终端窗口中运行ifconfig命令,则会在wp2s0的inet addr中显示其有线网络IP地址,而在enp3s0的inet addr中显示本机的无线网IP地址。

tensorflow install (MacOs)

# There is currently no official GPU support for MacOS.
python3 -m pip install tensorflow
# Verify the installation:
python3 -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

mac 终端多个标签切换

如果在同一个终端窗口中打开了多个标签页,可以使用 Command (⌘) + Shift + ] 切换到下一个标签页,或使用 Command (⌘) + Shift + [ 切换到上一个标签页。

<<<<<<< HEAD:source/_posts/doNothingButConnect.md

unique_ptr独占型智能指针

unique_ptr是C++11标准库中的一种智能指针,它提供了一种独占所有权的方式,即一个unique_ptr对象只能拥有一个指针,并且当unique_ptr对象被销毁时,它所拥有的指针也会被自动释放。

unique_ptr对象始终是关联的原始指针的唯一所有者,实现了独享所有权的语义。一个非空的unique_ptr总是拥有它所指向的资源。转移一个unique_ptr将会把所有权也从源指针转移给目标指针(源指针被置空)。拷贝一个unique_ptr将不被允许,因为如果你拷贝一个unique_ptr,那么拷贝结束后,这两个unique_ptr都会指向相同的资源,它们都认为自己拥有这块资源(所以都会企图释放)。因此unique_ptr是一个仅能移动的类型。当指针析构时,它所拥有的资源也被销毁。默认情况下,资源的析构是伴随着调用unique_ptr内部的原始指针的delete操作的。

初始化方式

unique_ptr有如下几种初始化方式:

1) 裸指针直接初始化,但不能通过隐式转换来构造,因为unique_ptr构造函数被声明为explicit;

2) 允许移动构造,但不允许拷贝构造,因为unique_ptr是个只移动类型;

3) 通过make_unique构造,但这是C++14才支持的语法。需要注意的是:make_unique不支持添加删除器,或者初始化列表。

例如:

#include <iostream>
#include <memory>

class Frame {};

int main()
{
std::unique_ptr<Frame> f(new Frame()); // 裸指针直接初始化
std::unique_ptr<Frame> f1 = new Frame(); // Error,explicit禁止隐式初始化
std::unique_ptr<Frame> f2(f); // Error,禁止拷贝构造函数
std::unique_ptr<Frame> f3 = f; // Error,禁止拷贝构造函数
f1 = f; // Error,禁止copy赋值运算符重载

std::unique_ptr<Frame> f4(std::move(new Frame())); // 移动构造函数
std::unique_ptr<Frame> f5 = std::move(new Frame()); // Error,explicit禁止隐式初始化
std::unique_ptr<Frame> f6(std::move(f4)); // 移动构造函数
std::unique_ptr<Frame> f7 = std::move(f6); // move赋值运算符重载

std::unique_ptr<Frame[]> f8(new Frame[10]()); // 指向数组

auto f9 = std::make_unique<Frame>(); // std::make_unique来创建,C++14后支持

return 0;
}

使用场景

工厂函数

作为工厂函数的返回类型:

1) 工厂函数负责在堆上创建对象,但是调用工厂函数的用户才会真正去使用这个对象,并且要负责这个对象生命周期的管理。所以使用unique_ptr是最好的选择。这正好是std::unique_ptr擅长的地方,因为调用者获得了工厂返回的资源的所有权,当unique_ptr析构时,它会自动销毁所拥有的指针;

2) unique_ptr转为shared_ptr很容易,作为工厂函数本身并不知道用户希望所创建的对象的所有权是专有的还是共享的,返回unique_ptr时调用者可以按照需要做变换。

参考

[1] 机器人中的速度概念 —robinvista

[2] 欧拉角—维基百科

[3] 谷歌浏览器截取长屏幕(全屏截图)

[4] Linux命令之大文件分割

[5] vim 修改文件显示只读问题解决

[6] 【C++】unique_ptr独占型智能指针详解

CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE QoS ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp dB data_struct dots figure gdb git latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议