Matlab 多机器人编队数据分析

news2024/11/25 10:30:32

文章目录

  • 前言
  • 一、Function 'quiver' not supported for code generation.
  • 二、在仿真环境中添加障碍物
  • 三、simulink中function函数初始化
  • 五、在MATLAB中,实现在绘图时只删除上一次绘制的图形而不是整个图形界面
  • 六、matlab simulink中,程序不断发出机器人位置信息,创建一个模块收集机器人从开始到结束的所有位姿
  • 总结


前言

近期实验室购置了阿木实验室KKSwarm集群仿真平台,其整体开放环境为MATLAB,近期基于该平台做了一些集群编队的工作,期间遇到了一些小问题,记录下遇到的问题和解决方法。

在这里插入图片描述


一、Function ‘quiver’ not supported for code generation.

解决方法:添加coder.extrinsic('quiver'),其他的同理~

二、在仿真环境中添加障碍物

解决方法:添加coder.extrinsic('quiver'),其他的同理~

三、simulink中function函数初始化

matlab中搭建的simulink,每次有参数传入后都会初始化函数的定义,但只想在参数第一次传入时进行初始化,后面调用时不再初始化。

 persistent k
    persistent pose_x
    persistent pose_y
    persistent pose_th
    persistent h_circle
    persistent h_quiver
    persistent h1_arrows
    persistent h2_arrows
    
    if isempty(k)
        k = 0;

    end
    if isempty(pose_x)
        pose_x = zeros(6,5000);  % 初始化x坐标的空矩阵
    end
    if isempty(pose_y)
        pose_y = zeros(6,5000);  % 初始化y坐标的空矩阵
    end
    if isempty(pose_th)
        pose_th = zeros(6,5000);  % 初始化th坐标的空矩阵
    end
    if isempty(h_circle)
        h_circle = zeros(6,1);  % 初始化th坐标的空矩阵
    end
    if isempty(h_quiver)
        h_quiver = zeros(6,1);  % 初始化th坐标的空矩阵
    end
    if isempty(h1_arrows)
        h1_arrows = zeros(6,6);  % 初始化th坐标的空矩阵
    end
    if isempty(h2_arrows)
        h2_arrows = zeros(6,6);  % 初始化th坐标的空矩阵
    end

五、在MATLAB中,实现在绘图时只删除上一次绘制的图形而不是整个图形界面

目前已知各个机器人的位置,仿真时把个机器人之间通过线段连接起来,并且每当有新的位置信息传入时,只删除之前的连线。但保留机器人的轨迹。

 %% ====Animation====
            area = compute_area(pose_x(1,k),pose_y(1,k),0.5);
            %hold off;
            ArrowLength=0.1; 
            for j=1:N
                 h_quiver(j) = quiver(pose_x(j,k),pose_y(j,k),ArrowLength*cos(pose_th(j,k)),ArrowLength*sin(pose_th(j,k)),'*k');hold on;
                if j==1
                    state=2;
                else
                    state=1;
                end
                    h_circle(j) = draw_circle (pose_x(j,k),pose_y(j,k),0.06,state);hold on;
            end
    
            for i=1:N
                for j=1:N
                    if A(i,j)==1
                         [lineHandle, arrowHandle] = draw_arrow([pose_x(j,k),pose_y(j,k)],[pose_x(i,k),pose_y(i,k)], 0.05);hold on;
                         h1_arrows(i, j) = lineHandle;
                         h2_arrows(i, j) = arrowHandle;
                    end
                end
            end
    
            if size(ob_temp)~=[0 0]
                plot(ob_temp(:,1),ob_temp(:,2),'Xk','LineWidth',2);hold on;
            end
            axis(area);
            grid on;
            drawnow; 

            for j=1:N
            delete(h_quiver(j));
            end

            for j=1:N
            delete(h_circle(j));
            end

            for i=1:N
                for j=1:N
                    if A(i,j)==1
                      delete(h1_arrows(i, j)); % 删除线条
                      delete(h2_arrows(i, j)); % 删除箭头头部
                    end
                end
            end



 color='mgbkrc';

    for i=1:N
        plot(pose_x(i,5:k),pose_y(i,5:k),color(1,i),'LineWidth',2);
        hold on
    end

需要注意的是,想要单独删除某个绘制的图形时,需要创建句柄表示绘制出的图形,通过delete进行删除。但如果调用.m文件进行画图时,确保调用的.m文件有对应的返回值,否则句柄无法收到消息,进而无法通过delete删除。
举例:

