机械臂协同搬运中的阻抗控制

2023-05-16

文章目录

  • 阻抗模型
  • 物体阻抗
  • 分布阻抗
  • Matlab和RTB仿真
    • 物体阻抗
    • 分布阻抗
  • 源代码

阻抗模型

阻抗控制的目的是将原有物体动力学修正为我们期望动力学。假设有一个弹簧,通过阻抗控制,可以使得它的刚度降低,实际推它时有可能感觉像一个海绵。

阻抗模型期望动力学一般为线性二阶系统
M d ( X ¨ o − X ¨ o d ) + K v ( X ˙ o − X ˙ o d ) + K p ( X o − X o d ) = F e x t , M_d(\ddot X_o-\ddot X_o^d)+K_v(\dot X_o-\dot X_o^d)+K_p(X_o-X_o^d)=F_{ext}, Md(X¨oX¨od)+Kv(X˙oX˙od)+Kp(XoXod)=Fext
其中, F e x t F_{ext} Fext外力(external force),系数 M d M_d Md K v K_v Kv K p K_p Kp针对每个自由度独立指定(对角阵)。

阻抗模型的一般形式
M d X ¨ o = F e x t + F i m p , M_d\ddot X_o=F_{ext}+F_{imp}, MdX¨o=Fext+Fimp
其中, F i m p F_{imp} Fimp虚阻抗力(imaginary impedance force),既可以模拟动力学,也可以模拟力。仅用于模拟动力学时可以取
F i m p = M d X ¨ o d − K v ( X ˙ o − X ˙ o d ) − K p ( X o − X o d ) 。 F_{imp}=M_d\ddot X_o^d-K_v(\dot X_o-\dot X_o^d)-K_p(X_o-X_o^d)。 Fimp=MdX¨odKv(X˙oX˙od)Kp(XoXod)

物体阻抗

由牛顿欧拉公式可得
m o x ¨ o = f e x t + ∑ f c m d i + m o g I o ω ˙ o + ω o × I o ω o = τ e x t + ∑ r i × f c m d i + ∑ τ c m d i \begin{aligned} m_o\ddot x_o&=f_{ext}+\sum f_{cmd}^i+m_og\\ \mathcal I_o\dot \omega_o+\omega_o\times\mathcal I_o\omega_o&=\tau_{ext}+\sum r_i\times f_{cmd}^i+\sum\tau_{cmd}^i \end{aligned} mox¨oIoω˙o+ωo×Ioωo=fext+fcmdi+mog=τext+ri×fcmdi+τcmdi

假设实际物体动力学
M o X ¨ o + C o = F e x t + G F c m d , M_o\ddot X_o+C_o=F_{ext}+G\boldsymbol F_{cmd}, MoX¨o+Co=Fext+GFcmd
其中 M o = [ m o I 3 0 3 0 3 I o ] M_o=\begin{bmatrix}m_oI_3&0_3\\0_3&\mathcal I_o\end{bmatrix} Mo=[moI30303Io] C o = [ − m o g ω o × I o ω o ] C_o=\begin{bmatrix}-m_og\\\omega_o\times\mathcal I_o\omega_o\end{bmatrix} Co=[mogωo×Ioωo]是惯性矩阵和哥氏矩阵, G G G抓持矩阵(grasp matrix),通常为
G = [ I 3 0 I 3 0 ⋯ I 3 0 S ( r 1 ) I 3 S ( r 2 ) I 3 ⋯ S ( r n ) I 3 ] 。 G=\begin{bmatrix} I_3&0&I_3&0&\cdots&I_3&0\\ S(r_1)&I_3&S(r_2)&I_3&\cdots&S(r_n)&I_3 \end{bmatrix}。 G=[I3S(r1)0I3I3S(r2)0I3I3S(rn)0I3]
这里注意三点

  • 上述物体动力学是在基坐标系下定义的,所以牛顿欧拉方程的牛顿部分非常简单
  • 由此而产生的不便之处是, G G G是时变的,因为 r r r在基坐标系下时变(随物体旋转)
  • 可以将上述物体动力学定义在物体坐标系下,这样 G G G是常数矩阵1

