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

规划计时器-备份(自己看)

#!/usr/bin/env python # -*- coding: utf-8 -*- import rospy import math from geometry_msgs.msg import PoseStamped from nav_msgs.msg import Odometry class ExperimentMonitor: def __init__(self): rospy.init_node('experiment_monitor_node') # --- 参数配置 --- self.goal_tolerance = 0.3 # 判定到达的距离阈值 (米) self.odom_topic = "/Odometry" # 如果你的里程计话题不同请修改 self.goal_topic = "/move_base_simple/goal" # --- 状态变量 --- self.is_running = False self.start_time = None self.total_distance = 0.0 self.last_pose = None self.goal_pose = None # --- 订阅话题 --- rospy.Subscriber(self.goal_topic, PoseStamped, self.goal_callback) rospy.Subscriber(self.odom_topic, Odometry, self.odom_callback) rospy.loginfo("==== 实验监控裁判已就位 ====") rospy.loginfo("等待在 RViz 中点击目标点或运行发布脚本...") def goal_callback(self, msg): """监听到新目标,重置数据并开始计时""" self.goal_pose = msg.pose.position self.is_running = True self.start_time = rospy.get_time() self.total_distance = 0.0 self.last_pose = None rospy.loginfo("🏁 检测到新任务!目标点: (%.2f, %.2f) 开始计时...", self.goal_pose.x, self.goal_pose.y) def odom_callback(self, msg): if not self.is_running or self.goal_pose is None: return curr_pose = msg.pose.pose.position # 1. 累加实际行驶距离 (里程计路径长度) if self.last_pose is not None: dist = math.sqrt((curr_pose.x - self.last_pose.x)**2 + (curr_pose.y - self.last_pose.y)**2) self.total_distance += dist self.last_pose = curr_pose # 2. 计算当前距离目标的剩余距离 dist_to_goal = math.sqrt((curr_pose.x - self.goal_pose.x)**2 + (curr_pose.y - self.goal_pose.y)**2) # 3. 判定“冲线” if dist_to_goal < self.goal_tolerance: self.finish_experiment() def finish_experiment(self): self.is_running = False duration = rospy.get_time() - self.start_time # 防止除以零 avg_speed = self.total_distance / duration if duration > 0 else 0.0 rospy.loginfo("🎯 任务完成!(已进入容差范围)") print("\n" + "="*30) print("🚩 实验结果汇总:") print("⏱️ 消耗时间: {:.2f} s".format(duration)) print("📏 行驶里程: {:.2f} m".format(self.total_distance)) print("🚀 平均速度: {:.4f} m/s".format(avg_speed)) print("="*30 + "\n") # 提示等待下一次实验 rospy.loginfo("等待下一个目标点...") if __name__ == '__main__': try: monitor = ExperimentMonitor() rospy.spin() except rospy.ROSInterruptException: pass
http://www.cnnetsun.cn/news/1268910.html

相关文章:

  • FireRed-OCR Studio惊艳效果:化学分子式+反应方程式LaTeX精准提取
  • Element UI树状下拉选择器优化技巧:解决远程搜索与本地过滤的常见问题
  • Unity UI 性能优化实战 — 不规则遮罩与引导层的高效实现
  • 为什么你的Dify搜索结果总排错?揭秘rerank_model、cross_encoder、top_k三者协同失效的致命链(附可运行配置)
  • 颠覆传统游戏体验:更好的鸣潮如何让剧情推进效率提升300%
  • 彩虹表攻击实战:从原理到破解SHA/MD5哈希的优化策略
  • Qwen-Image-Edit-2509图片编辑案例分享:看看AI如何把普通照片变成专业级作品
  • 2026年选跑腿系统,千万别信“啥都能做”,要信“啥都稳定”
  • 06-面向对象高级01
  • 实战演练:用BurpSuite绕过upload-labs前10关的5种奇葩姿势(附避坑指南)
  • SenseVoice语音识别零基础教程:从安装到API调用的完整流程
  • 智能客服Agent需求文档(PRD)实战指南:从设计到落地的关键考量
  • STC8H8K64U最小系统开发板设计与OLED驱动实践
  • 解决Overleaf两大痛点:ACM模板引用乱序+代码高亮失效的终极方案
  • TFBS4711红外模块数据收发全解析:从波形分析到代码实现
  • 信创云桌面私有化部署,如何真正实现企业核心数据不落地、防泄露?
  • 小白也能懂的Qwen3-Embedding-0.6B教程:快速搭建语义搜索服务
  • 【Android 12 AOSP实战】从零构建系统镜像:第三方APK预装与system.img定制指南
  • Windows与Linux文件互传终极指南:SSH+SCP命令详解(附常见问题排查)
  • 避坑指南:slam_karto跑通Freiburg激光数据集的全流程记录
  • 【AI】TensorFlow 框架
  • USB电压电流表嵌入式设计:双路采样与CAN/UART双总线实现
  • Jackson全局配置指南:一劳永逸解决前端Long精度问题(SpringBoot2.7+)
  • 2026年国内低泡切削油品牌TOP5盘点,谁将引领行业新标准
  • 为什么企业级智能问数离不开语义层?一文讲透准确率与泛化率
  • RPC超时原因
  • 告别重复劳动!用Chrome网页文本替换工具实现效率提升90%
  • 如何通过Paddle引擎配置提升Umi-OCR多语言识别准确率
  • 本地图片搜索引擎ImageSearch完全指南:从认知到实践的本地化搜索解决方案
  • 邻接矩阵实战:5分钟搞懂有向图和有权图的存储与遍历