未知环境探索(二)基于边界点的自主环境探索

(一)探索导向点指引下的环境探索

通过对环境的分析,相应的信息处理,提取出引导机器人完全探索一系列未知环境的目标点

探索导向点的提取:

获取激光数据——>提取运动目标点——>探索决策树——>有限的时间内构建出完整或近似完整的环境地图。


几种方法的简单介绍:(力求大体上能懂,最好能实现出来)

1.A Frontier-Based Approach for Autonomous Exploration

检测open space 与 unexplore space 边界点。(这个问题的前期问题就是沿墙移动。在这之前,只能依靠沿墙移动的方式先大致的探索一个图。或者是在环境完全由直线的墙、走廊,圆形的会议室等的环境下探索)

解决的环境:复杂环境下的探索策略。基于栅格地图。证据格方法。

探索解决的关键问题是:Given what you know about the world, where should you move to gain as much new information as possible? 

解决的方式:To gain the most new information about the world, move to the boundary between open space and uncharted territory.

①建立证据格

open:occupancy probability (存在概率)<prior probability(先验概率)

unknown:存在概率等于先验概率

occupied:存在概率大于先验概率

(我的理解是,先验概率是0.5.当前有物体障碍存在概率为1.无则存在概率为0)

                                                       

(a)    证据格                                                                          (b)   边界 (有障碍物的地方不在运动目标的障碍物内                        (c )最小的边界区域


图(c)中0和1对应的是打开的门,2对应的是测不到的走廊尽头。

open space 与unknown space的边界标记为 frontier edge cell,这些cells聚类能形成一个小的区域。这个区域只要大于机器人的尺寸(被定义为最小所需区域),这个区域中点被认为是目标点。

找到目标点之后,机器人向没有访问过的目标点中最近的点移动。

每访问过一个目标点,就将该点加入进已访问的链表。并生成新的证据格。

如果一段时间后仍无法到达边界目标点,则将该点加入list of inaccessible frontiers。再次360扫描,朝下一点走去。


实验:

配有1个激光测距仪、16个声呐传感器、16个红外传感器的机器人。三传感器结合构建证据格,在很近的距离(低于16英寸)完全用红外传感器替代。

红外与声呐主要是用于避障。

以下:占据率较低的为白色空格;占据率未知的为小点;被占据的是黑色大点。

                                                           

(a)robot从走廊中间开始,发现3个目标点,朝最近的1去                      (b)update证据格,发现2个目标点,朝近处的0去。

                                          

(e)发现6个目标点,但是最近的两个去不了(在桌椅脚)                                      (f)半小时地图建成。所有目标点检测完成,剩下的都是不可到达的。


2. 基于RRT的搜索策略

The SRT Method:  Randomized strategies for exploration

to  be continue......




  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个简单的未知环境机器人探索的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 5 // 地图行数 #define COL 5 // 地图列数 typedef struct { int x; // 机器人当前所在的行 int y; // 机器人当前所在的列 } Robot; typedef struct { int x; // 物品所在的行 int y; // 物品所在的列 } Item; void init_map(int map[][COL], Robot *robot, Item *item); void print_map(int map[][COL], Robot *robot, Item *item); void move_up(int map[][COL], Robot *robot); void move_down(int map[][COL], Robot *robot); void move_left(int map[][COL], Robot *robot); void move_right(int map[][COL], Robot *robot); int main(void) { int map[ROW][COL] = {0}; // 地图,0 表示未探索的区域,1 表示已探索的区域 Robot robot = {0}; // 机器人初始位置 Item item = {0}; // 物品位置 init_map(map, &robot, &item); // 初始化地图机器人和物品的位置 printf("Start exploring...\n"); while (robot.x != item.x || robot.y != item.y) { // 当机器人找到物品时停止探索 print_map(map, &robot, &item); // 输出当前地图状态 int direction = rand() % 4; // 随机选择一个方向 switch (direction) { case 0: move_up(map, &robot); break; case 1: move_down(map, &robot); break; case 2: move_left(map, &robot); break; case 3: move_right(map, &robot); break; default: break; } } printf("Find the item at (%d, %d)!\n", item.x, item.y); return 0; } // 初始化地图机器人和物品的位置 void init_map(int map[][COL], Robot *robot, Item *item) { srand((unsigned)time(NULL)); // 初始化随机数生成器 int x, y; do { x = rand() % ROW; // 随机生成物品所在的行 y = rand() % COL; // 随机生成物品所在的列 } while (x == 0 && y == 0); // 物品位置不能与机器人初始位置重合 map[x][y] = 1; // 标记物品所在位置已探索 item->x = x; item->y = y; } // 输出当前地图状态 void print_map(int map[][COL], Robot *robot, Item *item) { printf("Robot is at (%d, %d)\n", robot->x, robot->y); printf("Item is at (%d, %d)\n", item->x, item->y); printf("Current map:\n"); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (robot->x == i && robot->y == j) { printf("R "); // 机器人位置用 R 表示 } else if (item->x == i && item->y == j) { printf("I "); // 物品位置用 I 表示 } else if (map[i][j] == 1) { printf(". "); // 已探索的区域用 . 表示 } else { printf("? "); // 未探索的区域用 ? 表示 } } printf("\n"); } } // 向上移动机器人 void move_up(int map[][COL], Robot *robot) { if (robot->x > 0) { // 判断是否到达地图边界 robot->x--; map[robot->x][robot->y] = 1; // 标记当前位置已探索 } } // 向下移动机器人 void move_down(int map[][COL], Robot *robot) { if (robot->x < ROW - 1) { // 判断是否到达地图边界 robot->x++; map[robot->x][robot->y] = 1; // 标记当前位置已探索 } } // 向左移动机器人 void move_left(int map[][COL], Robot *robot) { if (robot->y > 0) { // 判断是否到达地图边界 robot->y--; map[robot->x][robot->y] = 1; // 标记当前位置已探索 } } // 向右移动机器人 void move_right(int map[][COL], Robot *robot) { if (robot->y < COL - 1) { // 判断是否到达地图边界 robot->y++; map[robot->x][robot->y] = 1; // 标记当前位置已探索 } } ``` 这个代码示例使用随机数生成器模拟机器人未知环境中的探索过程,每次随机选择一个方向进行移动,直到机器人找到物品为止。在代码中,0 表示未探索的区域,1 表示已探索的区域,? 表示未知的区域,R 表示机器人的位置,I 表示物品的位置。可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值