# map_explore_server **Repository Path**: CeasarSmj/map_explore_server ## Basic Information - **Project Name**: map_explore_server - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-24 - **Last Updated**: 2026-01-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 地图探索/巡视项目 本项目用于完成一个地图探索巡视项目,实现多机在地图中同时移动和协同探索。 参考项目:https://github.com/Robotics-STAR-Lab/RACER?tab=readme-ov-file ## 实验启动 1. 打开机器人端上的导航系统: `bash allrun.sh` 2. 服务器端上启动server脚本: `bash main.py` 3. 机器人端上打开client脚本: `bash client_node.py` ## 环境 - python.x - networkx - open3d - tqdm - ros noetic ## 快速启动 0. 下载项目 ```bash git clone https://gitee.com/CeasarSmj/map_explore_server ``` 1. 本项目自带示例地图,执行下面的指令生成 ```bash python map_generate/pgm2pcd.py python map_generate/map_discretize.py ``` 1. 用两个 shell 启动测试主程序 ```bash python test_main.py python simulate_client.py ``` ## 简述 功能模块包括: - 地图处理模块 - 点云转平面图 pcd to pgm : 思路和一般的 ros 中的处理方式类似 - 平面图离散化 : 参考项目 https://gitee.com/CeasarSmj/pur_game_server_x 中的策略 - 平面图转点云 : 根据手绘的平面地图生成点云 PCD - 仿真模块 - 写一个脚本来模拟多个机器人在地图中的移动和导航行为 - 写一个脚本来模拟雷达扫描(根据FOV来从地图中截取一部分点云) - 随机探索策略调试,用于让机器人在地图中随机向相邻节点移动 - 通信模块 - 实现 server 和 client 之间互相通信,发送坐标/扫描到的点云/导航目标点信息 - 分别写 server 类和 client 类来实现数据通信 - ros noetic 节点 client_node 用于订阅点云/坐标信息和发布导航点信息,实现指令中继 - python通信节点来封装 client 类 + 模拟机器人进程用于测试流 - 可视化 - ui.py - 测试流主进程 - 实验流主进程 ## 文件结构 ``` map_explore_project |- datas # 存放地图数据 |- policy # 存放探索策略 |- map_generate | |- pcd2pgm.py # 点云转平面图 | |- png2pcd.py # 平面图转点云 | |- map_discretize.py # 平面图离散化,生成 yaml ={nodes:[[x,y,z]] , edges:[[node1_index,node2_index]]} + points.txt + adjmatrix.txt | |- pgm_png_trans.py # png 和 pgm 之间相互转化 |- simulate | |- simulate_robot.py # 模拟机器人在地图中移动,作用是管理[x,y,z,yaw] 四个值,遵守设定的参数在地图中平滑移动 | |- simulate_lidar.py # 模拟雷达扫描,作用是读取pcd,并根据输入的位姿来截取设定FOV内的点云,主要问题在于处理遮挡关系 | |- random_explore.py # 随机探索策略,作用是随机选择一个相邻节点,并返回该节点的坐标 |- communicate | |- server_client.py # 实现 server 和 client 类,用于数据通信 | |- client_node.py # 订阅点云/坐标信息,发布导航点信息,实现指令中继 (ros noetic 节点) | |- simulate_client.py # 模拟机器人进程,用于测试流 |- test_main.py |- main_ui.py |- main_common.py |- main.py |- README.md ``` ## 地图文件格式说明 ### 手绘 PNG 地图 用于转为 PCD 的 PNG 地图中,墙壁使用红色,底面使用蓝色来绘制。 由pgm_png_trans.py生成的PNG地图为pgm转来的,为普通地图。 ### PCD PCD (Point Cloud Data) 文件是Open3D格式的3D点云地图,用于表示墙壁和地面。每个点包含[x, y, z]坐标: - 墙壁点:z ∈ [0, wall_height] (默认1.0),基于PNG红色像素采样,密度由pixel_density控制(默认2000点/像素)。 - 地面点:z ∈ [0, plane_height] (默认0.05),基于PNG蓝色像素采样。 - 示例头格式: ``` # .PCD v0.7 - Point Cloud Data file format VERSION 0.7 FIELDS x y z SIZE 4 4 4 TYPE F F F COUNT 1 1 1 WIDTH N # N为总点数 HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS N DATA ascii # 或 binary ``` - 数据行:`x y z` (ASCII) 或二进制浮点。文件路径示例:`datas/map2.pcd`。 ### PGM + YAML 标准ROS OccupancyGrid地图格式: - **PGM**:灰度图像文件 (P5二进制格式),分辨率由YAML指定。像素值: - 0:障碍物/墙壁。 - 255:空闲/地面。 - 128:未知区域。 - 示例头:`P5\n{width} {height}\n255\n`,后跟像素字节。 - **YAML**:元数据文件,包含: ```yaml image: map2.pgm # PGM文件名 resolution: 0.05 # 米/像素 origin: [0.0, 0.0, 0.0] # [x, y, yaw] 世界坐标原点 occupied_thresh: 0.65 # 占用阈值 free_thresh: 0.196 # 空闲阈值 negate: 0 # 反转标志 ``` - 文件路径示例:`datas/map2.pgm` 和 `datas/map2.yaml`。用于ROS导航栈加载2D地图。 ### Graph.yaml 离散化后的图结构文件(YAML格式),表示地图的可行走区域节点和边: ```yaml nodes: [[x1, y1, 0.0], [x2, y2, 0.0], ...] # 节点世界坐标列表,z默认为0 edges: [[0, 1], [1, 2], ...] # 无向边索引对,支持LOS(视线)增强 ``` - 节点:均匀分布在空闲区域,坐标基于YAML origin和resolution转换。 - 边:基于像素连通性和LOS检查生成,确保路径可行。 - 文件路径示例:`datas/map2_graph.yaml`。用于路径规划算法(如A*)。 ### adjmatrix.txt + points.txt 文本格式的图表示,便于NetworkX或其他图库加载: - **points.txt**:节点坐标,每行`x y` (世界坐标,z省略)。 - 示例: ``` 0.5 1.2 1.0 2.3 ... ``` - **adjmatrix.txt**:邻接矩阵,第一行`N` (节点数),后跟N×N整数矩阵 (1=相连, 0=无边,对角线为1)。 - 示例: ``` 3 1 1 0 1 1 1 0 1 1 ``` - 文件路径示例:`datas/map2_points.txt` 和 `datas/map2_adj_matrix.txt`。用于快速图构建和可视化。