期望的物体动力学,即物体阻抗2(object impedance),具有compliant behavior,
M d X ¨ o = F e x t + F i m p 。 M_d\ddot X_o=F_{ext}+F_{imp}。 MdX¨o=Fext+Fimp
联立两式
G F c m d = C o − F e x t + M o M d − 1 ( F e x t + F i m p ) 。 G\boldsymbol F_{cmd} = C_o-F_{ext}+M_oM_d^{-1}(F_{ext}+F_{imp})。 GFcmd=CoFext+MoMd1(Fext+Fimp)
控制力(commanded forces)为
F c m d = G † [ C o − F e x t + M o M d − 1 ( F e x t + F i m p ) ] + F i n t , \boldsymbol F_{cmd}=G^\dagger[C_o-F_{ext}+M_oM_d^{-1}(F_{ext}+F_{imp})]+\boldsymbol F_{int}, Fcmd=G[CoFext+MoMd1(Fext+Fimp)]+Fint
其中 F i n t \boldsymbol F_{int} Fint内力(internal forces),在 G G G零空间(null space)中。

分布阻抗

上节的物体阻抗方法将物体和机械臂考虑为一个整体,在物体层面(object level)进行集中式控制,但是集中式控制有如下弊端。

Such a centralized approach implies that specific pieces of hardware share data in real time from each manipulator force and position sensor. Notice that the structure of the controller depends on the system. This almost prohibits the implementation of regrasp- ing procedures or, more generally, any change in the system topology. Furthermore, when the system is built-up by manipulators with heterogeneous performance, the whole system performance reflects that of the worst one, especially for precision and stability3.

考虑分布式控制,可以在关节层面(joint level)和末端执行器层面(end-effector level)进行控制。末端执行器层面的控制有很多,如Leader-follower approach和Master-slave approach,前者是纯位置控制,后者master进行位置控制,slave进行力控制。

分布阻抗(distributed impedance)是在末端执行器层面的控制。由于多机械臂的冗余性,末端执行器可以通过点接触只控制力 f f f,无需控制力矩 τ \tau τ

假设实际物体动力学
M o X ¨ o + C o = F e x t + G f , M_o\ddot X_o+C_o=F_{ext}+G\boldsymbol f, MoX¨o+Co=Fext+Gf
其中,
G = [ I 3 I 3 ⋯ I 3 S ( r 1 ) S ( r 2 ) ⋯ S ( r n ) ] 。 G=\begin{bmatrix} I_3&I_3&\cdots&I_3\\ S(r_1)&S(r_2)&\cdots&S(r_n) \end{bmatrix}。 G=[I3S(r1)I3S(r2)I3S(rn)]
则实际末端速度为
x ˙ = G T X ˙ o 。 \dot {\boldsymbol x}=G^T\dot X_o。 x˙=GTX˙o

末端期望的力为
f = G † ( M o X ¨ o + C o − F e x t ) + f i n t 。 \boldsymbol f=G^\dagger(M_o\ddot X_o+C_o-F_{ext})+\boldsymbol f_{int}。 f=G(MoX¨o+CoFext)+fint
末端期望阻抗模型为
− f i = M d i x ¨ i + B d i ( x ˙ i − x ˙ d i ) + K d i ( x i − x d i ) , -f_i=M_d^i\ddot x_i+B_d^i(\dot x_i-\dot x_d^i)+K_d^i(x_i-x_d^i), fi=Mdix¨i+Bdi(x˙ix˙di)+Kdi(xixdi)
其中, f i f_i fi是末端输出的力,因此取负号才是受到的力。

定义 e i = x d i − x i e_i=x_d^i-x_i ei=xdixi,上式的拉普拉斯变换为
L f ( s ) = ( B d i s + K d i ) L e ( s ) 。 L_f(s)=(B_d^is+K_d^i)L_e(s)。 Lf(s)=(Bdis+Kdi)Le(s)
当期望力看作常值时,为阶跃响应函数,有

lim ⁡ s → 0 s L e ( s ) = lim ⁡ s → 0 s ( B d i s + K d i ) − 1 ( f i / s ) = lim ⁡ s → 0 ( B d i s + K d i ) − 1 f i = K d i − 1 f i 。 \lim_{s\to 0}sL_e(s)=\lim_{s\to 0}s(B_d^is+K_d^i)^{-1}(f_i/s)=\lim_{s\to 0}(B_d^is+K_d^i)^{-1}f_i=K_d^{i^{-1}}f_i。 s0limsLe(s)=s0lims(Bdis+Kdi)1(fi/s)=s0lim(Bdis+Kdi)1fi=Kdi1fi

