(9-2-03)自动驾驶中基于概率采样的路径规划:基于Gazebo仿真的路径规划系统(3)

9.3.5 解析SDF 文件

SDF 文件是指 Simulation Description Format 文件,是一种用于描述仿真环境、机器人、传感器和其他相关信息的文件格式。它通常用于机器人领域中的仿真和控制任务。SDF 文件使用 XML(可扩展标记语言)格式,因此它可以包含层次结构、标签和属性,以清晰地描述各种对象的特性和关系。在机器人仿真中,SDF 文件常用于描述仿真世界中的物体、地形、障碍物、传感器等。

文件sdf_reader.py实现了一个名为 SDFReader 的类,用于解析包含障碍物信息的 SDF(Simulation Description Format)文件。该类使用库xml.etree.ElementTree来解析 XML 格式的 SDF 文件,并使用 numpy 来处理数据。

import xml.etree.ElementTree as ET from typing import Optional, List, Tuple, Union import numpy as np from numpy import ndarray class SDFReader: def __init__(self): self.tree = None self.root = None def parse(self, filepath: str) -> None: """ Parse file to tree """ if filepath is None: return filepath self.tree = ET.parse(filepath) self.root = self.tree.getroot() def get_obstacles(self): if self.tree is None: return None data = self.root.findall(".//visual/*[cylinder]/..") poses = np.array([np.array(list(map(float, child[0].text.split(" ")))) for child in data], dtype=object) radia = np.array([float(child[1][0][0].text) for child in data], dtype=object) pose_radia = list(zip(poses, radia)) obstacles = np.array([[np.array([obstacle[0][0], obstacle[0][1]]), obstacle[1]] for obstacle in pose_radia], dtype=object) x = poses[:, 0] * 100 y = poses[:, 1] * 100 x_range = [np.min(x) - 100, np.max(x) + 100] y_range = [np.min(y) - 100, np.max(y) + 100] return obstacles, (x_range, y_range)

对上述代码的具体说明如下所示。

  1. parse 方法用于解析 SDF 文件并构建相应的树结构。
  2. get_obstacles 方法从解析后的 SDF 文件中提取障碍物信息,返回障碍物的位置和半径,并计算出障碍物在 X 和 Y 轴上的范围。

9.3.6 主程序

文件main.py主要实现了从SDF文件中解析出障碍物的位置和大小,并利用RRT、RRT和RRT_FN算法在给定地图上规划路径。通过解析SDF文件,创建了一个地图对象,然后在该地图上使用RRT系列算法寻找从起始点到目标点的路径,并绘制出路径和地图的可视化结果。

