当前位置: 首页 > 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.jsqmd.com/news/474170/

相关文章:

  • Windows 11 24H2 LTSC 微软商店恢复方案:从功能缺失到生态完整
  • 3步释放显卡潜能:DLSS Swapper从技术原理到场景化应用的优化指南
  • Janus-Pro-7B企业应用:客服图文工单自动摘要+意图识别落地解析
  • 美胸-年美-造相Z-Turbo实战:为古籍修复师林晚生成角色立绘
  • VRRP安全认证:为什么你的网络需要它?(附详细实验配置)
  • Step3-VL-10B-Base模型Node.js后端服务集成教程
  • 为什么你的Dify工作流总在凌晨崩?揭秘Agent超时熔断、重试风暴与上下文泄漏的3重隐性风险
  • Arthas安装使用+监控代码耗时
  • 学生成绩管理系统项目文档
  • 你的GPU在摸鱼?CUDA多GPU编程全栈实战——从P2P直连到NCCL集合通信
  • PasteMD使用技巧:三种进阶用法,让AI成为你的写作加速器
  • 图拉斯×牛客AI面试:招聘进入规模化时代,最佳解法是把初筛交给 AI
  • Qwen2.5-72B-Instruct-GPTQ-Int4部署教程:镜像内预置环境与依赖说明
  • NPYViewer:让NumPy数据可视化不再依赖编程的高效工具
  • SuperPNG插件故障排除指南:从安装到图像优化的全面解决方案
  • Unity3D截图保存PNG颜色变暗?RenderTexture的sRGB设置全解析
  • 新手必看:Sensor Bringup全流程详解(附常见问题排查指南)
  • 视觉识别驱动的游戏自动化:BetterWutheringWaves的技术实现与应用
  • 如何通过wxauto实现Windows微信自动化:从效率痛点到解决方案的完整指南
  • Topit:重新定义Mac窗口管理,告别多任务切换烦恼
  • OneAPI效果展示:百川+月之暗面+阶跃星辰三模型并行调用对比
  • Windbg与VMware双机调试实战:从配置到问题排查全指南
  • ABP vNext 微服务实战:模块化拆解与分布式架构落地指南
  • 多语言能力测评:Phi-3-mini-128k-instruct在中英日等语言上的表现对比
  • ChatTTS CPU版部署实战:从环境配置到性能调优全指南
  • 如何让Ubuntu24.04优先选择指定的source文件(清华源)
  • 2026 企业商旅平台行业评测:5家主流平台深度解析,合思如何以智能管理成为企业差旅首选?
  • Step3-VL-10B开源多模态模型落地案例:电商图文审核与GUI自动化测试
  • 告别Flash!海康/大华摄像头RTSP流网页无插件播放实战(附Go代码)
  • cv_resnet101_face-detection_cvpr22papermogface 在物联网中的实践:基于MQTT协议的设备端触发拍照与云端检测