移动机器人 | 火星探矿机器人

news2024/11/17 14:28:10

01、需求分析

“火星探矿机器人”旨在要开发若干个自主机器人,将其送到火星上去搜寻和采集火星上的矿产资源。

火星环境对于开发者和自主机器人而言事先不可知,但是可以想象火星表面会有多样化的地形情况,如河流、巨石、凹坑等,机器人在运动过程中会遇到各种障碍;

另外,火星上还可能存在一些未知的动态因素(如风暴等),会使得环境的状况发生变化。

概括起来,火星环境具有开放、动态、不可知、难控等特点。

为了简化案例的开发和演示,可以将机器人探矿的区域(即机器人的运动环境)简化和抽象成M×M的单元格,每个单元格代表某个火星区域,火星矿产分布在这些单元格中,同时这些单元格中还存在阻碍机器人运行的障碍物。

探矿机器人在这些网格中运动,根据感知到的网格环境信息自主地决定自身的行为。

如果所在的单元格有矿产,则采集矿产;如果探测到附近的单元格存在矿产,则移动到该单元格;如果周围的单元格存在障碍物,则避开这些障碍物。

环境网格有两个特殊的单元格:一个是矿产堆积单元格,用于存放机器人采集到的矿产,如图1中的左下角;另一个是能量补充单元格,机器人可以从该单元格获得能量。

图1火星探矿机器人案例的环境示意图

“火星探矿机器人”的设计目标是要采集火星矿产,并将其带到预定的区域。

为此,该机器人具有以下一组基本能力。

  • 移动。它能够在火星表面移动,能够从一个单元格移动到其上、下、左、右的相邻单元格。

  • 探测。它配备了多种传感器,具有一定程度的环境感知能力,具体包括探测周围一定区间(如相邻多少个单元格)的矿产分布情况以及障碍物情况。

  • 采集。它能够采集所在单元格中的火星矿产。

  • 卸载。它能够卸载其采集的、放置在其体内的矿产。

  • 交互。它能够与其他的机器人进行交互和协同,以更高效地采集矿产。例如,一个机器人探测到大面积的矿产,它可以将该矿产信息告知其他机器人,以便他们能够来该区域采集矿产。

为了充分反应探矿机器人的实际情况,我们对机器人作了以下假设:

①每个机器人存储矿产的容量都有一定的限度,即机器人内部只有有限的空间存放矿产,一旦机器人采集的矿产超出其存储容量,它必须将这些矿产卸载到特定的位置区域,以便能够再次采集矿产。

②每个机器人的能量都有一定的限度,机器人在移动、探测、采集、卸载等过程中会消耗能量,为此机器人必须在其能量消耗殆尽之前补充能量(如充电)。

③每个机器人的感知能力都是有限度的,它只能够感知其周围一定范围内的环境状况,如邻近两个单位的单元格。

下面通过多个场景描述机器人如何在上述火星环境下采集火星矿产,这些场景分别描述了机器人采矿的不同工作模式,反映了实现这些自主机器人的不同难易程度。

场景一:独立采集矿产。

在该场景中,有多个自主机器人参与到火星矿产的采集工作中,每个机器人都有移动、探测、采集、卸载的能力,它们在火星表面随机移动,根据其所在位置探测到的矿产信息和障碍物等环境信息自主地实施行为。

但是,这些机器人都是单独工作,它们之间没有任何交互与合作。

因此,可以将本场景中的每个机器人都抽象和设计为自主的Agent。

场景二:合作采集矿产。

在该场景中,有多个自主机器人参与到火星矿产的采集工作中,每个机器人都有移动、探测、采集、卸载的能力,它们在完成各自矿产采集任务的同时,相互之间还进行交互和合作,以更高效地开展工作。

例如,某个机器人探测到大片的矿产信息,那么它可以将该信息告诉给其他机器人,或者请求其他机器人来该区域采矿。

因此,可以将本场景中的机器人抽象和设计为由多个自主Agent所构成的多Agent系统。

该系统的设计和实现不仅要考虑到各个自主Agent,还要考虑到这些Agent之间的交互和协同。

场景三:多角色合作采集矿产。

在该场景中,有多个具有不同职责、扮演不同角色的机器人参与到火星矿产的采集工作中,每类机器人承担矿产采集中的某项工作(如探测、采集),它们之间通过交互和合作共同完成矿产采集任务,即该场景有多种类型的机器人,包括:

①采矿机器人,采集矿产并将其运送到指定区域;

②探测机器人,负责探测矿产并将其探测到的矿产信息通知给采矿机器人。

因此,可以将本场景中的机器人抽象和设计为由多个自主Agent所构成的多Agent系统。

该系统的设计和实现不仅要考虑到各个自主Agent,还要考虑到这些Agent之间的交互和协同。

显然,该场景比前一个场景更复杂,它涉及的Agent类型和数量、交互和合作关系等更多。

02、设计与实现

下面介绍如何基于多Agent系统的开发框架JADE开发“火星探矿机器人”案例。

为了简化设计,聚焦于Agent的构造和实现,“火星探矿机器人”案例中的环境被设计为一个M×M的网格,每个网格单元代表了一个地理位置,不同网格单元具有不同的地形信息,可能存在影响机器人移动的障碍物,火星矿产非均匀地分布在网格单元格中。

机器人驻留在网格环境中,可以在不同的网格中移动,感知网格周围的环境信息,如矿产、障碍物等,如果它发现所在的网格中存在矿产,那么它就挖掘矿产。

整个应用的界面如图2所示。

界面左部显示了机器人所在的环境(用网格来表示),它提供了多样化的图符以及数字信息表示环境中的机器人、矿产、障碍物等及其在环境中的分布情况。

机器人运行在网格中,因而任何时刻机器人都有其所处单元格的位置。

界面的右部显示了各种图符信息的说明以及系统和环境中机器人、矿产等数量的变化。

界面的下部提供整个系统运行过程中的各种动态信息,如某个机器人探测到矿产、机器人从一个位置移动到另一个位置等。

图2火星探矿多Agent系统的运行界面

系统在初始化时将自动生成机器人的运行环境,包括矿产、障碍物等的分布。

用户可以根据需要配置系统运行时的机器人信息,包括机器人的类型、数目等,设置机器人的基本属性,如机器人的观测范围、机器人的初始能量值等。

在实际开发中,我们具有以下的基本假设:Agent从初始位置出发在地图上随机单步移动,遇到障碍能够自动避开,能自动探测到其周边是否有矿产,一次只能采集一个矿产并将其运送到指定的矿产仓库。

1●环境的设计与实现

我们设计了一个环境类(对应于environment.java文件)表示和处理应用中的环境。

该类封装了以下一组属性和行为。

  • 环境中的矿产,定义一个一维动态数组存放矿产的位置ArrayList<Coordinate>MinePositions,其中Coordinate是一个类,定义了网格的坐标。

  • 环境中的障碍物,定义一个一维动态数组存放障碍物的位置ArrayList<Coordinate>ObstaclePositions。

  • 环境中的机器人,ArrayList<BasicRobot>robots,该属性定义了处于环境中的一组机器人。

  • InitEnv()方法,该方法生成网格环境并随机产生环境中的矿产和障碍物。

2●系统中的Agent和行为

根据应用案例描述,我们设计了如图3所示的一组Agent和行为,以支持场景一至场景三的实现。

图3系统中的Agent及其行为示意图

  • BasicRobot是一个基本的Agent机器人,它能够在环境中行走,具有随机行走RandomWalkBev的行为。

  • 在本案例中,BasicRobot无须生成具体的Agent实例,而是被其他Agent所继承。

  • ExploreRobot是一个专门为场景一设计的Agent机器人,它继承了“BasicRobot”Agent的属性、方法和行为,具有探测矿产DetectMineBev、采集矿产DigMineBev、转存矿产DumpMineBev3个行为。

  • 也就是说,该Agent可以独立完成探矿、采矿和存矿的功能。

  • 但是,ExploreRobot不具有与其他Agent交互和协同的能力。

  • 在场景一,系统可能会产生一个或者多个“ExploreRobot”Agent机器人。

  • ExploreCoopRobot是一个专门为场景二设计的Agent机器人,它继承了“ExploreRobot”Agent的属性、方法和行为,同时具有交互协同CooperationBev行为,能够与其他Agent机器人进行协同,以告知所探测的矿产信息。

  • 在场景二中,系统可能会产生一个或者多个“ExploreCoopRobot”Agent机器人。

  • 场景三包含两类不同的Agent机器人:

  • 一类是专门探矿的机器人DetectMineRobot,它具有探测矿产DetectMineBev、交互协同CooperationBev两个行为,可以实现探矿并将所探测到的矿产信息告诉给其他的Agent机器人;

  • 另一类是DigMineRobot,它具有采集矿产DigMineBev、转存矿产DumpMineBev、交互协同CooperationBev3个行为,能够实施采矿、存矿等功能,处理其他Agent发送过来的消息,并将采矿信息告诉给环境中的其他

3●Agent类的设计与实现

Agent类的设计与实现需要注意以下几点:

①继承Agent类或者其子类;

②在构造函数中初始化Agent的基本属性;

③在Setup()方法中通过addBehaviour()语句给Agent增加相应的行为,以便Agent创建后就可执行这些行为。

下面以“ExploreRobot”Agent为例介绍如何设计和实现Agent。

任何Agent类都要继承JADE的Agent类或者其子类,如BasicRobot继承了Agent类,其代码框架如下所示。

import jade.core.Agent;
public class BasicRobot extends Agent{…}

“ExploreRobot”Agent则继承了“BasicRobot”Agent,而“BasicRobot”Agent是Agent类的子类,该部分的代码框架如下所示。

import jade.core.Agent;
public class ExploreRobot extends BasicRobot{…}

在每个Agent的构造函数部分,程序员需要针对Agent的一些属性完成初始化工作。

例如,对于每一个“ExploreRobot”Agent而言,当其实例化之后,需要为其随机生成该Agent机器人在环境(即网格)中的位置,同时需要初始化该机器人所获得环境中矿产的信息。

该部分的代码框架描述如下。

import jade.core.Agent;
public class ExploreRobot extends BasicRobot{
Coordinate position;
ArrayList<Coordinate>FoundMine;
…
 public ExploreRobot(){
    …;
    position=env.CreateRandomPosition();
    FoundMine=new ArrayList<Coordinate>();
 }
…
}

其中,position是一个类型为Coordinate的属性,它定义了Agent机器人在网格中的坐标;FoundMine是一个类型为Coordinate的动态数组,定义了Agent机器人探测到的矿产位置信息。

在上述语句中,CreateRandomPosition()是一个产生随机环境位置的方法,FoundMine=new ArrayList<Coordination>()语句则产生一个类型为Coordinate的动态数组。

Agent类的设计通常需要实例化setup()方法。

针对本案例,我们需要在该方法中增加一组行为,以便让ExploreRobot在创建之后就可执行这些行为,其代码框架描述如下。

import jade.core.Agent;
public class ExploreRobot extends BasicRobot{
…
public void setup(){
   addBehaviour(new DetectMineBehaviour(this));
   addBehaviour(new DigMineBehaviour(this));
   addBehaviour(new DumpMineBev(this));
}
…
}

其中,语句addBehaviour(new DetectMineBehaviour(this));旨在增加一个探测矿产的行为,语句addBehaviour(new DigMineBehaviour(this));旨在增加一个挖矿的行为,语句addBehaviour(new DumpMineBev(this));旨在增加一个卸载矿产到矿产仓库的行为。

4●行为类的设计与实现

行为类的设计与实现需要注意以下几点:

①分析待实现行为的特点,确定该行为类应继承什么样的基类行为;

②在publicvoidaction()方法中编写具体的行为代码。

下面以DetectMineBehaviour行为为例介绍如何设计和实现行为。

首先,DetectMineBehaviour行为旨在探测Agent周边是否存在矿产,这种探测需要不断地进行,因而该行为属于一类周期性行为,需要继承JADE中的CyclicBehaviour类,其代码框架如下所示。

import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
…
public class Detect MineBev extends CyclicBehaviour{
   …
   public DetectMineBev(BasicRobot robot){
   …
   }
   public void action(){
        …
   }
}

其中,DetectMineBev()是构造函数,可以完成一些初始化的工作;public void action()定义了行为体。

其次,需要在public void action()方法中定义行为的程序代码。

对于DetectMineBev行为而言,其行为部分主要是要获得其当前所在位置的周围是否存在矿产,如果存在,则将这些矿产信息(即矿产所在的坐标)加入到Agent机器人的FoundMine动态数组中。

5●Agent间交互的设计与实现

场景二和场景三都涉及Agent机器人之间的交互和协同。

下面以场景三中的DetectRobot为例,介绍如何实现Agent之间基于FIPA ACL的交互和协同。

一旦某个DetectRobot探测到某些矿产,它需要将它所探测到的矿产信息通知给环境中的“DigRobot”Agent机器人。

下面的程序代码描述了Agent机器人在DetectMineBehaviour行为中如何给其他的Agent发送所探测到的矿产信息。

首先,通过newACLMessage(ACLMessage.INFORM)语句产生一个“通知”类型的ACL消息,其次将矿产坐标作为该消息的内容,然后将其他Agent加入到消息的接收者列表中,最后发送该ACL消息。

public class DetectMineBehaviour extends CyclicBehaviour {
    …
    //行为体
    public void action(){
        Coordinate target =RandomWalkBev.RandomNextpoint(ui.myGrid);
        int RobotNum =en.getrobotArryList().size();
         …
        //生成消息类型
        ACLMessage msg =new ACLMessage(ACLMessage.INFORM);
        //生成消息内容
        for(int i=0;i<en.getMinePositions().size();i++){
            targetposi.x= en.getMinePositions().get(i).x;
            targetposi.y= en.getMinePositions().get(i).y;
            try{
               msg.setContentObject((Serializable) targetposi);
            } catch(IOException e){
                 //TODO Auto-generated catch block
                 e.printStackTrace();
            }
        }
        //生成消息的接收者
        for(int i=0;i<en.getrobotArryList().size();i++){
            msg.addReceiver(new AID("Dig"+i,AID.ISLOCALNAME));
        }
        thisRobot.send(msg);//发送消息
    }
    …
}

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

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

相关文章

公司从字节招来一个28K的测试工程师,让我见识到了什么才是真正的测试天花板

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

队列——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;又好久不见啦&#xff0c;最近有点摆烂&#xff0c;甚是惭愧&#xff01;&#xff01;&#xff01;&#xff01;今天&#xff0c;小雅兰的内容是队列&#xff0c;下面&#xff0c;让我们进入队列的世界吧&#xff01;&#xff01;&#xff0…

Trigger +Pipeline 完整实战案例

2.4.1 案例环境说明 示例项目&#xff1a;http://code.icloud2native.com/root/spring-boot-helloWorld.git 触发机制: 用户推送代码至项目仓库由Push Hook 自东触发pipeline的流水线的执行 2.4.2 项目实现 1、在k8s上部署一个gitlab&#xff0c;前面上节已经完成。 2、运…

海睿思分享 | 类chatgpt模型在信息抽取领域的应用

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指能够处理海量数据、拥有百亿级参数的深度学习模型&#xff0c;它已成为⼈⼯智能领域中的新热点。2022 年 11 ⽉ 30 号 ChatGPT 发布&#xff0c;其卓越的性能表现给整个⾏业带来了巨⼤的冲击。⼈们不…

2023年春季期末网球理论复习资料

&#xff08;含2023/2022/2021时事题&#xff0c;基于2012年期末网球理论复习资料修改&#xff09; 目录 网球的起源 网球的主要赛事 三大网球协会 大满贯 网球的场地 1. 球场线 2. 网球的球网 3.场地的类型 网球的规则 1.发球规则 2.计分方法 3.通则 4.赛…

在Octane中提升渲染速度的技巧(第1部分)

Mike Griggs是一位数字内容创建者&#xff0c;在为众多客户创建Mograph&#xff0c;VFX和CGI方面拥有超过二十年的经验。迈克格里格斯&#xff08;Mike Griggs&#xff09;在Creative Bloq上写了很多博客&#xff0c;该博客是国际媒体集团和领先的数字出版商Future plc的一部分…

手势识别q

本文介绍使用光电传感器的手势识别。 光电传感器手势识别区别于视觉手势识别&#xff0c;没有复杂的算法。LED发射光&#xff0c;当光线接触到手发生反射&#xff0c;反射光被传感器检测到&#xff0c;传感器检测到不同的手势反射的光不同&#xff0c;再根据芯片的内置算法判别…

【笔试强训编程题】Day5.( 统计回文 45842 ) 和( 连续最大和 58539)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训编程题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录…

【嵌入式烧录/刷写文件】-2.5-Fill填充Intel Hex文件

案例背景(共8页精讲)&#xff1a;该篇将告诉你&#xff0c;如何对一个Hex文件进行填充&#xff1a; 对“起始地址”和“结束地址”内的非连续的Block块&#xff0c;进行填充&#xff1b;自定义填充范围。 目录 1 为什么要“Fill填充” 2 使用Vector HexView工具“填充”Hex…

【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析

【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析 一、ELF概述二、ELF的组成结构2.1 ELF header&#xff1a;解析出 section headers 含31个section节和 program headers 含13个segment段2.2 Section Headers&#xff1a;获取当前程序的31个section节区信息2…

18-03 MySQL高可用方案与选择

主从复制 读写分离 流程 原理 bin log STATEMENT 优点&#xff1a;记录的是执行的SQL,比较省空间&#xff0c;降低了主从复制时的IO开销缺点&#xff1a;由于记录的是SQL&#xff0c;所以MySQL多个节点之间复制的时候&#xff0c;特定场景下会导致数据不一致的情况 ROW 优点…

【多线程进阶二】JUC工具类 线程安全的集合类 死锁

目录 一、JUC工具类 &#x1f345;1、Callable接口 &#x1f345;2、ReentrantLock &#x1f345;3、原子类 &#x1f345;4、Semaphore信号量 &#x1f345;5、CountDownLatch 二、线程安全的集合类 ​&#x1f345;1、多线程环境下&#xff0c;怎么使用线程安全…

第十三届蓝桥杯国赛JavaB组题解

A. 重合次数 思路&#xff1a; 枚举不同的时刻&#xff0c;判断哪些时刻秒针和分针表示的数字是相同的。这道题坑就坑在:xx:59:59 xx:00:00分针和时。也就是说一个小时会重叠两次。 题目要求是分钟和秒钟的重叠次数,故时钟,分钟,秒钟同时重叠的次数不算(这题还是有点咬文嚼字了…

MySQL---事务

1. 事务操作 开启事务&#xff1a;Start Transaction 任何一条DML语句(insert、update、delete)执行&#xff0c; 标志事务的开启命令&#xff1a;BEGIN 或 START TRANSACTION 提交事务&#xff1a;Commit Transaction 成功的结束&#xff0c;将所有的DML语句操作历史记录…

G2O学习使用

g2o全称是General Graph Optimization&#xff0c;也就是图优化&#xff0c;我们在做SLAM后端或者更加常见的任何优化问题&#xff08;曲线拟合&#xff09;都可以使用G2O进行处理。 就经验而言&#xff0c;solvers给人的感觉是大同小异&#xff0c;而 types 的选取&#xff0…

C语言小游戏——扫雷

前言 结合前边我们所学的C语言知识&#xff0c;本期我们将使用C语言实现一个简单的小游戏——扫雷 目录 前言 总体框架设计 多文件分装程序 各功能模块化实现 初始化棋盘 棋盘打印 埋雷 判赢与排雷 游戏逻辑安排 总结 总体框架设计 和三子棋相同&#xff0c;游戏开始时…

32岁测试工程师,陷入中年危机,最终我裸辞了....

前言 今年32岁&#xff0c;我从公司离职了&#xff0c;是裸辞。 前段时间&#xff0c;我有一件事情一直憋在心里很难受&#xff0c;想了很久也没找到合适的人倾诉&#xff0c;就借着今天写出来。 我一个十几年IT经验&#xff0c;七年测试经验的职场老人&#xff0c;我慢慢涨…

02 Android开机启动之BootLoader及kernel的启动

Android开机启动之BootLoader及kernel的启动 1、booloader的启动流程 第一阶段:硬件初始化,SVC模式,关闭中断,关闭看门狗,初始化栈,进入C代码 第二阶段:cpu/board/中断初始化;初始化内存以及flash,将kernel从flash中拷贝到内存中,执行bootm,启动内核 2、kernel的启…

学习如何将Jenkins与UI测试报告完美整合,事半功倍,轻松获取高薪职位!

目录 引言 &#xff08;一&#xff09;在本地整合出报告 1.在cmd分别安装pytest和allure-pytest 2.进入需要执行的代码所在的路径 3.运行测试报告&#xff0c;代码如下 4.解析此json文件&#xff0c;代码如下&#xff08;新打开cmd进入路径&#xff09; 5.打开此HTML文件…

包管理工具

包 package&#xff0c;代表了一组特定功能的源码集合。 包管理工具 管理包的应用软件&#xff0c;可以对包进行下载安装、更新、删除、上传等操作。 借助包管理工具&#xff0c;可以快速开发项目&#xff0c;提升开发效率。 常用包管理工具 npm&#xff08;nodejs官方内…