class SDFReader: def __init__(self): self.tree = None self.root = None def parse(self, filepath: str) -> None: """ 解析文件并构建树 """ if filepath is None: return filepath self.tree = ET.parse(filepath) self.root = self.tree.getroot() def get_obstacles(self): if self.tree is None: return None data = self.root.findall(".//visual/*[cylinder]/..") poses = np.array([np.array(list(map(float, child[0].text.split(" ")))) for child in data], dtype=object) radia = np.array([float(child[1][0][0].text) for child in data], dtype=object) pose_radia = list(zip(poses, radia)) obstacles = np.array([[np.array([obstacle[0][0], obstacle[0][1]]), obstacle[1]] for obstacle in pose_radia], dtype=object) x = poses[:, 0] * 100 y = poses[:, 1] * 100 x_range = [np.min(x) - 100, np.max(x) + 100] y_range = [np.min(y) - 100, np.max(y) + 100] return obstacles, (x_range, y_range) NODE_RADIUS = 20 import warnings import matplotlib.pyplot as plt import random from algorithm import RRT, RRT_star, RRT_star_FN from graph import Graph, OutOfBoundsException from map import Map from sdf_reader import SDFReader warnings.filterwarnings("error") import matplotlib matplotlib.use('TkAgg') def plot_graph(graph: Graph, obstacles: list, xy_range: tuple = None): """ 绘制图形和障碍物。 :param graph: 要绘制的图形 :param obstacles: 障碍物列表 :param xy_range: x和y轴范围的元组 """ xes = [pos[0] for id, pos in graph.vertices.items()] yes = [pos[1] for id, pos in graph.vertices.items()] plt.scatter(xes, yes, c='gray') # 绘制节点 plt.scatter(graph.start[0], graph.start[1], c='#49ab1f', s=50) plt.scatter(graph.goal[0], graph.goal[1], c='red', s=50) edges = [(graph.vertices[id_ver], graph.vertices[child]) for pos_ver, id_ver in graph.id_vertex.items() for child in graph.children[id_ver]] for edge in edges: plt.plot([edge[0][0], edge[1][0]], [edge[0][1], edge[1][1]], c='black', alpha=0.5) # 绘制障碍物 plt.gca().set_aspect('equal', adjustable='box') for obstacle in obstacles: circle = plt.Circle(obstacle[0], obstacle[1], color='black') plt.gca().add_patch(circle) if xy_range is not None: plt.xlim(xy_range[0][0], xy_range[0][1]) plt.ylim(xy_range[1][0], xy_range[1][1]) else: plt.xlim(0, graph.width) plt.ylim(0, graph.height) if __name__ == '__main__': filepath = "/home/grzesiek/turtlebot3_ws/src/turtlebot3_simulations/turtlebot3_gazebo/models/turtlebot3_world/model.sdf" reader = SDFReader() reader.parse(filepath) obstacles, xy_range = reader.get_obstacles() map_width = 200 map_height = 200 start_node = (random.uniform(xy_range[0][0], xy_range[0][1]), random.uniform(xy_range[1][0], xy_range[1][1])) goal_node = (random.uniform(xy_range[0][0], xy_range[0][1]), random.uniform(xy_range[1][0], xy_range[1][1])) my_map = Map((map_width, map_height), start_node, goal_node, NODE_RADIUS) my_map.add_obstacles(obstacles * 100) G = Graph(start_node, goal_node, map_width, map_height, xy_range) iteration = RRT(G, iter_num=500, map=my_map, step_length=25, node_radius=NODE_RADIUS, bias=0) plot_graph(G, my_map.obstacles_c, xy_range) print(f"RRT algorithm stopped at iteration number: {iteration}") plt.show() G = Graph(start_node, goal_node, map_width, map_height, xy_range) iteration, _ = RRT_star(G, iter_num=500, map=my_map, step_length=25, radius=50, node_radius=NODE_RADIUS, bias=0.01) print(f"RRT_star algorithm stopped at iteration number: {iteration}") plot_graph(G, my_map.obstacles_c, xy_range) plt.show() G = Graph(start_node, goal_node, map_width, map_height, xy_range) iteration, _ = RRT_star_FN(G, iter_num=2000, map=my_map, step_length=35, radius=50

在运行本项目前需要使用Gazebo仿真器中创建一个模拟环境,然后运行上面的主程序文件main.py进行测试。执行后会可视化展示RRT、RRT*和RRT*-FN算法的路径规划信息,并展示所消耗的时间。如图9-5所示。

图9-5 路径规划可视

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

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

相关文章

【Java毕设全套源码+文档】基于springboot的郑州旅游景点智能推荐系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

HMC349AMS8GETR,高线性度与高功率处理的射频开关

型号介绍今天我要向大家介绍的是 Analog Devices 的一款射频开关——HMC349AMS8GETR。 它拥有极低的插入损耗,仅为 0.9 dB 至 2 GHz,这意味着它能够以极高的效率传输信号,就像一条高速公路,让信号畅通无阻。同时,它还拥…

在CentOS上快速安装NVM和Node.js 14:完整指南与优化方案

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱个人微信&a…

【Java毕设全套源码+文档】基于springboot的智慧农业专家远程指导系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【Java毕设全套源码+文档】基于springboot的智慧物业服务系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

强烈安利!MBA必看TOP10 AI论文软件测评

强烈安利!MBA必看TOP10 AI论文软件测评 2026年MBA学术写作工具测评:为何值得一看? 在MBA学习与研究过程中,撰写高质量论文是不可避免的挑战。随着AI技术的不断进步,各类AI论文辅助工具层出不穷,但如何选择真…

通孔PCB钻孔精度如何按IPC标准把控钻孔工艺?

核心问题:通孔 PCB 的钻孔精度直接影响后续焊接和导通性能,到底该怎么控制?IPC 标准对钻孔精度有哪些明确要求?​在通孔 PCB 制造流程中,钻孔是第一道核心制程,也是决定板子良率的关键环节。所谓钻孔精度&a…

mklink创建虚拟目录,虚拟文件夹,权限要求和网络共享相关

你想确认 mklink 操作文件时是否和网络共享无关,以及是否无需关注权限和参数,答案是:mklink 与网络共享有直接关联,且权限、参数都必须严格管控,完全不管会导致操作失败或创建的链接无法正常访问。一、核心结论&#x…