//单独删除箭头draw_arrow图形,包含两部分箭头和线段,要添加两个返回值a,b
function [a,b] = draw_arrow(startpoint,endpoint,headsize) 
% draw the communication direction between two agents
% accepts two [x y] coords and one double headsize 

v1 = headsize*(startpoint-endpoint)/sqrt((startpoint(1)-endpoint(1))^2+(startpoint(2)-endpoint(2))^2);
theta = 22.5*pi/180; 
theta1 = -1*22.5*pi/180; 
rotMatrix = [cos(theta)  -sin(theta) ; sin(theta)  cos(theta)];
rotMatrix1 = [cos(theta1)  -sin(theta1) ; sin(theta1)  cos(theta1)];  

v2 = v1*rotMatrix; 
v3 = v1*rotMatrix1;
x1 = endpoint+2*v1;
x2 = x1 + v2;
x3 = x1 + v3;

b = fill([x1(1) x2(1) x3(1)],[x1(2) x2(2) x3(2)],[0 0 0]);% this fills the arrowhead (black) 

a = plot([startpoint(1) endpoint(1)],[startpoint(2) endpoint(2)],'linewidth',0.5,'color',[0 0 0]);

//同样在调用时储存每次画出的图形
            for i=1:N
                for j=1:N
                    if A(i,j)==1
                         [lineHandle, arrowHandle] = draw_arrow([pose_x(j,k),pose_y(j,k)],[pose_x(i,k),pose_y(i,k)], 0.05);hold on;
                         h1_arrows(i, j) = lineHandle;
                         h2_arrows(i, j) = arrowHandle;
                    end
                end
            end
//对应的删除操作
            for i=1:N
                for j=1:N
                    if A(i,j)==1
                      delete(h1_arrows(i, j)); % 删除线条
                      delete(h2_arrows(i, j)); % 删除箭头头部
                    end
                end
            end

六、matlab simulink中,程序不断发出机器人位置信息,创建一个模块收集机器人从开始到结束的所有位姿

wp1传入[10x3]列的矩阵,前6行依次代表6个机器人的位置坐标,后4行代表障碍物的位置坐标,每当有新的位置传进来wp1就会更新,记录下各机器人从开始位置到目标位置的所有坐标。
开始时采用的办法:

function saveData(pose_x, pose_y, pose_th)
    % 保存数据到 .mat 文件
    save('robot_pose_data.mat', 'pose_x', 'pose_y', 'pose_th');
end

但运行时save一直报错,无法保存机器人位置数据。
最终采用的方法:
在这里插入图片描述
通过To Workspace分别来收集机器人当前时刻位姿和当前时刻的目标位姿:
代码:

function [xp1,xp2,xp3,xp11,xp22,xp33] = visualizeRobots(wp1)
    N = 6;

     persistent poseX
     persistent poseY
     persistent poseth
     persistent poseXX
     persistent poseYY
     persistent posethth

    %% Adjacent matrix
    A=[0 0 0 0 0 0;     % a(ij)
       1 0 1 1 0 0;
       1 1 0 0 0 1;
       1 1 0 0 1 0;
       1 0 0 1 0 1;
       1 0 1 0 1 0];

%     delta_x = [0 -0.2  0.2 -0.4  0.0  0.4];   % 6个机器人相对间隔误差每一列代表一个机器人
%     delta_y = [0  0.4  0.4  0.0 -0.3  0.0];   % 领航者与自己无误差

   
       
        % 计算当前机器人的目标位置
        pos_targetsX =  [wp1(1,1)  wp1(1,1)-0.2  wp1(1,1)+0.2  wp1(1,1)-0.4  wp1(1,1)      wp1(1,1)+0.4];
        pos_targetsY =  [wp1(1,2)  wp1(1,2)+0.4  wp1(1,2)+0.4  wp1(1,2)      wp1(1,2)-0.3  wp1(1,2)];
        pos_targetsth =  [wp1(1,3)  wp1(1,3)      wp1(1,3)      wp1(1,3)      wp1(1,3)      wp1(1,3)];
          



%     if isempty(posel)
%         posel = zeros(6,1);  % 初始化x坐标的空矩阵
%     end

