当前位置: 首页 > news >正文

实体机器人识别虚拟环境中障碍物

之前的内容已经实现了虚拟机器人识别实体机器人的功能,接下来就是实体机器人如何识别虚拟环境中的障碍物(包括虚拟环境中的障碍物和其他虚拟机器人)。

我做的是基于雷达的,所以主要要处理的是雷达的scan话题

我的虚拟机器人命名空间在Vir_wheeltec_01下,实体机器人的命名空间在wheeltec_01下。

因此需要将虚拟机器人的雷达/Vir_wheeltec_01/scan 内容与/wheeltec_01/scan进行融合,由于虚拟机器人的雷达范围更大,因此融合的逻辑是以/wheeltec_01/scan作为掩模,把所有的障碍物都封存在新的雷达话题中/wheeltec_01/fused_scan,这一部分的功能封存在实体机器人的工作空间下的turn_on_wheeltec_robot功能包的scan_filter.py文件中

#!/usr/bin/env python
# -*- coding: utf-8 -*-import rospy
import math
from sensor_msgs.msg import LaserScan
from message_filters import ApproximateTimeSynchronizer, Subscriber
from threading import Lockclass ScanFusionNode:def __init__(self):# 初始化发布器self.fused_scan_pub = rospy.Publisher('/wheeltec_01/fused_scan', LaserScan, queue_size=10)# 创建时间同步器real_sub = Subscriber('/wheeltec_01/scan', LaserScan)virtual_sub = Subscriber('/Vir_wheeltec_01/scan', LaserScan)self.ts = ApproximateTimeSynchronizer([real_sub, virtual_sub], queue_size=5, slop=0.05)self.ts.registerCallback(self.sync_callback)rospy.loginfo("scan_filter node initialized")def sync_callback(self, real_scan, virtual_scan):try:fused_scan = self.fuse_scans(real_scan, virtual_scan)self.fused_scan_pub.publish(fused_scan)except Exception as e:rospy.logerr("Fusion error: %s", str(e))def fuse_scans(self, real_scan, virtual_scan):# 参数校验if not self.validate_scans(real_scan, virtual_scan):raise ValueError("Invalid scan parameters")# 创建融合后的消息fused_scan = LaserScan()fused_scan.header = real_scan.headerfused_scan.header.stamp = rospy.Time.now()fused_scan.angle_min = real_scan.angle_minfused_scan.angle_max = real_scan.angle_maxfused_scan.angle_increment = real_scan.angle_incrementfused_scan.time_increment = real_scan.time_incrementfused_scan.scan_time = real_scan.scan_timefused_scan.range_min = real_scan.range_minfused_scan.range_max = real_scan.range_max# 计算虚拟扫描角度步长virtual_angle_step = (virtual_scan.angle_max - virtual_scan.angle_min) / len(virtual_scan.ranges)# 执行融合fused_ranges = []for i in range(len(real_scan.ranges)):# 获取实体数据real_range = real_scan.ranges[i]# 映射到虚拟扫描索引current_angle = real_scan.angle_min + i * real_scan.angle_incrementvirtual_idx = int((current_angle - virtual_scan.angle_min) / virtual_angle_step)virtual_idx = max(0, min(virtual_idx, len(virtual_scan.ranges)-1))virtual_range = virtual_scan.ranges[virtual_idx]# 有效性检查if math.isnan(real_range) or math.isinf(real_range):real_range = fused_scan.range_maxif math.isnan(virtual_range) or math.isinf(virtual_range):virtual_range = fused_scan.range_max# 融合逻辑fused_range = min(real_range, virtual_range) if virtual_range <= fused_scan.range_max else real_rangefused_ranges.append(fused_range)fused_scan.ranges = fused_rangesreturn fused_scandef validate_scans(self, real_scan, virtual_scan):# 校验角度范围是否重叠if (real_scan.angle_min > virtual_scan.angle_max) or (real_scan.angle_max < virtual_scan.angle_min):rospy.logwarn("Scan angle ranges do not overlap!")return Falsereturn Trueif __name__ == '__main__':try:rospy.init_node('scan_filter')node = ScanFusionNode()rospy.spin()except rospy.ROSInterruptException:pass

接着就是基于这个话题去生成cost_map

找到costmap_car_params.yaml文件,修改如下(主要是添加fused_scan,因为小车中原来是没有这一段的,move_base默认就是基于scan话题生成costmap,所以要显式修改)

