【探索评估】记录小车运动轨迹,并在 rviz 上显示
2023-12-15 16:07:49
本文主要是参考的博客: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上
非常感谢!!
文章来源:https://blog.csdn.net/zeroheitao/article/details/135014622
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!