coder.extrinsic('quiver','draw_circle','draw_arrow','gcs','get_param','assign') ; 

    % 存放机器人的位姿
    pose_x = wp1(1:6, 1);
    pose_y = wp1(1:6, 2); 
    pose_th = wp1(1:6, 3);

    % 存放障碍物的位置
    ob_temp = [wp1(7:10,1),wp1(7:10,2)];


    % 将当前数据存入历史数据
    %historyData{end+1} = struct('pose_x', pose_x, 'pose_y', pose_y, 'pose_th', pose_th, 'obstacles', ob_temp);


    %% ====Animation====
            area = compute_area(pose_x(1),pose_y(1),0.5);
            hold off;
            ArrowLength=0.1; 
            for j=1:N
                quiver(pose_x(j),pose_y(j),ArrowLength*cos(pose_th(j)),ArrowLength*sin(pose_th(j)),'*k');hold on;
                if j==1
                    state=2;
                else
                    state=1;
                end
                draw_circle (pose_x(j),pose_y(j),0.06,state);hold on;
            end
    
            for i=1:N
                for j=1:N
                    if A(i,j)==1
                        draw_arrow([pose_x(j),pose_y(j)],[pose_x(i),pose_y(i)], 0.05);hold on;
                    end
                end
            end
    
            if size(ob_temp)~=[0 0]
                plot(ob_temp(:,1),ob_temp(:,2),'Xk','LineWidth',2);hold on;
            end
            axis(area);
            grid on;
            drawnow;    
            poseX = pose_x;
            poseY = pose_y;
            poseth = pose_th;

            poseXX = pos_targetsX;
            poseYY = pos_targetsY;
            posethth = pos_targetsth;


            xp1 = poseX';
            xp2 = poseY';
            xp3 = poseth';

            xp11 = poseXX;
            xp22 = poseYY;
            xp33 = posethth;
            
end

保存的数据:
在这里插入图片描述

总结

最终借助MATLAB强大的数据分析功能绘制出,预期的图形:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

因为才开始学习使用Matlab还用许多不清楚的地方,故记录下遇到的问题供以后温故知新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git的学习使用(搭建本地仓库,创建本地仓库,配置本地仓库)(附带Ubuntu云服务器git安装流程)

学习目标: 学习使用git,并且熟悉git的使用 学习内容: 必备环境:xshell,Ubuntu云服务器 如下: 搭建 git 环境掌握 Java 基本语法掌握条件语句掌握循环语句 搭建git环境: 1、先检查自己的云服…

vscode的一些概念和原理,插件系统简单上手指南

VScode 技术栈和架构 使用的技术栈: Electron。Typescript。Node.js。Monaco Editor。 代码编辑器 主进程 (Main Process): 负责应用的生命周期管理、菜单、系统托盘等操作系统相关的功能。Electron 的主进程还负责启动渲染进程,并提供与 Node.js 之间…

Excel:多种方法实现1列转多列表格(含vba实现)

要求:将A列中的名字放到右边的表格里面 一、当数据较少的时候手动实现更快 实现的步骤: 1.先按照下面的方式填充右边的表格 然后选中a2、a7所在的前两行进行下拉填充 2.填充完毕表格的样子 3.选中该表格所在的区域 → 点击菜单栏“开始” → 查找 → 替…

python之selenium接管打开的谷歌浏览器窗口——隐藏爬虫特征,跳过登陆弹窗验证

文章目录 引言使用selenium接管打开的谷歌浏览器总结 引言 我们知道通过selenium打开的浏览器与本地电脑上打开的浏览器是不同的,selenium通过插件打开浏览器页面会显示爬虫特征信息,且在访问某些网站时,很容易被检测出是一个爬虫机器&#x…

第十五周:机器学习

目录 摘要 abstrct 一、HW3——食物图片分类CNN 二、GAN计算推导 1、引入 2、最大似然估计 3、divergence的计算 4、总结 三、GAN的架构——fGAN 1、f-divergence 2、共轭函数 3、connetction with GAN 总结 摘要 本周进一步学习了GAN基本原理,主…

element el-tree 自定义图标

除了自定义以外,下方代码还包含 tree自动展开 点击节点后节点聚焦 节点的click事件 节点查询 <template><el-inputplaceholder"请输入要查询的节点"v-model"filterText"clearable></el-input><el-treehighlight-currentclass&quo…

【RabbitMQ】RabbitMQ 的七种工作模式介绍

目录 1. Simple(简单模式) 2. Work Queue(工作队列) 3. Publish/Subscribe(发布/订阅) 4. Routing(路由模式) 5. Topics(通配符模式) 6. RPC(RPC通信) 7. Publisher Confirms(发布确认) 上一篇文章中我们简单认识了RabbitM1: 【RabbitMQ】RabbitMQ 的概念以及使用Rabb…

【Qt】窗口关闭提示框