# 机器人外形设置参数,直接影响代价地图
footprint: [[-0.133, -0.125], [-0.133, 0.125], [0.133, 0.125], [0.133, -0.125]]# 设置膨胀层参数,根据obstacle_layer、static_layer和footprint生成代价地图
inflation_layer:enabled: true  # 是否开启膨胀层cost_scaling_factor: 15  # 代价地图数值随与障碍物距离下降的比值,越大会导致路径规划越靠近障碍物inflation_radius: 0.25  # 机器人膨胀半径,影响路径规划,单位:m# 激光扫描传感器配置,确保配置正确的缩进
observation_sources: laser_scan_sensor
laser_scan_sensor:data_type: LaserScantopic: /wheeltec_01/fused_scanmarking: trueclearing: true

 由于修改后move_base会基于fused_scan生成cosmap所以要在movebase节点启动前就生成fused_scan雷达信息还需要修改实体小车的启动文件wxfnavigation.launch(可以teb补全,因为具体的我忘记了),主要就是在启动雷达后加入(scan_filter.py要做成可执行文件 chomd +x 文件路径/文件名)

“<!-- 启动扫描数据融合节点 scan_filter.py -->
    <node name="scan_filter" pkg="your_package_name" type="scan_filter.py" output="screen">
      <remap from="scan" to="/wheeltec_01/scan" />
      <remap from="fused_scan" to="/wheeltec_01/fused_scan" />
    </node>”

<launch><!-- 使用命名空间 wheeltec_01 --><group ns="wheeltec_01"><!-- 开启机器人底层相关节点 同时开启导航功能 --><include file="$(find turn_on_wheeltec_robot)/launch/turn_on_wheeltec_robot.launch"><arg name="navigation" default="true"/></include><!-- turn on lidar 开启雷达 --><include file="$(find turn_on_wheeltec_robot)/launch/wheeltec_lidar.launch" /><!-- 启动扫描数据融合节点 scan_filter.py --><node name="scan_filter" pkg="your_package_name" type="scan_filter.py" output="screen"><remap from="scan" to="/wheeltec_01/scan" /><remap from="fused_scan" to="/wheeltec_01/fused_scan" /></node><!-- 设置需要用于导航的地图 --><arg name="map_file" default="$(find turn_on_wheeltec_robot)/map/WHEELTEC.yaml"/><node name="map_server_for_test" pkg="map_server" type="map_server" args="$(arg map_file)"/><!-- 开启用于导航的自适应蒙特卡洛定位 amcl --><include file="$(find turn_on_wheeltec_robot)/launch/include/amcl.launch" ><node pkg="tf" type="static_transform_publisher" name="wheeltec_world_to_global_01" args="-9 -4 0 0 0 0 world /map 100" /><!-- MarkerArray功能节点 --><node name='send_mark' pkg="turn_on_wheeltec_robot" type="send_mark.py"/><!-- move_base 节点检测 --><node name='node_detection' pkg="turn_on_wheeltec_robot" type="node_ping.py"><param name="node_name" type="string" value="/move_base"/></node></group> <!-- 结束命名空间 wheeltec_01 -->
</launch>

并且启动时,需要先在主机启动虚拟小车(gazebo)roslaunch wxfpublish testSimulation.launch

接着启动小车的导航文件roslaunch turn_on ... wxfnavigation.launch(可以teb补全,因为具体的我忘记了)

最终结果

此外地图文件更换成map,并且修改实体小车下map中的位置,把rviz中实体小车到world的映射改成0000就可以了

相关文章:

实体机器人识别虚拟环境中障碍物

之前的内容已经实现了虚拟机器人识别实体机器人的功能&#xff0c;接下来就是实体机器人如何识别虚拟环境中的障碍物&#xff08;包括虚拟环境中的障碍物和其他虚拟机器人&#xff09;。 我做的是基于雷达的&#xff0c;所以主要要处理的是雷达的scan话题 我的虚拟机器人命名…...

修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板

前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…...

Rk3568驱动开发_点亮led灯(手动挡)_5

1.MMU简介 完成虚拟空间到物理空间的映射 内存保护设立存储器的访问权限&#xff0c;设置虚拟存储空间的缓冲特性 stm32点灯可以直接操作寄存器&#xff0c;但是linux点灯不能直接访问寄存器&#xff0c;linux会使能mmu linux中操作的都是虚拟地址&#xff0c;要想访问物理地…...

十、大数据资源平台功能架构

一、大数据资源平台的功能架构图总体结构 大数据资源平台功能架构图 关键组件&#xff1a; 1.用户&#xff08;顶行&#xff09; 此部分标识与平台交互的各种利益相关者。 其中包括&#xff1a; 市领导 各部门分析师 区政府 外部组织 公民 开发人员 运营经理 2.功能模…...