解锁学术新技能:书匠策AI带你玩转文献综述魔法

在学术研究的广阔天地里,文献综述如同一座桥梁,连接着前人的智慧与后人的探索。它不仅是对已有研究的系统梳理,更是为新研究指明方向的灯塔。然而,面对浩如烟海的文献,如何高效、精准地完成一篇高质量的文献综述&#…

告别传统合同管理,智能合同系统助力企业高效发展

智能合同系统,为企业合同管理上一把安全锁在当今数字化时代,企业的合同管理面临着诸多挑战。传统的合同管理方式往往存在效率低下、容易出错、安全风险高等问题。而智能合同系统的出现,为企业合同管理带来了全新的解决方案,就像为…

基于Simulink的储能SOC均衡控制策略仿真

目录 手把手教你学Simulink 一、引言:为什么储能系统需要“SOC均衡”? 二、系统整体架构 控制层级: 三、理论基础:SOC 均衡策略 1. 被动均衡(Passive) 2. 主动均衡(Active) 四…

【建议收藏】AI智能体架构全解析:9大核心技术,大模型开发者必学指南

2025年,AI智能体已经不再是概念模型,它们正在逐步落地为企业级工具、产品模块,甚至成为工作流的“第二大脑”。 而在这背后,一整套系统化的智能体架构,正悄然决定着这些Agent的效率、扩展性与演化方向。如果说大语言模…

基于Simulink的微电网并网/孤岛无缝切换控制仿真

目录 手把手教你学Simulink 一、引言:为什么“无缝切换”是微电网的核心技术? 二、系统整体架构 控制策略: 三、关键模块1:双模式逆变器控制器设计 1. PQ 控制(并网模式) 2. V/f 控制(孤岛…

解决LLM在法律领域的应用困境:RAG系统实战开发与经验分享(值得收藏)

最近我和一个律师亲戚聊AI时,问了我应该怎么对现在律师事务所庞大的文档做AI检索,从技术上讲用现在的LLMRAG可以满足需求,但细想不太对劲,因为这里面涉及到很多专业知识,还有律师的专有思维路径,一个不懂律…

顶刊Nature测评推荐:TOP5学术AI大模型,不同科研场景如何选择如何使用?

现在的AI发展太快了,对于我们做学术搞研究的同仁来说的确是大好事,但如果我们花费大量时间在纠结选择以及自我困难化AI的学习,把AI的学习和使用当成是独立的另外一个学科来对待,花费大量时间去学习去研究,反而会浪费很多时间,效果也并不会好。 以七哥的使用经验,建议是…

通孔金属化选化学电镀还是物理沉积?

通孔金属化是实现层间导通的关键步骤,化学电镀和物理沉积两种方案有啥区别?新型无化学药水工艺真的比传统湿法更靠谱吗?通孔 PCB 的非金属孔壁本身不导电,必须通过金属化处理,在孔壁沉积一层铜,才能实现多层…

通孔PCB电镀铜厚如何实现铜厚一致性?

通孔 PCB 电镀铜厚不均匀会导致哪些问题?怎么才能让孔壁和板面的铜厚都符合 IPC 标准,实现均匀一致?在通孔 PCB 制造中,电镀铜是继化学沉铜之后的关键步骤,目的是将孔壁和板面的铜层加厚到客户要求的厚度(常…

代码随想录刷题——二叉树篇(阶段总结二)

其他: 1.二叉树的递归与回溯,代表题目257. 二叉树的所有路径 个人理解递归中的回溯本质上是在 递归前准备一个变量 递归中使用这个变量 递归后复原这个变量 拿这道题来说的话如下图: 2.题目404. 左叶子之和提供了判断左叶子的方式&#xff1a…

【值得收藏】RAG技术先驱亲授:企业级AI落地的十大实战经验

本文为大家解读Contextual AI 联合创始人兼CEO,也是著名的RAG技术先驱,Douwe Kiela 分享的他在企业级 RAG 系统实施与落地中的十大经验教训 。 本次分享主要针对企业AI系统转化为商业价值的关键难题:根据麦肯锡的估计,当前企业AI总…

[大模型架构] LangGraph AI 工作流编排(20)

一、多智能体协作的核心价值与设计原则视频首先明确 “多智能体协作” 的本质是 “将复杂任务拆解为子任务,分配给具备专业能力的智能体,通过标准化通信实现协同完成目标”,核心价值与设计原则如下:(一)核心…