0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何實現(xiàn)對機(jī)器人接觸力的數(shù)據(jù)濾波

麥辣雞腿堡 ? 來源:古月居 ? 作者:思念之風(fēng) ? 2023-11-10 17:23 ? 次閱讀

下面舉一些例子,實現(xiàn)對機(jī)器人接觸力的數(shù)據(jù)濾波!

首先是導(dǎo)入數(shù)據(jù):

clc
clear all;
close all;
X = xlsread('E:程序test~六維力數(shù)據(jù).csv');%導(dǎo)入數(shù)據(jù)
A=X(:,1);B=X(:,2);C=X(:,3);D=X(:,4);E=X(:,5);F=X(:,6);%提取力數(shù)據(jù)
%% 濾波
x=A;
N=1347; %時域點數(shù)
fs = 100;  % 重采樣頻率
T = 1/fs;  % 周期
n = 5;  % 1Hz頻率被分成n% N = fs*n;  % 因為1Hz頻率被分成了n段,所以頻譜的x軸數(shù)組有fs*n個數(shù)
f = (0: N-1)*fs/N;  %fs個頻率細(xì)分成fs*n個(即原來是[0, 1, 2,, fs],現(xiàn)在是[0, 1/N, 2/N,, (N-1)*fs/N]t = (0: N-1)*T;  % 信號所持續(xù)的時長(N個周期)
nHz = 10;  % 畫的頻譜的橫坐標(biāo)到nHz
Hz = nHz*n;  % 畫的頻譜的橫坐標(biāo)的數(shù)組個數(shù)
%% 繪制原始信號時頻圖
figure
subplot(211),plot(x,'k'),title('原始信號時域'),xlabel('采樣點/n'),ylabel('力或力矩');  % 繪制原始信號時域


fx = abs(fft(x-mean(x)))/(N/2);  % 傅里葉變換
subplot(212),plot(f(1:Hz), fx(1:Hz),'k'),title('原始信號頻譜圖'),xlabel('頻率/Hz'),ylabel('幅值');  % 繪制原始信號頻域

可以得到如下結(jié)果:

圖片

通過傅里葉變換可以得到接觸力信號頻域上的內(nèi)容。

進(jìn)行低通濾波處理:

%% 低通濾波
fc = 20;
Wc = 2*fc/fs; 
[b,a] = butter(2,Wc,'low');  % 四階的巴特沃斯低通濾波,保留頻率低于fc的振動
fprintf('a = %6.18fn',a);
fprintf('b = %6.18fn',b);
x1 = filter(b,a,x);


figure
subplot(211),plot(x1,'b'),title('低通濾波信號時域圖'),xlabel('采樣點/n'),ylabel('力或力矩');
fx = abs(fft(x1-mean(x1)))/(N/2);  % 傅里葉變換
subplot(212),plot(f(1:Hz), fx(1:Hz),'b'),title('低通濾波信號頻譜圖'),xlabel('頻率/Hz'),ylabel('幅值');  % 繪制原始信號頻域

Butterworth digital and analog filter design:

function varargout = butter(n, Wn, varargin)
narginchk(2,4);
if coder.target('MATLAB')
   [varargout{1:nargout}] = butterImpl(n,Wn,varargin{:});
else
   allConst = coder.internal.isConst(n) && coder.internal.isConst(Wn);
   for ii = 1:length(varargin)
      allConst = allConst && coder.internal.isConst(varargin{ii});
   end
   if allConst && coder.internal.isCompiled
      [varargout{1:nargout}] = coder.const(@feval,'butter',n,Wn,varargin{:});
   else
      [varargout{1:nargout}] = butterImpl(n,Wn,varargin{:});
   end
end
end


function varargout = butterImpl(n,Wn,varargin)
inputArgs = cell(1,length(varargin));
if nargin > 2
   [inputArgs{:}] = convertStringsToChars(varargin{:});
else
   inputArgs = varargin;
end
validateattributes(n,{'numeric'},{'scalar','real','integer','positive'},'butter','N');
validateattributes(Wn,{'numeric'},{'vector','real','finite','nonempty'},'butter','Wn');


[btype,analog,~,msgobj] = iirchk(Wn,inputArgs{:});
if ~isempty(msgobj)
   coder.internal.error(msgobj.Identifier,msgobj.Arguments{:});
end
% Cast to enforce precision rules
n1 = double(n(1));
coder.internal.errorIf(n1 > 500,'signal:butter:InvalidRange')
% Cast to enforce precision rules
Wn = double(Wn);
% step 1: get analog, pre-warped frequencies
fs = 2;
if ~analog
   u = 2*fs*tan(pi*Wn/fs);
else
   u = Wn;
end


% step 2: Get N-th order Butterworth analog lowpass prototype
[zs,ps,ks] = buttap(n1);
% Transform to state-space
[a,b,c,d] = zp2ss(zs,ps,ks);
% step 3: Transform to the desired filter
if length(Wn) == 1
   % step 3a: convert to low-pass prototype estimate
   Wn1 = u(1);
   Bw = []; %#ok< NASGU >
   % step 3b: Transform to lowpass or high pass filter of desired cutoff
   % frequency
   if btype == 1           % Lowpass
      [ad,bd,cd,dd] = lp2lp(a,b,c,d,Wn1);
   else % btype == 3       % Highpass
      [ad,bd,cd,dd] = lp2hp(a,b,c,d,Wn1);
   end
else % length(Wn) is 2
   % step 3a: convert to low-pass prototype estimate
   Bw = u(2) - u(1);      % center frequency
   Wn1 = sqrt(u(1)*u(2));
   % step 3b: Transform to bandpass or bandstop filter of desired center
   % frequency and bandwidth
   if btype == 2           % Bandpass
      [ad,bd,cd,dd] = lp2bp(a,b,c,d,Wn1,Bw);
   else % btype == 4       % Bandstop
      [ad,bd,cd,dd] = lp2bs(a,b,c,d,Wn1,Bw);
   end
end
% step 4: Use Bilinear transformation to find discrete equivalent:
if ~analog
   [ad,bd,cd,dd] = bilinear(ad,bd,cd,dd,fs);
end


if nargout == 4 % Outputs are in state space form
   varargout{1} = ad;          % A
   varargout{2} = bd;          % B
   varargout{3} = cd;          % C
   varargout{4} = dd;          % D
else
   p = eig(ad);
   [z,k] = buttzeros(btype,n1,Wn1,analog,p+0i);
   if nargout == 3         % Transform to zero-pole-gain form
      varargout{1} = z;
      varargout{2} = p;
      varargout{3} = k;
   else
      den = real(poly(p));
      num = [zeros(1,length(p)-length(z),'like',den)  k*real(poly(z))];
      varargout{1} = num;
      varargout{2} = den;
   end
end
end




function [z,k] = buttzeros(btype,n,Wn,analog,p)
% This internal function computes the zeros and gain of the ZPK
% representation. Wn is scalar (sqrt(Wn(1)*Wn(2)) for bandpass/stop).
if analog
   % for lowpass and bandpass, don't include zeros at +Inf or -Inf
   switch btype
      case 1  % lowpass: H(0)=1
         z = zeros(0,1,'like',p);
         k = Wn^n;  % prod(-p) = Wn^n
      case 2  % bandpass: H(1i*Wn) = 1
         z = zeros(n,1,'like',p);
         k = real(prod(1i*Wn-p)/(1i*Wn)^n);
      case 3  % highpass: H(Inf) = 1
         z = zeros(n,1,'like',p);
         k = 1;
      case 4  % bandstop: H(0) = 1
         z = 1i*Wn*((-1).^(0:2*n-1)');
         k = 1;  % prod(p) = prod(z) = Wn^(2n)
      otherwise
         coder.internal.error('signal:iirchk:BadFilterType','high','stop','low','bandpass');
   end
else
   Wn = 2*atan2(Wn,4);
   switch btype
      case 1  % lowpass: H(1)=1
         z = -ones(n,1,'like',p);
         k = real(prod(1-p))/2^n;
      case 2  % bandpass: H(z) = 1 for z=exp(1i*sqrt(Wn(1)*Wn(2)))
         z = [ones(n,1,'like',p); -ones(n,1,'like',p)];
         zWn = exp(1i*Wn);
         k = real(prod(zWn-p)/prod(zWn-z));
      case 3  % highpass: H(-1) = 1
         z = ones(n,1,'like',p);
         k = real(prod(1+p))/2^n;
      case 4  % bandstop: H(1) = 1
         z = exp(1i*Wn*( (-1).^(0:2*n-1)' ));
         k = real(prod(1-p)/prod(1-z));
      otherwise
         coder.internal.error('signal:iirchk:BadFilterType','high','stop','low','bandpass');
   end
end
% Note: codegen complains when z set to both real and complex values above
if ~any(imag(z))
   z = real(z);
end
end

可以得到濾波后的接觸力數(shù)據(jù):

圖片

為了更詳細(xì)的進(jìn)行原始數(shù)據(jù)與濾波后的數(shù)據(jù)進(jìn)行對比,接下來以幾種不同形式的濾波方式進(jìn)行對比。

原始接觸力數(shù)據(jù):

圖片

移動平均濾波
b = [1 1 1 1 1 1]/6;
x11 = filter(b,1,x);

圖片

很明顯,去除噪聲的效果較為突出!

接下來采用中值濾波:

圖片

中值濾波的效果相比于移動平均濾波有改善。

接下來進(jìn)行維納濾波:

Rxx=xcorr(x, x);              %得到混合信號的自相關(guān)函數(shù)
M=100;                                                             %維納濾波器階數(shù)
for i=1:M                                                           
    for j=1:M
        rxx(i,j)=Rxx(abs(j-i)+N);   %得到混合信號的自相關(guān)矩陣
    end
end
Rxy=xcorr(x,x1);       %(此處x1為中值信號濾波后效果,原信號不存在)得到混合信號和原信號的互相關(guān)函數(shù)
for i=1:M
    rxy(i)=Rxy(i+N-1);   %得到混合信號和原信號的互相關(guān)向量
end                                                                  
h = inv(rxx)*rxy';                                               %得到所要涉及的wiener濾波器系數(shù)
x1=filter(h,1, x);               %將輸入信號通過維納濾波器

圖片

但維納濾波的效果沒有前面兩個濾波算法的效果好,需要進(jìn)一步整定參數(shù)。

下面進(jìn)行自適應(yīng)濾波:

k=100;                                                  %時域抽頭LMS算法濾波器階數(shù)
u=0.001;                                             %步長因子


%設(shè)置初值
x1=zeros(1,N);                                  %output signal
x1(1:k)=x(1:k);                 %將輸入信號SignalAddNoise的前k個值作為輸出yn_1的前k個值
w=zeros(1,k);                                        %設(shè)置抽頭加權(quán)初值
e=zeros(1,N);                                        %誤差信號


%用LMS算法迭代濾波
for i=(k+1):N
        XN=x((i-k+1):(i));
        XN=XN';
        x1(i)=w*XN';
        e(i)=x11(i)-x1(i);%不存在原信號,此處換為平均濾波后的時域波形
        w=w+2*u*e(i)*XN;
end

圖片

四階的巴特沃斯低通濾波:

Wc=2*3/fs; %截止頻率 3Hz
[b,a]=butter(4,Wc,'low'); % 四階的巴特沃斯低通濾波
x1=filter(b,a,x);

圖片

二階的巴特沃斯帶通濾波:

Wc1=2*1/fs; %下截止頻率 1Hz
Wc2=2*6/fs; %上截止頻率 6Hz
[b,a]=butter(2,[Wc1, Wc2],'bandpass'); % 二階的巴特沃斯帶通濾波
x1=filter(b,a,x);

圖片

需要生成濾波器時,可以使用matlab中自帶的工具。filterDesigner

利用這個工具,可以將設(shè)計的濾波器保存成一個函數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    210

    文章

    28103

    瀏覽量

    205851
  • 濾波
    +關(guān)注

    關(guān)注

    10

    文章

    662

    瀏覽量

    56569
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
收藏 人收藏

    評論

    相關(guān)推薦

    nao機(jī)器人與其他機(jī)器人的區(qū)別

    機(jī)器人在之前的機(jī)器人的基礎(chǔ)上,加入了可以自由便捷的運(yùn)動功能,兩個攝像頭精準(zhǔn)拍攝、全方位的視覺功能,還有一個超聲傳感器功能。傳感器可以識別人類和NAO機(jī)器人接觸,從而做些動作和人類互動
    發(fā)表于 02-13 15:43

    機(jī)器人彈鋼琴,實現(xiàn)難度如何?

    鋼琴曲目的機(jī)器人,只需要它實現(xiàn)能彈奏曲目。因為現(xiàn)在剛剛接觸機(jī)器人制作方面,只懂一些中斷和舵機(jī)啥的,不知道做成的難度有多大,,,,希望各位前輩能夠不舍賜教。如果能做成,都需要
    發(fā)表于 05-22 17:06

    機(jī)器人彈鋼琴

    鋼琴曲目的機(jī)器人,只需要它實現(xiàn)能彈奏曲目。因為現(xiàn)在剛剛接觸機(jī)器人制作方面,只懂一些中斷和舵機(jī)啥的,不知道做成的難度有多大,,,,希望各位前輩能夠不舍賜教。如果能做成,都需要
    發(fā)表于 05-22 17:09

    機(jī)器人、協(xié)作機(jī)器人和移動機(jī)器人,你分的清楚嗎

    機(jī)器人機(jī)器人之間可能會發(fā)生身體接觸。有人反對協(xié)作機(jī)器人這一說法,認(rèn)為沒有這種機(jī)器人,只有
    發(fā)表于 10-30 11:33

    機(jī)器人的眼睛和大腦:智能化光電傳感器

    的檢測。較高的研發(fā)費用是一直沒有成功實現(xiàn)相對滑移直接檢測技術(shù)工業(yè)化應(yīng)用的主要原因?! ∨c現(xiàn)在建議使用的方案不同,在IITB霍倫霍夫研究所中研發(fā)成功的光學(xué)傳感器能夠直接對相對滑移進(jìn)行檢測。結(jié)合接觸力檢測
    發(fā)表于 11-06 10:52

    機(jī)器人基礎(chǔ)書籍

    列舉部分學(xué)習(xí)過程中接觸的部分書籍,部分有中文版,部分有更新版本。1.機(jī)器人基礎(chǔ)書籍適合入門的書籍:機(jī)器人學(xué)機(jī)器人建模規(guī)劃與控制機(jī)器人學(xué)、
    發(fā)表于 05-22 06:53

    機(jī)器人接觸式物體探測的接觸方式有哪些?

    機(jī)器人接觸式物體探測技術(shù)電路設(shè)計
    發(fā)表于 03-02 11:06

    軟固結(jié)磨粒群接觸力分析

    針對激光強(qiáng)化模具白由曲面的光整加工問題,對軟固結(jié)磨粒群氣壓砂輪與模具表面接觸力、下壓量進(jìn)行了研究,對砂輪接觸模具表面時的磨粒姿態(tài)進(jìn)行了分析,提出了一種基于GW接觸模型構(gòu)建了軟固結(jié)磨粒群接觸力
    發(fā)表于 03-16 16:19 ?0次下載
    軟固結(jié)磨粒群<b class='flag-5'>接觸力</b>分析

    機(jī)器人力控的性能指標(biāo)有哪些

    機(jī)器人的操作任務(wù)中,處理機(jī)器人和環(huán)境之間的物理接觸是非常重要的。 由于機(jī)器人系統(tǒng)的復(fù)雜性和不確定性,純運(yùn)動控制往往是不夠的,因為即使是最精確的模型也無法完全準(zhǔn)確地預(yù)測所有可能的情況。
    的頭像 發(fā)表于 11-08 16:18 ?917次閱讀

    機(jī)器人阻抗控制有幾種方法

    在工業(yè)機(jī)器人中,阻抗控制是一種非常重要的控制方法,主要用于控制機(jī)器人的力和位。通過調(diào)整阻抗,機(jī)器人可以更好地適應(yīng)不同的操作環(huán)境和任務(wù)需求。 阻抗控制的基本思路是:建立一個期望的機(jī)器人
    的頭像 發(fā)表于 11-08 18:08 ?1359次閱讀
    <b class='flag-5'>機(jī)器人</b>阻抗控制有幾種方法

    力控機(jī)器人接觸力濾波與估計

    力控機(jī)器人本身關(guān)節(jié)具有力傳感器,可為什么還需要接觸力濾波和估計呢?這是不是有些多余?顯然是不是的,本篇博文總結(jié)下力控機(jī)器人接觸力
    的頭像 發(fā)表于 11-10 17:01 ?453次閱讀

    單關(guān)節(jié)機(jī)械臂接觸力補(bǔ)償因素

    具有單軸力傳感器的單關(guān)節(jié)機(jī)械臂接觸力估計: 接觸力估計需要考慮多個因素進(jìn)行補(bǔ)償,以提高估計的準(zhǔn)確性。以下是一些常見的補(bǔ)償因素: 1.重力補(bǔ)償:機(jī)械臂在接觸過程中會受到重力的影響,因此需要對測量到的力
    的頭像 發(fā)表于 11-10 17:08 ?579次閱讀

    機(jī)器臂柔順控制初步分析

    實現(xiàn)與環(huán)境的安全、柔順交互,需要將機(jī)器人期望動力學(xué)行為與接觸環(huán)境所表現(xiàn)出來的特征進(jìn)行匹配。定性地分析來看: 對于高剛度接觸環(huán)境,期望機(jī)器
    的頭像 發(fā)表于 11-22 15:59 ?443次閱讀

    柔性觸覺傳感器或?qū)⒃谌诵?b class='flag-5'>機(jī)器人時代大放異彩

    近日,開源證券發(fā)布研究報告稱,柔性觸覺傳感器又稱為“電子皮膚”,能夠實現(xiàn)與環(huán)境接觸力、溫度、濕度、震動、材質(zhì)、軟硬等特性的監(jiān)測,是機(jī)器人直接感知環(huán)境作用的重要傳感器,有助于智能化的人形機(jī)器人
    的頭像 發(fā)表于 12-13 15:52 ?987次閱讀

    接觸力對120A250A大電流接線端子有哪些影響

    德索工程師說道在電子連接技術(shù)中,接觸力是確保電力傳輸穩(wěn)定性和效率的關(guān)鍵因素。特別是在120A250A大電流接線端子的應(yīng)用上,適當(dāng)?shù)?b class='flag-5'>接觸力可以防止連接失敗和電阻增加,這對于保障設(shè)備的安全運(yùn)行重要。然而,接觸力的大小并非一成不變,其
    的頭像 發(fā)表于 07-09 11:56 ?261次閱讀
    <b class='flag-5'>接觸力</b>對120A250A大電流接線端子有哪些影響