Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.53 KB | None | 0 0
  1. close all;
  2. clear;
  3. clc;
  4. %% Script for combined localization simulation
  5. %% Simulation Data
  6. n = 1000;
  7. target_rad = 0.0015;
  8. sensors = ones(n,8);
  9. Temp_Var=0.00075; % temp var of 0.75 is too high --> fix!
  10. Q = 0.005;
  11.  
  12. %test case 1
  13. % IR
  14. % sensors(:,1) = 1*sensors(:,1) + Q*randn(n,1);
  15. % sensors(:,2) = 1*sensors(:,2)+ Q*randn(n,1);
  16. % sensors(:,3) = 0.05*sensors(:,3)+ Q*randn(n,1);
  17. % sensors(:,4) = 1*sensors(:,4)+ Q*randn(n,1);
  18. % % Thermocouple
  19. % sensors(:,5)= (randn(n,1)*Temp_Var)+linspace(0,6,n)';
  20. % sensors(:,6)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  21. % sensors(:,7)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  22. % sensors(:,8)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  23. % %test case 2
  24. % % IR
  25. % sensors(:,1) = 1*sensors(:,1) + Q*randn(n,1);
  26. % sensors(:,2) = 0.05*sensors(:,2)+ Q*randn(n,1);
  27. % sensors(:,3) = 1*sensors(:,3)+ Q*randn(n,1);
  28. % sensors(:,4) = 0.02*sensors(:,4)+ Q*randn(n,1);
  29. % % Thermocouple
  30. % sensors(:,5)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  31. % sensors(:,6)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  32. % sensors(:,7)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  33. % sensors(:,8)= (randn(n,1)*Temp_Var)+linspace(0,6,n)';
  34. % %
  35. %test case 3
  36. % IR
  37. sensors(:,1) = 1*sensors(:,1) + Q*randn(n,1);
  38. sensors(:,2) = 0.02*sensors(:,2)+ Q*randn(n,1);
  39. sensors(:,3) = 0.02*sensors(:,3)+ Q*randn(n,1);
  40. sensors(:,4) = 1*sensors(:,4)+ Q*randn(n,1);
  41. % Thermocouple
  42. sensors(:,5)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  43. sensors(:,6)= (randn(n,1)*Temp_Var)+linspace(0,6,n)';
  44. sensors(:,7)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  45. sensors(:,8)= (randn(n,1)*Temp_Var)+linspace(0,2,n)';
  46.  
  47. %Get source location from sim data
  48. Sum_sensors=(sensors(:,5)+sensors(:,6)+sensors(:,7)+sensors(:,8));
  49. filt_source_location(:,1)=.5+(9-((sensors(:,5)+sensors(:,6))./Sum_sensors(:)).*9);
  50. filt_source_location(:,2)=.5+(((sensors(:,5)+sensors(:,7))./Sum_sensors(:)).*9);
  51.  
  52. true_sum=(6+2+2+2);
  53. true_location(1)=0.5+(9-((2+6)/(true_sum))*9);
  54. true_location(2)=0.5+(((2+2)/(true_sum))*9);
  55.  
  56. figure()
  57. hold on
  58. c = linspace(1,n,length(Sum_sensors));
  59. scatter(filt_source_location(:,1),filt_source_location(:,2),[100],c)
  60. xlim([0 10])
  61. ylim ([0 10])
  62. colorbar;
  63.  
  64. %% Bayesian Fusion
  65.  
  66. % User inputs
  67. size_x = 0.1; % length of plate [m]
  68. size_y = 0.1; % width of plate [m]
  69. grid_x = 10; %number of cells in x-directions
  70. grid_y = grid_x; %number of cells in y-directions
  71. target_rad = 0.015;
  72.  
  73. % IR info
  74. sensor_pos = [1 3; 1 8 ; 2 3 ; 2 8]; % ([x(1),y(2)], position) line of sight
  75.  
  76. % Thermocouple info
  77.  
  78. % Occupancy Grid
  79. map = robotics.OccupancyGrid(0.1,0.1,grid_x*10);
  80. [x,y] = meshgrid(1:grid_x);
  81. setOccupancy(map,[x(:) y(:)],0.5, "grid");
  82.  
  83. % Initialize grid probabilities
  84. lk_odds = zeros(grid_x,grid_y,5);
  85. pk_occ = 0.5*ones(grid_x,grid_y,5);
  86. p_occ = 0.5*ones(grid_x,grid_y); % overall grid
  87.  
  88. lmin = -2.0;
  89. lmax = 3.5;
  90. measured = 0;
  91.  
  92. dx = size_x/grid_x;
  93. dy = size_y/grid_y;
  94.  
  95. delta_t = 0.01;
  96. tau = 0.1;
  97.  
  98. for t=1:size(sensors,1)
  99. t;
  100. for i=1:5
  101. %only for IR
  102. if i < 5
  103. % Inverse sensor model
  104. cur_pos = sensor_pos(i,:);
  105.  
  106. % Convert volt to distance using sensor model
  107. cur_meas = sensors(t,i)+target_rad;
  108. mu = cur_meas;
  109. sigma = 0.005;
  110. else
  111. % Bivariate Gaussian distribution
  112. % mu = current estimate position of heat source
  113. mu = filt_source_location(i,:)/100;
  114. sigma = [0.0025,0.0025];
  115. end
  116.  
  117. for j=1:grid_x
  118. for k=1:grid_y
  119. xy = grid2world(map,[j k]);
  120.  
  121. if i < 5
  122. % Guassian inverse sensor model
  123. % mean at object detection distance
  124. % variance is sensor noise
  125. % if current grid cell is in the line of sight update
  126. % probability
  127. if (cur_pos(1) == 1 && cur_pos(2) == j)
  128. prob_inv = 0.8*(normpdf(xy(1),mu,sigma)/normpdf(mu,mu,sigma))+0.1;
  129. if xy(1) > mu && prob_inv < 0.5
  130. prob_inv = 0.5;
  131. end
  132. l = lk_odds(j,k,i) + log10(prob_inv/(1-prob_inv));
  133. elseif (cur_pos(1) == 2 && cur_pos(2) == k)
  134. prob_inv = 0.8*(normpdf(xy(2),mu,sigma)/normpdf(mu,mu,sigma))+0.1;
  135. if xy(2) > mu && prob_inv < 0.5
  136. prob_inv = 0.5;
  137. end
  138. l = lk_odds(j,k,i) + log10(prob_inv/(1-prob_inv));
  139. else
  140. prob_inv = 0.5;
  141. l = lk_odds(j,k,i);
  142. end
  143. else
  144. %apply forgetting factor
  145. pk_occ(j,k,i) = (pk_occ(j,k,i)-0.5)*exp(-delta_t/tau)+0.5;
  146. lk_odds(j,k,i) = log10(pk_occ(j,k,i)/(1-pk_occ(j,k,i)));
  147.  
  148. %bivariate normal distribution
  149. prob_inv = 0.8*(mvnpdf(xy,mu,sigma)/mvnpdf(mu,mu,sigma))+0.1;
  150. l = lk_odds(j,k) + log10(prob_inv/(1-prob_inv));
  151. end
  152. % log odds update (temporal)
  153. if l > lmax
  154. l = lmax;
  155. elseif l < lmin
  156. l = lmin;
  157. end
  158. pk_occ(j,k,i) = prob_inv;
  159. lk_odds(j,k,i) = l;
  160. end
  161. end
  162. end
  163. % Multiple sensor fusion (grid)
  164. for h=1:size(pk_occ,1)
  165. for j=1:size(pk_occ,2)
  166. cur_lodds = sum(lk_odds(h,j,:));
  167. prob = 1-(1/(1+exp(cur_lodds)));
  168. p_occ(h,j) = prob;
  169. end
  170. end
  171. end
  172. % Grid update from a measurement
  173. [y,x] = meshgrid(1:grid_x);
  174. setOccupancy(map,[x(:) y(:)],p_occ(:), "grid");
  175. figure()
  176. show(map);
  177. hold on
  178. % Get xy values of grid with probability of 0.8 or higher
  179. x = [];
  180. y = [];
  181. for i=1:size(p_occ,1)
  182. for j=1:size(p_occ,2)
  183. if p_occ(i,j) >= 0.7
  184. xy = grid2world(map,[i j]);
  185. x = vertcat(x,xy(1));
  186. y = vertcat(y,xy(2));
  187. end
  188. end
  189. end
  190. x_loc = mean(x);
  191. y_loc = mean(y);
  192. plot(x_loc,y_loc,'xr','MarkerSize',10)
  193. grid on;
  194. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  195. %Script for combined localization with experimental data
  196. close all;
  197. clear;
  198. clc;
  199. %% File import
  200.  
  201. filenames = "combined_test_case_2.xlsx";
  202. raw_data = xlsread(filenames);
  203. %raw_data(:,1)=[];
  204.  
  205.  
  206. %% Simulation Data
  207. target_rad = 0.0015;
  208. Temp_Var=0.75; % temp var of 0.75 is too high --> fix!
  209. Q = 0.005;
  210.  
  211. % IR
  212. s1_offset = 0.06; %short
  213. s2_offset = 0.06; %short
  214. s3_offset = 0.24; %medium
  215. s4_offset = 0.24; %long
  216.  
  217. % Converting voltage to distance and removing offset
  218. sensors(:,1) = 10.83*raw_data(:,2).^-1.060/100 - s1_offset;
  219. sensors(:,2) = 10.83*raw_data(:,3).^-1.060/100 - s2_offset;
  220. sensors(:,3) = 21.88*raw_data(:,4).^-1.055/100 - s3_offset;
  221. sensors(:,4) = 10.83*raw_data(:,5).^-1.060/100 - s4_offset;
  222.  
  223. sensors(sensors(:,1:4) > 0.15) = 1.0;
  224. sensors(sensors(:,1:4) < 0) = 0;
  225. % Thermocouple
  226. sensors(:,5) = ((raw_data(:,6)-1.25)./0.005)-23;
  227. sensors(:,6) = ((raw_data(:,7)-1.25)./0.005)-23;
  228. sensors(:,7) = ((raw_data(:,8)-1.25)./0.005)-23;
  229. sensors(:,8) = ((raw_data(:,9)-1.25)./0.005)-23;
  230.  
  231. sensors(1:end-1000,:)=[];
  232.  
  233. %% Kalman filtering data
  234. R=[0.00003,0.00003,0.00003,0.00003]; %Based off test case 3
  235. Q=0.0001*ones(1,4); %Assume low noise
  236. F=[1,1,1,1]; %Assume little change
  237. Pc=[0,0,0,0];
  238. G=[0,0,0,0];
  239. P=[0,0,0,0];
  240. Xp=[0,0,0,0];
  241. Zp=[0,0,0,0];
  242. Xe=[0,0,0,0];
  243. filt_temperatures=zeros(length(sensors(:,1)),4);
  244.  
  245. for i = 1:length(sensors(:,1))
  246. Pc=P+Q;
  247. G= Pc./(Pc+R); %Kalman gain
  248. P=(1-G).*Pc;
  249. Xp=Xe;
  250. Zp=Xp;
  251. Xe=G.*(sensors(i,5:8)-Zp)+Xp; %Kalman estimate
  252. filt_temperatures(i,:)=Xe;
  253. end
  254.  
  255. sensors(:,5)=filt_temperatures(:,1);
  256. sensors(:,6)=filt_temperatures(:,2);
  257. sensors(:,7)=filt_temperatures(:,3);
  258. sensors(:,8)=filt_temperatures(:,4);
  259.  
  260.  
  261. filt_temp_sum=(sensors(:,5)+sensors(:,6)+sensors(:,7)+sensors(:,8));
  262. filt_source_location(:,1)=.5+(((sensors(:,5)+sensors(:,7))./filt_temp_sum(:)).*9);
  263. filt_source_location(:,2)=.5+(9-((sensors(:,5)+sensors(:,6))./filt_temp_sum(:)).*9);
  264.  
  265. %%
  266. figure()
  267. hold on
  268. c = linspace(1,length(filt_temp_sum),length(filt_temp_sum));
  269. scatter(filt_source_location(:,1),filt_source_location(:,2),[10],c)
  270. xlim([0 10])
  271. ylim ([0 10])
  272. colorbar;
  273.  
  274. %% Bayesian Fusion
  275.  
  276. % User inputs
  277. size_x = 0.1; % length of plate [m]
  278. size_y = 0.1; % width of plate [m]
  279. grid_x = 10; %number of cells in x-directions
  280. grid_y = grid_x; %number of cells in y-directions
  281. target_rad = 0.015;
  282.  
  283. % IR info
  284. sensor_pos = [1 3; 1 8 ; 2 3 ; 2 8]; % ([x(1),y(2)], position) line of sight
  285.  
  286. % Occupancy Grid
  287. map = robotics.OccupancyGrid(0.1,0.1,grid_x*10);
  288. [x,y] = meshgrid(1:grid_x);
  289. setOccupancy(map,[x(:) y(:)],0.5, "grid");
  290.  
  291. % Initialize grid probabilities
  292. lk_odds = zeros(grid_x,grid_y,5);
  293. pk_occ = 0.5*ones(grid_x,grid_y,5);
  294. p_occ = 0.5*ones(grid_x,grid_y); % overall grid
  295.  
  296. lmin = -2.0;
  297. lmax = 3.5;
  298. measured = 0;
  299.  
  300. dx = size_x/grid_x;
  301. dy = size_y/grid_y;
  302.  
  303. delta_t = 0.001;
  304. tau = 0.1;
  305. %%
  306. for t=1:size(sensors,1)
  307. t;
  308. for i=1:5
  309. %only for IR
  310. if i < 5
  311. % Inverse sensor model
  312. cur_pos = sensor_pos(i,:);
  313.  
  314. % Convert volt to distance using sensor model
  315. cur_meas = sensors(t,i)+target_rad;
  316. mu = cur_meas;
  317. sigma = 0.005;
  318. else
  319. % Bivariate Gaussian distribution
  320. % mu = current estimate position of heat source
  321. mu = filt_source_location(i,:)/100;
  322. sigma = [0.0025,0.0025];
  323. end
  324.  
  325. for j=1:grid_x
  326. for k=1:grid_y
  327. xy = grid2world(map,[j k]);
  328.  
  329. if i < 5
  330. % Guassian inverse sensor model
  331. % mean at object detection distance
  332. % variance is sensor noise
  333. % if current grid cell is in the line of sight update
  334. % probability
  335. if (cur_pos(1) == 1 && cur_pos(2) == j)
  336. prob_inv = 0.8*(normpdf(xy(1),mu,sigma)/normpdf(mu,mu,sigma))+0.1;
  337. if xy(1) > mu && prob_inv < 0.5
  338. prob_inv = 0.5;
  339. end
  340. l = lk_odds(j,k,i) + log10(prob_inv/(1-prob_inv));
  341. elseif (cur_pos(1) == 2 && cur_pos(2) == k)
  342. prob_inv = 0.8*(normpdf(xy(2),mu,sigma)/normpdf(mu,mu,sigma))+0.1;
  343. if xy(2) > mu && prob_inv < 0.5
  344. prob_inv = 0.5;
  345. end
  346. l = lk_odds(j,k,i) + log10(prob_inv/(1-prob_inv));
  347. else
  348. prob_inv = 0.5;
  349. l = lk_odds(j,k,i);
  350. end
  351. else
  352. %apply forgetting factor
  353. pk_occ(j,k,i) = (pk_occ(j,k,i)-0.5)*exp(-delta_t/tau)+0.5;
  354. lk_odds(j,k,i) = log10(pk_occ(j,k,i)/(1-pk_occ(j,k,i)));
  355.  
  356. %bivariate normal distribution
  357. prob_inv = 0.8*(mvnpdf(xy,mu,sigma)/mvnpdf(mu,mu,sigma))+0.1;
  358. l = lk_odds(j,k) + log10(prob_inv/(1-prob_inv));
  359. end
  360. % log odds update (temporal)
  361. if l > lmax
  362. l = lmax;
  363. elseif l < lmin
  364. l = lmin;
  365. end
  366. pk_occ(j,k,i) = prob_inv;
  367. lk_odds(j,k,i) = l;
  368. end
  369. end
  370. end
  371. % Multiple sensor fusion (grid)
  372. for h=1:size(pk_occ,1)
  373. for j=1:size(pk_occ,2)
  374. cur_lodds = sum(lk_odds(h,j,:));
  375. prob = 1-(1/(1+exp(cur_lodds)));
  376. p_occ(h,j) = prob;
  377. end
  378. end
  379. end
  380. % Grid update from a measurement
  381. [y,x] = meshgrid(1:grid_x);
  382. setOccupancy(map,[x(:) y(:)],p_occ(:), "grid");
  383. figure()
  384. show(map);
  385. hold on
  386. % Get xy values of grid with probability of 0.8 or higher
  387. x = [];
  388. y = [];
  389. for i=1:size(p_occ,1)
  390. for j=1:size(p_occ,2)
  391. if p_occ(i,j) >= 0.7
  392. xy = grid2world(map,[i j]);
  393. x = vertcat(x,xy(1));
  394. y = vertcat(y,xy(2));
  395. end
  396. end
  397. end
  398. x_loc = mean(x);
  399. y_loc = mean(y);
  400. plot(x_loc,y_loc,'xr','MarkerSize',10)
  401. grid on;
  402. %%%%%%%%%%%%%%%
  403. %Code for thermal localization simulation
  404. close all;
  405. clear;
  406. clc;
  407.  
  408. %% Experiment Data
  409. filenames = "combined_test_case_1.xlsx";
  410. raw_data = xlsread(filenames);
  411. raw_data(:,1:5)=[];
  412.  
  413. %% Bayesian Fusion
  414.  
  415. % User inputs
  416. size_x = 0.1; % length of plate [m]
  417. size_y = 0.1; % width of plate [m]
  418. grid_x = 10; %number of cells in x-directions
  419. grid_y = grid_x; %number of cells in y-directions
  420. num_ir = 4;
  421. target_rad = 0.015;
  422. sensor_pos = [1 3; 1 8 ; 2 3 ; 2 8]; % ([x(1),y(2)], position) line of sight
  423.  
  424. % Occupancy Grid
  425. map = robotics.OccupancyGrid(0.1,0.1,grid_x*10);
  426. [x,y] = meshgrid(1:grid_x);
  427. setOccupancy(map,[x(:) y(:)],0.5, "grid");
  428.  
  429. % Initialize grid probabilities
  430. p_occ = 0.5*ones(grid_x,grid_y); % overall grid
  431. l_odds = log10(p_occ./(1-p_occ));
  432.  
  433. lmin = -2.0;
  434. lmax = 3.5;
  435. measured = 0;
  436.  
  437. dx = size_x/grid_x;
  438. dy = size_y/grid_y;
  439.  
  440. delta_t = 0.001;
  441. tau = 0.001;
  442. %% Simulation data
  443. Temp_Var=0.75; %Temperature variance
  444.  
  445. Sim_Temp_Data_1=[(randn(60000,1)*Temp_Var)+linspace(0,6,60000)'...
  446. (randn(60000,1)*Temp_Var)+linspace(0,2,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)']
  447.  
  448. Sim_Temp_Data_2=[(randn(60000,1)*Temp_Var)+linspace(0,2,60000)'...
  449. (randn(60000,1)*Temp_Var)+linspace(0,2,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)' (randn(60000,1)*Temp_Var)+linspace(0,6,60000)']
  450.  
  451. Sim_Temp_Data_3=[(randn(60000,1)*Temp_Var)+linspace(0,2,60000)'...
  452. (randn(60000,1)*Temp_Var)+linspace(0,6,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)']
  453.  
  454. % Sim_Temp_Data_4=[(randn(60000,1)*Temp_Var)+linspace(0,2,60000)'...
  455. % (randn(60000,1)*Temp_Var)+linspace(0,2,60000)' (randn(60000,1)*Temp_Var)+linspace(0,6,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)']
  456. %
  457. % Sim_Temp_Data_5=[(randn(60000,1)*Temp_Var)+linspace(0,2,60000)'...
  458. % (randn(60000,1)*Temp_Var)+linspace(0,6,60000)' (randn(60000,1)*Temp_Var)+linspace(0,6,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)']
  459. %
  460. % Sim_Temp_Data_6=[(randn(60000,1)*Temp_Var)+linspace(0,6,60000)'...
  461. % (randn(60000,1)*Temp_Var)+linspace(0,6,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)' (randn(60000,1)*Temp_Var)+linspace(0,2,60000)']
  462.  
  463. %Get source location from sim data
  464. Sum_Sim_Temp_Data_1=(Sim_Temp_Data_3(:,1)+Sim_Temp_Data_3(:,2)+Sim_Temp_Data_3(:,3)+Sim_Temp_Data_3(:,4));
  465. filt_source_location(:,1)=.5+9-(((Sim_Temp_Data_3(:,1)+Sim_Temp_Data_3(:,2))./Sum_Sim_Temp_Data_1(:)).*9);
  466. filt_source_location(:,2)=.5+((Sim_Temp_Data_3(:,1)+Sim_Temp_Data_3(:,3))./Sum_Sim_Temp_Data_1(:)).*9;
  467.  
  468. %%
  469. %for t=1:size(filt_source_location,1)
  470. for t=1:1000
  471. t;
  472. % Bivariate Gaussian distribution
  473. % mu = current estimate position of heat source
  474. mu = filt_source_location(t,:)/100;
  475. sigma = [0.0025,0.0025];
  476. for j=1:grid_x
  477. for k=1:grid_y
  478. %apply forgetting factor
  479. p_occ(j,k) = (p_occ(j,k)-0.5)*exp(-delta_t/tau)+0.5;
  480. l_odds(j,k) = log10(p_occ(j,k)/(1-p_occ(j,k)));
  481.  
  482. xy = grid2world(map,[j k]);
  483. prob_inv = 0.8*(mvnpdf(xy,mu,sigma)/mvnpdf(mu,mu,sigma))+0.1;
  484. l = l_odds(j,k) + log10(prob_inv/(1-prob_inv));
  485.  
  486. % log odds update (temporal)
  487. if l > lmax
  488. l = lmax;
  489. elseif l < lmin
  490. l = lmin;
  491. end
  492. l_odds(j,k) = l;
  493.  
  494. prob = 1-(1/(1+exp(l_odds(j,k))));
  495. p_occ(j,k) = prob;
  496.  
  497. end
  498. end
  499.  
  500. end
  501.  
  502. [y,x] = meshgrid(1:grid_x);
  503. setOccupancy(map,[x(:) y(:)],p_occ(:), "grid");
  504. show(map);
  505. hold on
  506. % Get xy values of grid with probability of 0.8 or higher
  507. x = [];
  508. y = [];
  509. for i=1:size(p_occ,1)
  510. for j=1:size(p_occ,2)
  511. if p_occ(i,j) >= 0.7
  512. xy = grid2world(map,[i j]);
  513. x = vertcat(x,xy(1));
  514. y = vertcat(y,xy(2));
  515. end
  516. end
  517. end
  518. x_loc = mean(x);
  519. y_loc = mean(y);
  520. plot(x_loc,y_loc,'xr','MarkerSize',10)
  521. grid on;
  522. colorbar;
  523.  
  524. %%
  525. figure()
  526. hold on
  527. c = linspace(1,60000,length(Sum_Sim_Temp_Data_1));
  528. scatter(filt_source_location(:,1),filt_source_location(:,2),[100],c)
  529. xlim([0 10])
  530. ylim ([0 10])
  531. colorbar;
  532.  
  533. x_moving_Variance=movvar(filt_source_location(:,1),600);
  534. y_moving_Variance=movvar(filt_source_location(:,2),600);
  535.  
  536. figure()
  537. hold on
  538. plot(x_moving_Variance)
  539. plot(y_moving_Variance)
  540. plot(1:1:60000,0.75*ones(60000,1))
  541. ylim([0 4])
  542. title('Change in variance over time with 600 point window')
  543. xlabel('Time step (0.001s)')
  544. ylabel('Variance [cm]')
  545. %%%%%%%%%%%%%
  546. % IR Localization simulation
  547.  
  548. close all;
  549. clear;
  550. clc;
  551.  
  552. %% Simulation Data
  553. n = 100;
  554. sensors = ones(n,4);
  555. Q = 0.005;
  556.  
  557. %test case 1
  558. % sensors(:,1) = 1*sensors(:,1) + Q*randn(n,1);
  559. % sensors(:,2) = 0.01*sensors(:,2)+ Q*randn(n,1);
  560. % sensors(:,3) = 0.01*sensors(:,3)+ Q*randn(n,1);
  561. % sensors(:,4) = 1*sensors(:,4)+ Q*randn(n,1);
  562.  
  563. %test case 2
  564. sensors(:,1) = 1*sensors(:,1) + Q*randn(n,1);
  565. sensors(:,2) = 1*sensors(:,2)+ Q*randn(n,1);
  566. sensors(:,3) = 0.035*sensors(:,3)+ Q*randn(n,1);
  567. sensors(:,4) = 1*sensors(:,4)+ Q*randn(n,1);
  568.  
  569. %test case 3
  570. % sensors(:,1) = 0.07*sensors(:,1) + Q*randn(n,1);
  571. % sensors(:,2) = 1*sensors(:,2)+ Q*randn(n,1);
  572. % sensors(:,3) = 1*sensors(:,3)+ Q*randn(n,1);
  573. % sensors(:,4) = 0.07*sensors(:,4)+ Q*randn(n,1);
  574.  
  575. %% Experiment Data
  576. %filenames = "ir_test_case_2.xlsx";
  577. filenames = "combined_test_case_1.xlsx";
  578. raw_data = xlsread(filenames);
  579.  
  580. % figure;
  581. % t = raw_data(:,1);
  582. % for i = 2:5
  583. % plot(t,raw_data(:,i));
  584. % hold on;
  585. % end
  586. % legend();
  587.  
  588. s1_offset = 0.06; %short
  589. s2_offset = 0.06; %short
  590. s3_offset = 0.24; %medium
  591. s4_offset = 0.24; %long
  592.  
  593. % Converting voltage to distance and removing offset
  594. n = 1000;
  595. sensors = zeros(n,4);
  596. sensors(:,1) = 10.83*raw_data(1:n,2).^-1.060/100 - s1_offset;
  597. sensors(:,2) = 10.83*raw_data(1:n,3).^-1.060/100 - s2_offset;
  598. sensors(:,3) = 21.88*raw_data(1:n,4).^-1.055/100 - s3_offset;
  599. sensors(:,4) = 53.37*raw_data(1:n,5).^-1.14/100 - s4_offset;
  600.  
  601. sensors(sensors > 0.15) = 1.0;
  602. sensors(sensors < 0) = 0;
  603. %%
  604. % figure;
  605. % t = raw_data(:,1);
  606. % for i = 1:4
  607. % plot(t(1:100),sensors(:,i)');
  608. % hold on;
  609. % end
  610. % legend();
  611.  
  612. %% Bayesian Fusion
  613.  
  614. % User inputes
  615. size_x = 0.1; % length of plate [m]
  616. size_y = 0.1; % width of plate [m]
  617. grid_x = 10; %number of cells in x-directions
  618. grid_y = grid_x; %number of cells in y-directions
  619. num_ir = 4;
  620. target_rad = 0.015;
  621. sensor_pos = [1 3; 1 8 ; 2 3 ; 2 8]; % ([x(1),y(2)], position) line of sight
  622.  
  623. % Occupancy Grid
  624. map = robotics.OccupancyGrid(0.1,0.1,grid_x*10);
  625. map.OccupiedThreshold = 0.7;
  626. map.FreeThreshold = 0.3;
  627.  
  628. % Initialize grid probabilities
  629. l_odds = zeros(grid_x,grid_y,size(sensors,2));
  630. pk_occ = 0.5*ones(grid_x,grid_y,size(sensors,2));
  631. p_occ = 0.5*ones(grid_x,grid_y); % overall grid
  632.  
  633. lmin = -2.0;
  634. lmax = 3.5;
  635. measured = 0;
  636.  
  637. dx = size_x/grid_x;
  638. dy = size_y/grid_y;
  639.  
  640. delta_t = 0.1;
  641. tau = 1;
  642.  
  643. for t=1:size(sensors,1)
  644. t
  645. for i=1:size(sensors,2)
  646. %i
  647. % Inverse sensor model
  648. cur_pos = sensor_pos(i,:);
  649.  
  650. % Convert volt to distance using sensor model
  651. cur_meas = sensors(t,i)+target_rad;
  652. mu = cur_meas;
  653. sigma = 0.005;
  654.  
  655. for j=1:grid_x
  656. for k=1:grid_y
  657. xy = grid2world(map,[j k]);
  658.  
  659. % Guassian inverse sensor model
  660. % mean at object detection distance
  661. % variance is sensor noise
  662.  
  663. % if current grid cell is in the line of sight update
  664. % probability
  665. if (cur_pos(1) == 1 && cur_pos(2) == j)
  666. %apply forgetting factor
  667. prob_inv = 0.8*(normpdf(xy(1),mu,sigma)/normpdf(mu,mu,sigma))+0.1;
  668. if xy(1) >= mu && prob_inv < 0.5
  669. prob_inv = 0.5;
  670. end
  671. l = l_odds(j,k,i) + log10(prob_inv/(1-prob_inv));
  672. elseif (cur_pos(1) == 2 && cur_pos(2) == k)
  673. %apply forgetting factor
  674. prob_inv = 0.8*(normpdf(xy(2),mu,sigma)/normpdf(mu,mu,sigma))+0.1;
  675. if xy(2) >= mu && prob_inv < 0.5
  676. prob_inv = 0.5;
  677. end
  678. l = l_odds(j,k,i) + log10(prob_inv/(1-prob_inv));
  679. else
  680. prob_inv = 0.5;
  681. l = l_odds(j,k,i);
  682. end
  683. pk_occ(j,k,i) = prob_inv;
  684.  
  685. % log odds update (temporal)
  686. if l > lmax
  687. l = lmax;
  688. elseif l < lmin
  689. l = lmin;
  690. end
  691. l_odds(j,k,i) = l;
  692. end
  693. end
  694. end
  695. % Multiple sensor fusion (grid)
  696. for h=1:size(p_occ,1)
  697. for j=1:size(p_occ,2)
  698. cur_lodds = sum(l_odds(h,j,:));
  699. p_occ(h,j) = 1-(1/(1+exp(cur_lodds)));
  700. end
  701. end
  702. % Grid update from a measurement
  703. [y,x] = meshgrid(1:grid_x);
  704. setOccupancy(map,[x(:) y(:)],p_occ(:), "grid");
  705. show(map);
  706. end
  707. % Grid update from a measurement
  708. [y,x] = meshgrid(1:grid_x);
  709. setOccupancy(map,[x(:) y(:)],p_occ(:), "grid");
  710. show(map);
  711. hold on
  712. % Get xy values of grid with probability of 0.8 or higher
  713. x = [];
  714. y = [];
  715. for i=1:size(p_occ,1)
  716. for j=1:size(p_occ,2)
  717. if p_occ(i,j) >= 0.7
  718. xy = grid2world(map,[i j]);
  719. x = vertcat(x,xy(1));
  720. y = vertcat(y,xy(2));
  721. end
  722. end
  723. end
  724. x_loc = mean(x);
  725. y_loc = mean(y);
  726. plot(x_loc,y_loc,'xr','MarkerSize',10)
  727. grid on;
  728. colormap;
  729.  
  730. %% figures
  731.  
  732. %test case 1
  733. t = 0:0.01:0.99;
  734. sensors = ones(100,4);
  735. sensors(:,1) = 0.2*sensors(:,1) + Q*randn(n,1);
  736. sensors(:,2) = 0.01*sensors(:,2)+ Q*randn(n,1);
  737. sensors(:,3) = 0.01*sensors(:,3)+ Q*randn(n,1);
  738. sensors(:,4) = 0.2*sensors(:,4)+ Q*randn(n,1);
  739. plot(t,sensors);
  740. xlabel('Time [s]');
  741. ylabel('Distance [m]');
  742. %%
  743. % inverse sensor model
  744. d = 0:0.001:0.1;
  745. sigma = 0.005;
  746. norm = 0.8*(normpdf(d,0.05,sigma)/normpdf(0.05,0.05,sigma))+0.1;
  747. norm(norm < 0.5) = 0.5;
  748. norm1 = 0.8*(normpdf(d,0.05,sigma)/normpdf(0.05,0.05,sigma))+0.1;
  749. norm1(51:101) = norm(51:101);
  750. plot(d,norm1)
  751. xlabel('Distance [m]');
  752. ylabel('p(m_{ij}|d)');
  753. grid on;
  754. colorbar;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement