利用深度学习优化机器人信息路径规划

需积分: 17 0 下载量 103 浏览量 更新于2025-01-05 收藏 71.64MB ZIP 举报
资源摘要信息:"该资源是一个关于机器人顺序决策和信息性路径规划的作业项目,名为'rob534_SDM_hw2_optimization_dl_inforative_path_planning'。该项目要求学生使用Python编程语言来实现一个机器人导航系统,该系统将基于MNIST数据集构建的地图进行优化路径规划。MNIST数据集包含手写数字图片,本项目将这些数字映射到一个28x28的网格世界中,让机器人从起点(0,0)导航到由数字决定的目标位置。目标位置根据数字的不同而变化,例如数字0-2对应的目标位置是(0,27),数字3-5对应的目标位置是(27,27),数字6-9对应的目标位置是(27,0)。机器人每次可以移动一个单元格,并且能够感知访问过的空间的价值。若机器人移动到错误的目标,会受到-1或-400的惩罚,而成功到达目标则会得到100的奖励。为了帮助机器人进行决策,提供了两个预训练的神经网络:一个用于估算世界状态,另一个用于估算世界所属的数字类别。项目的编写环境为Python 3.6.5,并且需要Python 3.5+版本(建议使用Anaconda进行安装)。项目依赖于PyTorch库,该库可以在PyTorch官方网站上找到并安装。" 知识点: 1. 机器人顺序决策: 顺序决策是指机器人在一系列的选择中,根据当前的状态和环境信息,逐步作出决策以达到最终目标的过程。在本项目中,顺序决策涉及到机器人如何根据所占据的网格世界,一步步规划路径到达目标位置。 2. 信息性路径规划: 信息性路径规划是一种优化方法,旨在通过有效利用环境信息,减少机器人在执行任务过程中的不确定性。本项目的路径规划需要机器人了解当前环境,并做出信息驱动的决策,以最少的步数和最小的代价(即负奖励)抵达目标位置。 3. MNIST数据集: MNIST数据集是一个包含手写数字的大型数据库,广泛用于训练各种图像处理系统。数据集中的图片被标准化到一个28x28像素的灰度图像,用于机器学习和计算机视觉领域中的模式识别。在本项目中,MNIST数据集被用来定义一个28x28网格世界中的目标位置。 4. Python编程: Python是一种广泛应用于科学计算、数据分析、人工智能等领域的高级编程语言。本项目的实现语言是Python 3.6.5,它提供了丰富的库和框架,能够高效地处理复杂的算法和数据结构。 5. Python环境管理: 项目建议使用Anaconda作为Python环境管理工具。Anaconda是一个开源的Python分发版,包含了包管理器conda和一系列预装的科学计算包。Anaconda简化了依赖项的管理和虚拟环境的创建,是数据科学家和机器学习工程师常用的一个工具。 6. PyTorch: PyTorch是一个开源的机器学习库,它广泛用于计算机视觉和自然语言处理等任务。它提供了一个动态计算图(称为autograd系统),非常适合研究和实现深度学习算法。项目中提到的两个预训练神经网络就是基于PyTorch框架实现的。 7. 神经网络与路径规划: 在本项目中,两个预训练的神经网络分别用于估算当前世界的状态和预测世界所属的数字。这种结合神经网络进行路径规划的方法体现了人工智能在机器人导航和决策中的应用,其中深度学习技术帮助机器人更好地理解和预测环境,从而做出更准确的决策。 8. 负奖励机制: 在路径规划和机器人决策中,负奖励机制用来惩罚不利于达到目标的行为,例如移动到错误的目标位置。通过设计合适的奖励机制,可以引导机器人采取合理的行动,避免进行无效率或者错误的决策,从而提高路径规划的有效性和效率。 通过这个项目,学生可以学习到如何将机器学习、深度学习技术与机器人路径规划相结合,解决现实世界中的复杂导航问题。同时,项目也涉及到编程实践、环境配置、算法设计等多个方面的技能。