期望的稳态末端轨迹与实际接触点轨迹之间的关系为
x d i = x i + K d i − 1 f i 。 x_d^i=x_i+K_d^{i^{-1}}f_i。 xdi=xi+Kdi1fi
机械臂末端速度和加速度有如下关系
q ˙ i = J i − 1 x ˙ i , q ¨ i = J i − 1 x ¨ i − J i − 1 J ˙ i q ˙ i = J i − 1 x ¨ i − J i − 1 J ˙ i J i − 1 x ˙ i , \dot q_i=J_i^{-1}\dot x_i,\quad \ddot q_i=J_i^{-1}\ddot x_i-J_i^{-1}\dot J_i\dot q_i=J_i^{-1}\ddot x_i-J_i^{-1}\dot J_iJ_i^{-1}\dot x_i, q˙i=Ji1x˙iq¨i=Ji1x¨iJi1J˙iq˙i=Ji1x¨iJi1J˙iJi1x˙i
其中 J i − 1 = M i − 1 J i T ( J i M i − 1 J i T ) − 1 J_i^{-1}=M_i^{-1}J_i^T(J_iM_i^{-1}J_i^T)^{-1} Ji1=Mi1JiT(JiMi1JiT)1

将阻抗模型代入机械臂末端动力学
J i − T τ c m d i − f i = M ~ i ( q i ) x ¨ i + C ~ i ( q i , q ˙ i ) x ˙ i + N ~ i ( q i ) , J_i^{-T}\tau_{cmd}^i-f_i=\tilde M_i(q_i)\ddot x_i+\tilde C_i(q_i,\dot q_i)\dot x_i+\tilde N_i(q_i), JiTτcmdifi=M~i(qi)x¨i+C~i(qi,q˙i)x˙i+N~i(qi)
其中, M ~ i = J i − T M i J i − 1 \tilde M_i=J_i^{-T}M_iJ_i^{-1} M~i=JiTMiJi1 C ~ i = J i − T ( C i J i − 1 + M i J i − 1 J ˙ i J i − 1 ) \tilde C_i=J_i^{-T}\left(C_iJ_i^{-1}+M_iJ_i^{-1}\dot J_iJ_i^{-1}\right) C~i=JiT(CiJi1+MiJi1J˙iJi1) N ~ i = J − T N i \tilde N_i=J^{-T}N_i N~i=JTNi

控制力矩为
τ c m d i = J i T [ − M ~ i M d i − 1 ( B d i ( x ˙ i − x ˙ d i ) + K d i ( x i − x d i ) ) + C ~ i x ˙ i + N ~ i + ( I 3 − M ~ i M d i − 1 ) f i ] \tau_{cmd}^i=J_i^T\left[-\tilde M_iM_d^{i^{-1}}(B_d^i(\dot x_i-\dot x_d^i)+K_d^i(x_i-x_d^i))+\tilde C_i\dot x_i+\tilde N_i+(I_3-\tilde M_iM_d^{i^{-1}})f_i\right] τcmdi=JiT[M~iMdi1(Bdi(x˙ix˙di)+Kdi(xixdi))+C~ix˙i+N~i+(I3M~iMdi1)fi]

Matlab和RTB仿真

使用RTB工具箱建模二自由度机械臂,在竖直平面内搬运一个方块。

首先是机械臂建模和方块物体建模,代码示例如下。

%% robot modeling
lx = 1; lr = 0.1; g = [0 -9.81 0]; fvis = 0; fcou = 0; 
rod = Cuboid([lx,lr,lr]);
Irod = rod.inertia;
dpm = {'a', lx, 'm', rod.mass, 'r', [-lx/2,0,0], 'qlim', [-pi/2, pi/2],'I', Irod,...
    'B', fvis, 'Tc', [fcou -fcou]};
rob(1) = SerialLink([Revolute(dpm{:}),Revolute(dpm{:})],'name','r1','gravity',...
    -g,'base',SE3([-1,0,0]/2));
rob(2) = SerialLink([Revolute(dpm{:}),Revolute(dpm{:})],'name','r2','gravity',...
    -g,'base',SE3([1,0,0]/2));
%% object modeling
obj = Cuboid([lx,lx,lr]);

然后定义几何位置关系,代码示例如下。

