【探索评估】记录小车运动轨迹,并在 rviz 上显示

本文主要是参考的博客:ROS 移动机器人运动轨迹记录,并发布在rviz上
但是由于订阅的话题不一样,在这里记录一下

在进行自主探索的时候将小车移动过程中的消息记录在 txt 或是 csv 文件中

在此记录的是小车的 /odom 消息,并且只记录其中的 x,y,w 的值,存储格式为每组数据存一行,如下:

在这里插入图片描述记录轨迹的代码如下:

/***** 实现路径读取 *****/
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <geometry_msgs/PoseStamped.h>
#include <geometry_msgs/PoseWithCovarianceStamped.h>
#include <nav_msgs/Odometry.h>
#include <tf/transform_broadcaster.h>
#include <string> 
#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <math.h>
#include <fstream> //文件读入读出
#include <ctime>using namespace std;void callback_path(const nav_msgs::Odometry::ConstPtr& msg )
{ //outfile用法同cout,存储形式 1 2 3 ofstream outfile;outfile.setf(ios::fixed, ios::floatfield);outfile.precision(2);outfile.open("/xxx/data/explore_lite_1.txt",std::ios::app);outfile<<msg->pose.pose.position.x<<" "<<msg->pose.pose.position.y<<" "<<msg->pose.pose.orientation.w<<endl;outfile.close();
}
int main(int argc, char **argv)
{ros::init(argc, argv, "explore_record");ros::NodeHandle n;ros::Subscriber explore_sub = n.subscribe("/odom", 100, callback_path);ros::spin();return 0;
}

选择你所需要记录的话题,并在回调中以自定义的方式存储数据格式,这里是用空格隔开的,同样也可以使用逗号隔开。

接下来是将 txt 或是 csv 文件中的数据读出,并在rviz中显示,代码如下:
(注意这里每行数据以空格分割!若以逗号分割则Stringsplit函数的第二个参数要做相应的修改)

#include <ros/ros.h>
#include <nav_msgs/Path.h>
#include "std_msgs/String.h"
#include <geometry_msgs/PoseStamped.h>
#include <move_base_msgs/MoveBaseAction.h>
#include <string>        
#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <math.h>
#include <fstream> //文件读入读出
#include <ctime>
#include <cstdlib> //exit
#include <vector>
#include <array>
#include <geometry_msgs/PoseWithCovarianceStamped.h>
#include <nav_msgs/Odometry.h>
#include <tf/transform_broadcaster.h>using namespace std;         
geometry_msgs::PoseStamped pose;
geometry_msgs::PoseStamped p;
nav_msgs::Path path;
int global_status;array<double,3> Stringsplit(string str,const char split)
{array<double,3> arr;int n{};istringstream iss(str);    // 输入流string token;            // 接收缓冲区while (getline(iss, token, split))    // 以split为分隔符{arr[n] = stod(token);n++;}return arr;
}void result_cb(const move_base_msgs::MoveBaseActionResult::ConstPtr& msg)
{actionlib_msgs::GoalStatus status;status = msg->status;global_status = status.status;
}int main(int argc,char** argv)
{ros::init(argc,argv,"read_path");ros::NodeHandle n;ros::Publisher pub_path = n.advertise<nav_msgs::Path>("read_path",1000);ros::Publisher follow_path = n.advertise<geometry_msgs::PoseStamped>("/move_base_simple/goal",10);ros::Subscriber result_sub = n.subscribe("/move_base/result",10,result_cb);ifstream file;file.open("/xxx/data/explore_lite.txt");string str;vector<array<double,3>> path_;while(getline(file,str)){auto val = Stringsplit(str,' ');path_.emplace_back(val);}file.close();ros::Rate r(1);path.header.frame_id = "map";path.header.stamp = ros::Time::now();for(const auto& n : path_){pose.header.frame_id = "map";pose.header.stamp = ros::Time::now();pose.pose.position.x = n[0];pose.pose.position.y = n[1];pose.pose.position.z = 0;pose.pose.orientation.w = n[2];pose.pose.orientation.x = 0;pose.pose.orientation.y = 0;pose.pose.orientation.z = 0;path.poses.emplace_back(pose);ROS_INFO("( x:%0.6f ,y:%0.6f ,w:%0.6f)",n[0] ,n[1] ,n[2] );}while(ros::ok()){pub_path.publish(path);ros::spinOnce();  r.sleep();}return 0;
}