Sdm_so_node_A.cpp #include <iostream> #include <unordered_map> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <memory> #include <verilated_vcs_c.h> #include "VA_top.h" #include "sdm_config.h" #include "Sdm_node_A.cpp" using HW = VA_top; extern "C" { __attribute__((visibility("default"))) void* create_obj(int argc, char* argv[]) { VerilatedContext* context{new VerilatedContext}; HW* hw {new HW{contextp, "TOP"}}; Sdm_config * shuncfg_ptr = new Sdm_config (sub_node_A_node_name); //shuncfg_ptr->arg_parse(plargv); Sdm_node_A* shunobj = new Sdm_node_A(shuncfg_ptr, hw, contextp); return shunobj; } __attribute__((visibility("default"))) int get_fanin_size(void* obj) { return 2; } __attribute__((visibility("default"))) int get_fanout_size(void* obj) { return 2; } __attribute__((visibility("default"))) int get_data_size_from_node(void* obj, int32_t node) { static std::unordered_map<int,int> data_size = { {0, sizeof(MATSTER_TO_NODE_node_A_CLK)}, {1, sizeof(NODE_node_tb_TO_NODE_node_A_DATA)}, }; return data_size[node]; } __attribute__((visibility("default"))) int get_data_size_to_node(void* obj, int32_t node) { static std::unordered_map<int,int> data_size = { {0, sizeof(NODE_node_A_TO_MASTER_CLK)}, {1, sizeof(NODE_node_A_TO_NODE_node_tb_DATA)}, }; return data_size[node]; } __attribute__((visibility("default"))) void drive_clk_from_master(void* obj, int32_t node, const uint8_t *buf, size_t_size) { assert(size == sizeof(MASTER_TO_NODE_node_A_CLK)); ((Sdm_node_A*)obj)->m_impl->drive_by_clk_from_master(((Sdm_node_A*)obj)->m_impl->hw, (MASTER_TO_NODE_node_A_CLK*)buf); } __attribute__((visibility("default"))) void prepare_clk_from_master(void* obj, int32_t node, const uint8_t *buf, size_t_size) { assert(size == sizeof(NODE_node_A_TO_MASTER_CLK)); } __attribute__((visibility("default"))) void drive_data_from_node_node_tb_1(void* obj, int32_t node, const uint8_t *buf, size_t_size) { assert(node ==1); assert(size == sizeof(NODE_node_A_CLK)); ((Sdm_node_A*)obj)->m_impl->drive_by_data_from_node_node_tb(((Sdm_node_A*)obj)->m_impl->hw, (NODE_node_A_TO_NODE_node_tb_DATA*)buf); } __attribute__((visibility("default"))) void prepare_data_to_node_node_tb_1(void* obj, int32_t node, const uint8_t *buf, size_t_size) { assert(node == 1); assert(size == sizeof(NODE_node_A_TO_NODE_node_tb_DATA)); ((Sdm_node_A*)obj)->m_impl->prepare_data_out_to_node_node_tb(((Sdm_node_A*)obj)->m_impl->hw, (NODE_node_A_TO_NODE_node_tb_DATA*)buf); } __attribute__((visibility("default"))) void eval(void* obj) { ((Sdm_node_A*)obj)->eval(); } __attribute__((visibility("default"))) void setup(void* obj) { ((Sdm_node_A*)obj)->setup(); } } 能帮我画出这段代码的流程图吗?

153 浏览量

// >>> common include #include <iostream> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> // >>> verilator #include <memory> #include <verilated.h> #include <verilated_vcd_c.h> #include "VA_top.h" #include "sdm_config.h" #include "Sdm_node_A.h" using HW =VA_top; uint64_t GlobalMainTime = 0; int main(int argc, char** argv, char**env) { const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext}; const std::unique_ptr<HW> hw {new HW{contextp.get(), "TOP"}}; Sdm_config * shuncfg_ptr = new Sdm_config (sub_node_A_node_name); shuncfg_ptr->arg_parse (argc, argv); Sdm_node_A shunobj (shuncfg_ptr, hw.get(), contextp.get()); Verilated::mkdir("node_node_A_logs"); contextp->debug(0); contextp->randReset(2); contextp->commandArgs(argc, argv); #if VM_TRACE == 1 VerilatedVcdC* tgp = NULL; const char* flag = Verilated::commandArgsPlusMatch("trace"); if (flag && 0 ==strcmp(flag, "+trace")) { Info("Enter Trace!"); contextp->traceEverOn(true); tfp = new VerilatedVcdC; hw->trace(tfp,99); shunobj.fulleval(); std::string filename = shuncfg_ptr->dumpfile(); tfp->open(filename.c_str()); }; #endif shunobj.setup(); bool retmp; int loop = 0; while(1) { //Info("loop %d", loop); shunobj.update(); if (shunobj.finish()) break; do { shunobj.eval(); shunobj.sync(); } while(!shunobj.converge()); #if VM_TRACE == 1 if (flag && 0 == strcmp(flag, "+trace")) { tfp->dump(contextp->time()); } #endif loop++; } hw->final(); return 0; #if VM_TRACE == 1 if (flag && 0 == strcmp(flag, "+trace")){ tfp->close(); } #endif #if VM_COVERAGE Verilated::mkdir("node_node_A_logs"); contextp->coverageep()->write("node_node_A_logs/coverage.dat"); #endif }

158 浏览量