LabVIEW不规则正弦波波峰波谷检测

在处理不规则正弦波信号时&#xff0c;准确检测波峰和波谷是分析和处理信号的关键任务。特别是在实验数据、传感器信号或其他非理想波形中&#xff0c;波峰和波谷的位置可以提供有价值的信息。然而&#xff0c;由于噪声干扰、信号畸变以及不规则性&#xff0c;波峰波谷的检测变…...

分布式主键生成服务

目录 一、使用线程安全的类——AtomicInteger或者AtomicLong 二、主键生成最简单写法(不推荐) 三、主键生成方法一&#xff1a;Long型id生成——雪花算法 四、主键生成方法二&#xff1a;流水号 (一)流水号概述 (二)添加配置 1.pom.xml 2.application.properties 3.创…...

如何通过网管提升运维效率?

网络系统在企业信息化系统扮演着越来越重要的作用&#xff0c;网络规模不断扩大&#xff0c;网络结构越来越复杂&#xff0c;传统的运维方式已经难以满足高效、稳定运行的要求。网管系统作为IT运维的重要工具&#xff0c;能够帮助企业实现网络的智能化管理&#xff0c;显著提升…...

(python)Arrow库使时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…...

机器学习数学基础:33.分半信度

分半信度&#xff08;Split-Half Reliability&#xff09;深度教程 专为零基础小白打造&#xff0c;全面掌握分半信度知识 一、深入理解分半信度 分半信度是一种用于评估测验内部一致性的重要方法&#xff0c;其核心思路在于将一个完整的测验拆分成两个部分&#xff0c;然后通…...

PyTorch 源码学习:GPU 内存管理之深入分析 CUDACachingAllocator

因引入 expandable_segments 机制&#xff0c;PyTorch 2.1.0 版本发生了较大变化。本文关注的是 PyTorch 原生的 GPU 内存管理机制&#xff0c;故研究的 PyTorch 版本为 2.0.0。代码地址&#xff1a; c10/cuda/CUDACachingAllocator.hc10/cuda/CUDACachingAllocator.cpp 更多内…...

0—QT ui界面一览

2025.2.26&#xff0c;感谢gpt4 1.控件盒子 1. Layouts&#xff08;布局&#xff09; 布局控件用于组织界面上的控件&#xff0c;确保它们的位置和排列方式合理。 Vertical Layout&#xff08;垂直布局&#xff09; &#xff1a;将控件按垂直方向排列。 建议&#xff1a;适…...

Jenkinsfile流水线构建教程

前言 Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等. 本文的主要目的是引导你快速熟悉 Jenkinsfile …...

flex布局自定义一行几栏,靠左对齐===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…...

开发HarmonyOS NEXT版五子棋游戏实战

大家好&#xff0c;我是 V 哥。首先要公布一个好消息&#xff0c;V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1&#xff1a;ArkTS 语言篇》图书终于出版了&#xff0c;有正在学习鸿蒙的兄弟可以关注一下&#xff0c;写书真是磨人&#xff0c;耗时半年之久&#xff0c;感概一下…...

AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构

前言 人工智能技术的爆发式发展催生了多样化的AI模型生态&#xff0c;从通用对话到垂直领域应用&#xff0c;从数据挖掘到创意生成&#xff0c;各模型凭借其独特的技术优势与场景适配性&#xff0c;正在重塑全球产业格局。本文将以DeepSeek、ChatGPT、XAI&#xff08;可解释人…...

大语言模型(LLM)微调技术笔记

图1&#xff1a;大模型进化树2 大模型微调 在预训练后&#xff0c;大模型可以获得解决各种任务的通用能力。然而&#xff0c;越来越多的研究表明&#xff0c;大语言模型的能力可以根据特定目标进一步调整。 这就是微调技术&#xff0c;目前主要有两种微调大模型的方法1&…...

六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战

欢迎来到编程星辰海的博客讲解 目录 一、语义化标签的核心价值 1.1 什么是语义化&#xff1f; 1.2 核心优势 二、语义标签详解与使用场景 2.1 布局容器标签 2.2 内容组织标签 三、博客结构搭建实战 3.1 完整HTML结构 3.2 核心结构解析 3.3 实现效果说明 四、学习要点…...

NLP的预处理数据

处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字&#xff0c;然后转换为张量&#xff0c;成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型&#xff0c;重要的是使用与之关联的…...

【DeepSeek问答】QProcess::start是异步的吗?会使UI卡顿吗?