在 rviz 上同时显示 /map 话题和轨迹(frame_id 都为 map),显示的效果如下:
(轨迹的话题为:/read_path)

请添加图片描述

参考博客:ROS 移动机器人运动轨迹记录,并发布在rviz上
非常感谢!!

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

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

相关文章

2023-12-14 二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数

二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数 104. 二叉树的最大深度 思想&#xff1a;可以使用迭代法或者递归&#xff01;使用递归更好&#xff0c;帮助理解递归思路&#xff01;明确递归三部曲–①确定参数以及返回参数 ②递归结束条件 ③单层逻辑是怎么样…

Leetcode—172.阶乘后的零【中等】

2023每日刷题&#xff08;六十&#xff09; Leetcode—172.阶乘后的零 算法思想 实现代码 int trailingZeroes(int n) {int ans 0;for(int i 5; i < n; i 5) {for(int j i; j % 5 0; j / 5) {ans;}}return ans; }运行结果 之后我会持续更新&#xff0c;如果喜欢我的文…

郝斌C语言自学教程笔记

赫斌C语言——笔记目录 c语言编程预备知识流程控制函数变量指针结构体位运算符 前段时间康哥看我C语言基础不牢,推荐我学习郝斌老师的C语言课程&#xff0c;花2周看完之后发现确实是目前所看的C语言课程中最好的&#xff0c;不仅非常适合入门&#xff0c;而且对即使学了几年C语…

2021年数维杯国际大学生数学建模B题极端降雨的定量分析求解全过程文档及程序

2021年数维杯国际大学生数学建模 B题 极端降雨的定量分析 原题再现&#xff1a; 近两年来&#xff0c;我国河南、陕西、湖北等地遭遇了极为罕见的暴雨。与此同时&#xff0c;北方一些城市遭遇了历史上罕见的暴风雪。这些暴雨和降雪对当地人民的生命、安全和财产构成严重威胁。…

基于ssm点餐平台系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本点餐平台系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

生物制品行业分析:预计2029年将达到9704亿元

生物制品是由糖、蛋白质、核酸或该等物质的复杂组合组成并采用生物方法及来源生产的医药产品&#xff0c;生物制品也可以是细胞及组织等活体。生物制品的主要类型包括抗体、融合蛋白、ADC、重组蛋白、疫苗、基因疗法及细胞疗法。 预防用生物制品是指为预防、控制疾病的发生、流…

软件库论坛社区后台系统源码工具箱积分商城会员体系和在线商城于一体

HBuilderX前端软件社区thinkphp后端源码 搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名 电脑需要下载&#xff1a;HBuilderX 下载后 登录账号 没有账号就注册账号 然后上传文件 在选择你上传的文件即可 打包选择 “发行” 可以打包app h5等等 演…

抖音关键词商品列表API:电商行业的成功之道及实时数据获取的魔力

随着电商行业的快速发展&#xff0c;抖音作为一款短视频社交应用&#xff0c;已经成为电商领域的重要平台。抖音关键词商品列表API接口在电商行业中具有重要意义&#xff0c;它可以帮助商家快速获取商品信息&#xff0c;提高销售效率。本文将探讨抖音关键词商品列表API接口在电…

MySQL如何进行Sql优化

&#xff08;1&#xff09;客户端发送一条查询语句到服务器&#xff1b; &#xff08;2&#xff09;服务器先查询缓存&#xff0c;如果命中缓存&#xff0c;则立即返回存储在缓存中的数据&#xff1b; &#xff08;3&#xff09;未命中缓存后&#xff0c;MySQL通过关键字将SQ…

GPT-4.5 要来了!谷歌大模型 Gemini 确实给够压力

GPT-4 还没用明白&#xff0c;GPT-4.5 就要发布了。 最近&#xff0c;OpenAI 泄露了 GPT-4.5 的发布页面&#xff0c;除了进一步增强复杂推理和跨模态理解&#xff0c;GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持&#xff0c;也就意味着多模态最后一块版图…

我从来不理解JavaScript闭包,但我用了它好多年

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 你是否学习了很久JavaScript但还没有搞懂闭包呢&#xff1f;今天就来聊一下…

双端队列和优先级队列

文章目录 前言dequedeque底层设计迭代器设计 priority仿函数数组中的第k个最大元素优先级队列模拟实现pushpop调整仿函数存储自定义类型 前言 今天要介绍比较特殊的结构&#xff0c;双端队列。 还有一个适配器&#xff0c;优先级队列。 deque 栈的默认容器用了一个deque的东西…