在关闭QWdiget窗口时弹出提示框 重写**closeEvent**函数 void closeEvent(QCloseEvent* event) override;QMessageBox *msgBox new QMessageBox(QMessageBox::Question, "信息提示", "是否保存当前数据&#xff1f;", QMessageBox::Save | QMessageBox::N…

github克隆项目中的子模块submodule时遇到“无法访问远程仓库,请检查权限“

问题描述 在拉取仓库的时候发现了新东西。 仓库中有两个文件夹提示 点击之后&#xff0c;发现跳转到了另一个仓库 &#xff0c;原来这是仓库的子模块&#xff0c;第一次见&#xff0c;也就是仓库中包含了其他的的仓库&#xff0c;就是这么简单的原理。 但是在拉取仓库以后发现…

VScode环境配置

目录 好用插件推荐 1.Auto Rename Tag 2.openbrowser 3.实时预览&#xff08;推荐&#xff09; VSCode常用的快捷键 1. 快速复制一行 2.快速复制一行代码选定多个相同的单词 3. 添加多个光标 4. 全局替换某写单词 5. 快速定位到某一行 6. 选择某个区块 7. 放大缩…

高一全栈开发;国产 Arc 浏览器;Tauri 2.0 发布 | 生活周刊 #3

发现新应用 Vectorcraftr Vectorcraftr 提供免费可商用的插画库&#xff0c;风格有很多&#xff0c;自行食用 书立 一款功能强大、特性丰富的笔记软件&#xff0c;包含富文本&#xff0c;双链&#xff0c;表格&#xff0c;富目录树&#xff0c;WebDAV &#xff0c;自由导出等…

WPF 为button动态设置不同的模板

有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容&#xff0c;比如Button未点击安装显示&#xff1a; 安装后显示&#xff1a; 可以通过设置button的content&#xff0c;通过content来设置不同的模板来实现功能&#xff0c;以下是代码&#xff1a; MainWi…

【消息队列】Kafka从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

CentOS7安装Gitlab服务

文章目录 前言一、安装依赖二、安装gitlab1、上传安装2、修改配置 三、启动gitlab服务四、修改密码五、设置为中文&#xff08;低版本有问题&#xff09;六、常用命令 前言 文中gitlab版本为&#xff1a; gitlab-ce-14.2.7 一、安装依赖 gitlab需要安装如下依赖&#xff0c;否…

Linux编辑器-vim的配置及其使用

vim是一种多模式的编辑器&#xff1a; 1.命令模式&#xff08;默认模式&#xff09;&#xff1a;用户所有的输入都会当作命令&#xff0c;不会当作文本输入。 2.插入模式&#xff1a;写代码&#xff0c; 按「 i 」切换进入插入模式「 insert mode 」&#xff0c;按 “i” 进入…

2024/10/13周报

文章目录 摘要Abstract文献阅读题目1. 背景与问题提出2. 提出的CLATT方法2.1 卷积神经网络&#xff08;CNN&#xff09;2.2 长短期记忆网络&#xff08;LSTM&#xff09;2.3 注意力机制2.4 滑动窗口方法 3. 实验设计与结果3.1 数据集3.2 实验基线与评价指标3.3 实验结果与分析 …

使用清华大学开源软件镜像站下载JDK

在软件开发和日常使用中&#xff0c;Java Development Kit&#xff08;JDK&#xff09;是不可或缺的一部分。它提供了Java运行环境和开发工具&#xff0c;使得开发者可以编写、编译和运行Java应用程序。本文将指导你如何从清华大学开源软件镜像站&#xff08;TUNA&#xff09;下…

通信工程学习:什么是UART通用异步收发器

UART&#xff1a;通用异步收发器 UART&#xff0c;全称Universal Asynchronous Receiver/Transmitter&#xff0c;即通用异步收发传输器&#xff0c;是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。以下是关于UART的详细介绍&#xff1a; 一、定义与特点 定义&…

数据分析:R语言计算XGBoost二分类模型的SHAP值

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍SHAP用途计算方法:应用加载R包导入数据建模平均SHAP值计算单个样本的每个特征的SHAP值蜜蜂图依赖图单个样本的SHAP解释(Force Plot)其他方法计算SHAP值单个个体预测结果系统信息…

MLM之Llama-3:Llama 3.2的简介、安装和使用方法、案例应用之详细攻略

MLM之Llama-3&#xff1a;Llama 3.2的简介、安装和使用方法、案例应用之详细攻略 目录 Llama 3.2 简介 1、Llama 3.2 的特点 2、模型评估 轻量级指令调优基准 视觉指令调整基准 Llama 3.2 的安装和使用方法 1、下载模型 2. 开发环境准备 3. 使用模型进行推理和微调 4…