好的&#xff0c;我现在需要回答用户关于QProcess::start是否是异步的&#xff0c;以及它是否会导致UI卡顿的问题。用户之前已经询问过如何开发一个调用7-Zip的Qt应用&#xff0c;并且我给出了示例代码。现在用户可能在使用过程中遇到了问题&#xff0c;或者想更深入了解QProce…...

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计 技术简介&#xff1a;采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介&#xff1a;体质测试数据分析及可视化设计是一个基于Web的在线平台&#xff0c;主要分为前台和后台两大功能模块。前台功能模…...

【DeepSeek-R1代码相似度引擎解密】:3层语义比对机制、Token归一化偏差修正与Jaccard阈值黄金分割点

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek代码重复检测 DeepSeek-R1 模型在训练过程中引入了严格的代码去重机制&#xff0c;其核心目标是消除训练语料中语义等价或高度相似的代码片段&#xff0c;从而提升模型对真实编程模式的学习能力与泛化…...

苏州创新药20年,站上全球产业洗牌暴风眼

一个城市的创新药产业集群如何从无到有&#xff0c;又如何在全球化临界点寻找自己的位置。文&#xff5c;徐鑫编&#xff5c;任晓渔过去一年多&#xff0c;苏州是全球创新药产业版图中一个绕不过去的城市。大额海外授权交易频繁传出&#xff0c;在中国高端制造走出去的背景下&a…...

Java数组工具类实战:设计不可实例化的静态工具类

实现一个工具类 MathUtils&#xff0c;满足以下要求&#xff1a; 1. 所有方法均为静态&#xff0c;且该类不能从外部实例化&#xff08;提示&#xff1a;使用私有构造器&#xff09;。 2. 提供三个静态方法&#xff1a;- maxArray(int[] arr)&#xff1a;返回较大值&#xff1b…...

警惕!AI正在悄悄重构全球攻防格局

警惕&#xff01;AI 正在悄悄重构全球攻防格局 热点聚焦 AI重构网络安全&#xff1a;全球巨头加速布局 2026年5月&#xff0c;全球网络安全领域迎来重大变革&#xff0c;AI技术正在重塑攻防格局。OpenAI发布专为网络安全防御打造的集成化AI平台Daybreak&#xff0c;将安全防…...

巧用对称性与平均值原理:低成本实现高精度电阻分压器校准

1. 项目概述&#xff1a;用数学思维突破测量设备的精度极限在电子实验室里捣鼓精密电路&#xff0c;尤其是涉及到电压基准、信号调理或者高精度ADC前端时&#xff0c;一个绕不开的坎就是精密分压器。你可能在设计一个需要0.1%甚至更高精度的分压网络&#xff0c;但手头的万用表…...

Python UiAutomation实战:从网页数据抓取到桌面应用,一个库打通数据采集全链路

Python UiAutomation实战&#xff1a;打通数据采集全链路的智能解决方案 在数据驱动的商业环境中&#xff0c;企业常常面临跨平台数据采集的挑战——财务系统里的交易记录需要与网站后台的报表进行交叉分析&#xff0c;销售数据要从桌面软件导出后上传到云端处理系统。传统的人…...

通过curl命令快速测试Taotoken大模型API的连通性与返回格式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令快速测试Taotoken大模型API的连通性与返回格式 在集成大模型能力到应用时&#xff0c;开发者通常需要一种快速、轻量的…...

从单体到事件驱动的生死跃迁:DeepSeek架构委员会认证的6阶段迁移路线图(含风险热力图与回滚触发阈值表)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;从单体到事件驱动的生死跃迁&#xff1a;DeepSeek架构委员会认证的6阶段迁移路线图&#xff08;含风险热力图与回滚触发阈值表&#xff09; 向事件驱动架构&#xff08;EDA&#xff09;演进不是功能迭代&…...

Redis 客户端连接详解

Redis 客户端连接详解 引言 Redis 是一款高性能的内存数据结构存储系统,常用于缓存、会话管理、实时排行榜等功能。客户端连接是 Redis 生态系统中的重要组成部分,本文将详细介绍 Redis 客户端连接的相关知识,包括连接方式、连接配置、连接管理等方面。 Redis 客户端连接…...

模式分层预测驱动推断:处理复杂缺失数据的统计新框架

1. 项目概述&#xff1a;当数据“缺胳膊少腿”时&#xff0c;如何做出靠谱的推断&#xff1f;在数据科学和统计建模的日常工作中&#xff0c;我们最怕遇到什么&#xff1f;不是复杂的算法&#xff0c;也不是海量的数据&#xff0c;而是数据本身“缺胳膊少腿”——也就是缺失值。…...