SUTD
作者在读学校Singapore University of Technology and Design

Established under strong support from MIT, Singapore University of Technology and Design (SUTD) plans to do for Singapore what MIT has done for Massachusetts and Silicon Valley, as well as for the world. SUTD is conducting top-tier research and education. In 2017, SUTD was ranked by Clarivate Analytics as the 5th most influential scientific research university in telecommunications in the world. SUTD was also ranked the 6th in electrical engineering research in the world.

代码示例

链接:MATLAB多机器人编队攻击与检测
在运行之前需要在MATLAB中安装libsvm工具包(自行google或baidu解决,有很多相关博文)。
在下载代码包后使用matlab打开并更改路径到文件夹下,每次打开时要先右键点击subfun和svm文件夹并添加文件及子文件到路径下,如下图所示

随后可以直接依次运行consensus3_demo.m, attacker1.m和defend.m即可。
觉得使用方便还请星标和关注笔者的git!

理论分析

关于机器人协同编队的原理及代码介绍详细请参考作者相关博客

  1. 《多机器人协同编队算法原理及实现》
  2. 《基于关联矩阵的多智能体稳定性分析》
  3. 《多机器人编队人工势场法协同避障算法原理及实现》
  4. 《MATLAB实现多机器人协同编队动态仿真》
  5. 《适用于多机器人协同编队的学习方法-SVM》

SVM的MATLAB实现

SVM的数学原理已经在前文进行了介绍,本文将重点放在代码实现上面。在安装好libsvm工具包后,实现SVM只需要几个步骤

  • 1, 采集数据集作为学习样本,对数据集进行归一化处理
  • 2, 选取合适的核函数训练数据集获得训练模型model
  • 3, 获取训练集,通过之前所得的model进行预测或分类

具体的代码如下所示(svm.m文件)

load('data.mat')
load('attmse.mat')
label = a(:,100);
instance = a(:,1:99);
instance = sparse(instance);
libsvmwrite('libsvm_data.mat',label, instance); 
pre_label = attmse(:,100);
pre_att = sparse(attmse(1:5,1:99));
[data_label,data_instance]=libsvmread('libsvm_data.mat');  
model = svmtrain(data_label(1:60),data_instance(1:60,:),'-s 4 -t 2 -c 1 -g 0.1');
% [predict_label,accuracy,dec_values] = svmpredict(data_label(21:25),data_instance(21:25,:),model);
[predict_label,accuracy,dec_values] = svmpredict(pre_label(1:5),pre_att,model);
label_out=predict_label

其中svmtrain()函数是训练函数,使用的参数介绍有很多讲解的,笔者就不再赘述。

编队数据采集

本文中笔者以多机器人编队的攻击检测为例讲述机器学习算法的使用。考虑如下两个场景:
(1) 机器人编队平稳运行,期间遇到静态障碍物进行正常平稳避障,见consensus3_demo.m。
(2) 机器人编队运行时,场景中存在另外一个恶意机器人attacker。假设attacker能够通过传感器获取编队的位置信息,并且以此推断出编队各个机器人的速度信息。该attacker将会运动到编队中来伪装成动态障碍物破坏并恶意引导编队,见attacker1.m。
我们在这两个场景中调整参数和静态障碍物的位置信息运行几十次,将各个机器人每个时刻的位置信息存储在data.mat文件中,代码如下所示

load('data.mat')
b=attmse(1:5,:);
a=[a;b];
save('data.mat','a');
xlswrite('attmse.xlsx',attmse);

在存储之前,需要对收集到的信息进行归一化处理,代码如下所示

for i=1:5
    dmax(i)=max(attmse(i,1:99));
end
for i=1:5
    if(dmax(i)>0.1)%排除一些噪声进行逐行归一化
        attmse(i,1:99)=normalization(attmse(i,1:99),0,dmax(i),0,1);
    else
        attmse(i,1:99)=normalization(attmse(i,1:99),0,max(dmax(:)),0,1);
    end 
end
save('attmse.mat','attmse');

之后通过实时存储数据attmse.mse并调用svm.m函数来实时展示学习结果

for i=1:5
    dmax(i)=max(attmse(i,1:99));
end
for i=1:5
    if(dmax(i)>0.1)%排除一些噪声进行逐行归一化
        attmse(i,1:99)=normalization(attmse(i,1:99),0,dmax(i),0,1);
    else
        attmse(i,1:99)=normalization(attmse(i,1:99),0,max(dmax(:)),0,1);
    end
end
save('attmse.mat','attmse');
label=svm(1)   %用学习出来的model检测哪个机器人受到了攻击

注意,归一化非常重要,不同的数据有不同的尺度大小,如果不归一化会导致训练结果受某些极端情况的影响增大,造成较大的训练误差。

后记

本文把基于SVM的多机器人编队的训练和学习算法实现,大家可以在此基础上扩展延伸。觉得有帮助一定要转发点赞关注哦,谢谢!

笔者本科毕业于上海交通大学,现在是SUTD PhD Candidate,有两年多ROS的使用经验及多机器人编队的科研经验,现在是总结之前所学,希望能有所帮助。本系列多机器人编队将结合论文讲解多机器人编队的算法原理、稳定性分析、路径规划等研究领域,并有代码示例,持续不断更新中。如果大家有相关问题或发现作者漏洞欢迎私戳,同时欢迎关注收藏。
同时欢迎关注博主Git和CSDN:
https://github.com/LiHongbo97
https://blog.csdn.net/qq_33742147?spm=1011.2124.3001.5343