%% joint positions (x,y)
x0 = [-1,1.5,0;
    0,1.5,0];
for i=1:2
   q(i,:) = rob(i).ikine(SE3(x0(i,:)),'mask',[1,1,0,0,0,0]); 
end
q(1,:) = [sum(q(1,:)),-q(1,2)];
dq = zeros(size(q));
qd = q;
%% object position (x,y,z,r,p,y)
Xo = [sum(x0)/size(x0,1),0,0,0];
dXo = zeros(1,6);
ddXo = dXo;
for i=1:2
   ro(i,:) = x0(i,:)-Xo(1:3);
end
%% object dynamics
Mo = blkdiag(obj.mass*eye(3),obj.inertia);
Co = @(dXo) [-obj.mass*g';skew(dXo(4:6))*obj.inertia*dXo(4:6)'];
r = @(Xo,i) (SO3.rpy(Xo(4:6))*ro(i,:)')';
G = @(Xo) [eye(3),eye(3);
    skew(r(Xo,1)),skew(r(Xo,2))];

物体阻抗

控制力由如下代码给出

%% command force
Fcmd = @(Xo,dXo,Xd) (pinv(G(Xo))*(Co(dXo)+Mo*md^-1*Fimp(Xo,dXo,Xd)')+Fint(Xo)')'; 

仿真结果如下图所示。

物体阻抗

分布阻抗

控制力由如下代码给出

%% command force
Fcmd = @(Xo,dXo,Xd) (pinv(G(Xo))*(Co(dXo)+Mo*ddXo(Xo,dXo,Xd,dXd)')+Fint(Xo)')'; 

控制力矩由如下代码给出

md = 3; kv = 15; kp = 25; F = Fcmd(Xo,dXo,Xd); 
% end-effector trajectory
J = rob(i).jacob0(q(i,:),dq(i,:)); J(3:6,:)=[];
Jdq = rob(i).jacob_dot(q(i,:),dq(i,:)); Jdq(3:6,:)=[];
x(i,:) = rob(i).fkine(q(i,:)).t;
dx(i,:) = J*dq(i,:)';
% desired trajectory
xd(i,:) = Xo(1:3)+(SO3.rpy(Xo(4:6))*ro(i,:)')'+F(3*i-2:3*i)/kp;
dxd = reshape((G(Xo)'*dXo')',[3,2])';
% joint torque
Mq = rob(i).inertia(q(i,:)); 
Cq = rob(i).coriolis(q(i,:),dq(i,:));
Gq = rob(i).gravload(q(i,:))';
Jinv = Mq^-1*J'*(J*Mq^-1*J')^-1;
Mx = Jinv'*Mq*Jinv;
Cx1 = Jinv'*Cq*Jinv;
Cx2 = Jinv'*Mq*Jinv*Jdq;
Gx = Jinv'*Gq;
tau(i,:) = J'*(-Mx*md^-1*(kv*(dx(i,1:2)-dxd(i,1:2))+kp*(x(i,1:2)-xd(i,1:2)))'+...
Cx1*dx(i,1:2)'+Cx2+Gx+(eye(2)-Mx*md^-1)*F(3*i-2:3*i-1)');

仿真结果如下图所示。

分布阻抗

源代码

本文所需全部源代码已上传至我的GitHub,点击这里下载。运行two_link_object.mtwo_link_distributed.m即可。使用前请确认RTB已经正确安装,下载和安装说明点击这里。

如果喜欢,欢迎点赞和fork。


  1. Caccavale, F., Chiacchio, P., Marino, A., & Villani, L. (2008). Six-DOF impedance control of dual-arm cooperative manipulators. IEEE/ASME Transactions on Mechatronics, 13(5), 576–586. https://doi.org/10.1109/TMECH.2008.2002816 ↩︎

  2. Schneider, S. A., & Cannon, R. H. (1992). Object Impedance Control for Cooperative Manipulation: Theory and Experimental Results. IEEE Transactions on Robotics and Automation, 8(3), 383–394. https://doi.org/10.1109/70.143355 ↩︎

  3. Szewczyk, J., Plumet, F., & Bidaud, P. (2002). Planning and controlling cooperating robots through distributed impedance. Journal of Robotic Systems, 19(6), 283–297. https://doi.org/10.1002/rob.10041 ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机械臂协同搬运中的阻抗控制 的相关文章

  • 1.C++简介

    学习目标 xff1a 初识C 43 43 xff0c 介绍C 43 43 一些简单的语法 xff1a 初识C 43 43 数据类型 运算符 程序流程结构 学习内容 xff1a 1 初识C 43 43 一个简单的C 43 43 框架 xff0
  • 死锁形成的原因和四个必要条件

    死锁的概念 死锁是指两个或两个以上的进程 xff08 线程 xff09 在运行过程中因争夺资源而造成的一种僵局 xff0c 若无外力作用 xff0c 这些进程 xff08 线程 xff09 都将无法向前推进 xff0c 这时就形成了死锁 处
  • Android P阻止调用非sdk api后,Atlas该何去何从

    0 背景 自从Android 9 0后 xff0c Android就已经开始着手阻止app开发调用非sdk的api xff0c 也就是被标记为 64 hide的变量 函数 类不可以通过反射调用 xff0c 否则会提示NoSuchMethod
  • 简历应该这么写!

    很多同学刚开始找工作时 xff0c 投出去很多简历 xff0c 但是都石沉大海了 xff0c 没有后文 之所以简历不通过 xff0c 往往都是简历不够 好看 很多大公司HR经常一天要看几百份 xff0c 甚至上千份简历 xff0c 基本都是
  • 希望计算机专业同学都知道这些老师

    C语言教程 翁凯老师 赫斌 翁恺老师是土生土长的浙大码农 xff0c 从本科到博士都毕业于浙大计算机系 xff0c 后来留校教书 xff0c 一教就是20多年 翁恺老师的c语言课程非常好 xff0c 讲解特别有趣 xff0c 很适合初学者学
  • 100个python算法超详细讲解:抓交通肇事犯

    1 xff0e 问题描述 一辆卡车违反交通规则 xff0c 撞人后逃跑 现场有三人目 该事件 xff0c 但都 没有记住车号 xff0c 只记下了车号的一些特征 说 xff1a 牌照的前两位数字是相 同的 xff1b 乙说 xff1a 牌照
  • 100个python算法超详细讲解:百钱百鸡

    1 xff0e 问题描述 中国古代数学家张丘建在他的 算经 中提出了一个著名的 百钱 百鸡问题 xff1a 一只公鸡值五钱 xff0c 一只母鸡值三钱 xff0c 三只小鸡值一钱 xff0c 现 在要用百钱买百鸡 xff0c 请问公鸡 母鸡
  • 100个python算法超详细讲解:水仙花数

    1 xff0e 问题描述 输出所有的 水仙花数 所谓的 水仙花数 是指一个三位数 xff0c 其各位数字的立方 和等于该数本身 xff0c 例如 xff0c 153是 水仙花数 xff0c 因为153 61 1 3 43 1 3 43 3
  • 100个python算法超详细讲解:常胜将军

    100个python算法超详细讲解 64 谷歌学术 1 xff0e 问题描述 有火柴21根 xff0c 两人依次取 xff0c 每次每人只可取走1 xff5e 4根 xff0c 不能多取 xff0c 也不能不取 xff0c 谁取到最后一根火
  • 100个python算法超详细讲解:逆序输出数字

    100个python算法超详细讲解 64 谷哥技术 1 xff0e 问题描述 编程实现将输入的整数逆序输出 2 xff0e 问题分析 前面我们已经接触过很多的递归问题了 xff0c 这些递归问题可以简单 地分成两类 xff1a 一类可以归结
  • 100个python算法超详细讲解:角谷猜想

    1 xff0e 问题描述 角谷猜想在西方常被称为西拉古斯猜想 xff0c 据说这个问题首先是在 美国的西拉古斯大学被研究的 xff0c 而在东方 xff0c 这个问题则由将它带到日 本的日本数学家角谷静夫的名字来命名 xff0c 故被称为角
  • 100个python算法超详细讲解:统计学生成绩

    完整版下载 超详细Python算法案例讲解100例 zip Python文档类资源 CSDN下载 1 xff0e 问题描述 有5个学生 xff0c 每个学生有三门课程的成绩需要统计 要求从键盘输入学生的学号 姓名以及三门课程 的成绩 xff
  • apt update、apt upgrade 和 apt dist-upgrade 的区别

    1 root 64 kali apt update apt update 的作用是从 etc apt sources list文件中定义的源中获取的最新的软件包列表 即运行 apt update 并没有更新软件 xff0c 而是相当 win
  • C++服务器开发100个知识要点C++RAII惯用法

    最初的写法 在笔者刚学习服务器开发的时候 xff0c 公司给笔者安排了一个练习 xff1a 在 Windows 系统上写一个 C 43 43 程序 xff0c 用该程序实现一个简单的服务 xff0c 在客户端连接上来时 xff0c 给客户端
  • 人工智能知识全面讲解: 人脸识别技术

    早在40年前 xff0c 图像识别领域就有很多关于人脸识别的研究 但是在当时 xff0c 传统算法在普通图像识别中已经很难取得良好的识别效果 xff0c 更何况还要从人脸 中提取更加细微的特征 在很长一段时间里 xff0c 人脸识别主要存在
  • Redis入门完整教程:缓存的收益和成本

    图11 1左侧为客户端直接调用存储层的架构 xff0c 右侧为比较典型的缓存层 43 存储层架构 xff0c 下面分析一下缓存加入后带来的收益和成本 收益如下 xff1a 加速读写 xff1a 因为缓存通常都是全内存的 xff08 例如Re
  • Linux命令+shell脚本大全:vim 基础

    免费教程推荐 xff1a python C 43 43 Java JS Rust Go语言入门完全手册 xff08 6合1 xff09 zip Python文档类资源 CSDN下载 vim编辑器在内存缓冲区中处理数据 只要键入 vim 命令
  • Python数据结构+算法全面讲解:Python 基础

    Python 基础 本节将复习 Python 并且为前一节提到的思想提供更详细的例子 如果你刚开始学习 Python 或者觉得自己需要更多的信息 建议你查看本书结尾列出的 Python 资源 本节的目标是帮助你 复习 Python并且强化一
  • Python数据结构+算法全面讲解:定义函数、定义类

    之前的过程抽象例子调用了 Python数学模块中的 sqrt 函数来计算平方根 通常来说 可以 通过定义函数来隐藏任何计算的细节 函数的定义需要一个函数名 一系列参数以及一个函数体 函数也可以显式地返回一个值 例如 下面定义的简单函数会返回

随机推荐

  • 操作系统-进程

    进程是操作系统中资源分配和调度的基本单位 xff0c 而线程是进程的组成部分 xff0c 它代表了一条顺序的执行流 1 进程的出现 目的 xff1a 为了使多个程序能并发执行 xff0c 以提高资源的利用率和系统的吞吐量 2 进程组成 进程
  • ubuntu系统中查看本机cpu和内存信息的命令和用法(分色排版)

    https zhidao baidu com question 192966322 html 写出ubuntu linux系统中查看本机cpu和内存信息的命令和用法 以及如何解读这些命令 ubuntu系统中查看本机cpu和内存信息的命令和用
  • 面试题:单片机裸机和RTOS开发过程中,如何保证全局变量在中断和主循环中读写的正确性

    这个面试题时考察的关键字volatile 临界区 xff0c 原子操作和锁的概念 xff0c 因此首先需要搞清楚这几个知识点以及使用方法 1 关键字volatile 关键字volatile时告诉编译器 xff0c 被关键字volatile修
  • 丰润达为天津艺洲彭泽大酒店打造酒店安防监控改造项目

    衡量一个酒店是否安全的一个很重要的标准 xff0c 就是酒店的各个角落是否都布有监控设备 要知道 xff0c 很多受害人被侵害 xff0c 都是发生在监控看不到的角落 可以说监控就像是一双锐利的眼睛 xff0c 时时注视着坏蛋 xff0c
  • 对不起,这个官司我不服!数据隐私保护是阿里云的生命线

    摘要 xff1a 对阿里云来说 xff0c 保护用户数据隐私一直是我们坚守的生命线 在这次事件处理中 xff0c 保护数据隐私是我们的第一原则 阿里云认为 xff0c 作为云服务器提供商 xff0c 阿里云无权审查任何用户数据 只有收到司法
  • CentOS中添加Swap

    1 检查 Swap 空间在设置 Swap 文件之前 xff0c 有必要先检查一下系统里有没有既存的 Swap 文件 运行以下命令 xff1a 1 swapon s 如果返回的信息概要是空的 xff0c 则表示 Swap 文件不存在 2 检查
  • 优秀程序员的故事

    A君默默的工作了3年 xff0c 从项目初立 xff0c 到遍地开花 工作不忙 xff0c 工资没长 新领导来了 xff0c 下个版本重新开发 xff0c A君继续维护老版本 新招了一批人 xff0c 加班加点干了半年多 直到版本发布 xf
  • android studio 控制台输出乱码

    问题 android studio 控制台输出乱码 详细问题 解决方案 双击Shift 全局查找快捷键 xff0c 输入vmoption xff0c 选择Edit Custom CM Options 即 如果之前没有配置过 xff0c 会弹
  • Linux下使用VSCode,GCC,OpenOCD实现STM32一键编译烧录调试(CMake篇)

    Linux下使用VSCode开发STM32 xff08 二 xff09 一 开发工具安装二 测试工程简介三 CMake工具1 CMakeLists txt2 生成Makefile3 make编译 四 json脚本实现一键编译烧录调试1 la
  • CMake Error at cmake/OpenCVDetectCXXCompiler.cmake:85 (list)

    Ubuntu 18 4 安装opencv 2 4 10时遇到如下问题 xff1a CMake Error at cmake OpenCVDetectCXXCompiler cmake 85 list list GET given empty
  • Camera-IMU标定工具Kalibr的编译

    关于catkin make过程中下载suitesparse过久甚至失败的问题 xff1a 在安装kalibr时的suitesprse库时 xff0c 对应的cmakelists中会通过wget 下载压缩包 xff0c 若无法下载则整个kal
  • 远程桌面,RDP文件密码加密、解密算法(C#)

    背景 xff1a 由于项目需要 xff0c 使用RDP文件来远程登录 xff0c 需要实现点击rdp文件就可以自动连接远程桌面 xff0c 并且实现自动登录功能 xff01 自动登录 xff01 自动登录 xff01 自动登录 xff1a
  • 解决apt install存在依赖关系导致无法安装成功的办法

    安装aptitude xff0c 使用aptitude进行安装会自动给出解决方案 sudo apt get install aptitude sudo aptitude install XXX
  • cubemx在使用freertos的时候为何推荐使用除systick以外的timebase

    摘要 第一次使用stm32cubemx 在配置freertos后生成代码时会提示 When FreeRTOS is used It is strongly recommended to use a HAL timebase source o
  • 状态机编程 (一) 状态机相关概念

    基本概念 状态机编程 xff0c 又称事件驱动型编程 事件驱动程序需要一系列的精细粒度的事件处理函数来处理事件 这些事件函数必须处理的很快并返回主事件循环 所以其非常依赖于通过使用静态变量维护在从一个事件驱动函数转换到下一个执行函数时的执行
  • 后端状态估计-卡尔曼滤波器理解+扩展-SLAM14讲笔记(六)

    文章目录 系列文章目录前言一 pandas是什么 xff1f 二 使用步骤 1 引入库2 读入数据 状态估计的概率解释 xff1a 位姿x和路标y服从某种概率分布 xff0c 目的是通过某些运动数据u xff08 比如惯性测量传感器IMU输
  • OpenCV笔记.1 - OpenCV的编译和安装

    OpenCV的编译和安装 想要使用OpenCV进行图像的处理和开发 xff0c 就需要先对OpenCV库进行编译 虽然在Windows下已经有了现成的OpenCV库 xff0c 但是由于官方提供的库缺少一些关键的功能 xff08 例如Ope
  • Git中stash和stage的差别

    对于初学者来说 xff0c git中stash和stage两个命令的单词有些相似 xff0c 有可能会弄混 其实二者是两个完全不同的概念 1 stash是git中的一个命令 git stash的作用是把工作区 必须是工作区中已经被git追踪
  • 用matlab和RTB做二连杆机械臂动力学建模

    文章目录 写在前面二连杆机械臂RTB建模仿真与验证源代码 写在前面 本文使用的工具为matlab以及Peter Corke的RTB Robotics Toolbox 基于RTB 10 3 1版本 xff0c 我写了RTE Robotics
  • 机械臂协同搬运中的阻抗控制

    文章目录 阻抗模型物体阻抗分布阻抗Matlab和RTB仿真物体阻抗分布阻抗 源代码 阻抗模型 阻抗控制的目的是将原有物体动力学修正为我们期望动力学 假设有一个弹簧 xff0c 通过阻抗控制 xff0c 可以使得它的刚度降低 xff0c 实际