国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

讀取機器人移動軌跡并在RVIZ界面中顯示

這篇具有很好參考價值的文章主要介紹了讀取機器人移動軌跡并在RVIZ界面中顯示。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

機器人在巡檢過程中需要沿著固定路線執(zhí)行任務(wù),因此可以先把機器人的移動軌跡錄制并保存下來,之后讀取軌跡,方便后續(xù)操作。


一、準備

1.坐標系

巡檢導(dǎo)航過程中,機器人需要確定好坐標系,以便進行定位與導(dǎo)航,在gazebo仿真下可以選擇world坐標系,在實際使用中通常使用的是map坐標系,這里以map坐標系為例進行介紹。

2.ros下的路徑消息格式

rosmsg show nav_msgs/Path 
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
geometry_msgs/PoseStamped[] poses
  std_msgs/Header header
    uint32 seq
    time stamp
    string frame_id
  geometry_msgs/Pose pose
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w

二、實現(xiàn)過程

1.軌跡保存

思路:使用/amcl_pose話題獲取機器人當前的位置信息,用nav_msgs::Path格式的一個變量Path進行保存,控制機器人的運動,當機器人運動距離超過某一數(shù)值時,將當前位置pose加入該變量,直到機器人走完預(yù)設(shè)的路徑。之后遍歷Path中路徑點保存輸出CSV文本即可。

#include <fstream>
#include <tf/tf.h>
#include <ros/ros.h>
#include <nav_msgs/Path.h>
#include <std_msgs/String.h>
#include <geometry_msgs/PoseStamped.h>
#include <geometry_msgs/PoseWithCovarianceStamped.h>
#include <nav_msgs/Odometry.h>
using namespace std;

ros::Subscriber robot_pose_sub_;
ros::Subscriber save_path_sub_ ;
nav_msgs::Path curr_trajectory_;
/*
* 計算兩點間距離
*/
double calculateDistanceBetweenPose(const geometry_msgs::PoseStamped& pose1,const geometry_msgs::PoseStamped& pose2)
{
    double d_x = pose2.pose.position.x - pose1.pose.position.x;
    double d_y = pose2.pose.position.y - pose1.pose.position.y;
    return sqrt(d_x* d_x + d_y * d_y);
}
/*
* 保存路徑
*/
void savePathToFile(string filename)
{
    ofstream File;
	//保存文本地址
    string filePathName;
    filePathName = "/home/name/path/"+ filename +".csv";

    File.open(filePathName.c_str(),ios::out|ios::trunc);
	//遍歷存儲路徑容器,將路徑四元數(shù)轉(zhuǎn)為yaw角,寫入文本
    for(int i=0;i<curr_trajectory_.poses.size();i++)
    {
        float x = curr_trajectory_.poses[i].pose.position.x;
        float y = curr_trajectory_.poses[i].pose.position.y;

        tf::Quaternion quat;
        tf::quaternionMsgToTF(curr_trajectory_.poses[i].pose.orientation,quat);
        double roll, pitch, yaw;
        tf::Matrix3x3(quat).getRPY(roll,pitch,yaw);
        float th = yaw;
        File<<x<<","<<y<<","<<th<<endl;
    }
    File.close();

}
/*
* 當前位置回調(diào),將間距超過4cm的路徑點加入容器
*/
void robotPoseCallback(const geometry_msgs::PoseWithCovarianceStampedConstPtr & curr_pose)
{
    geometry_msgs::PoseStamped current_pose;
    current_pose.header.frame_id = "map";
    current_pose.header.stamp = ros::Time::now();
    current_pose.pose.position = curr_pose->pose.pose.position;
    current_pose.pose.orientation = curr_pose->pose.pose.orientation;
    if(curr_trajectory_.poses.empty())
    {
        curr_trajectory_.poses.push_back(current_pose);
        return ;
    }
    int poses_num = curr_trajectory_.poses.size();
    double dis = calculateDistanceBetweenPose(curr_trajectory_.poses[poses_num - 1],current_pose);
    if(dis > 0.04)
        curr_trajectory_.poses.push_back(current_pose);
}
/*
*  接收路徑保存指令,開始保存路徑點
*/
void savePathCallback(const std_msgs::String::ConstPtr& msg)
{
    string str_msgs = msg->data.c_str();

    if(str_msgs.compare("end") == 0)
    {
        if(!curr_trajectory_.poses.empty())
        {
            string file_path = "aaa";
            savePathToFile(file_path.c_str());
            curr_trajectory_.poses.clear();
            cout<<"end1!"<<endl;
        }
        cout<<"end2!"<<endl;
    }
}
int main(int argc,char** argv)
{
    ros::init(argc,argv,"save_path_node");
    ros::NodeHandle nh_;

    robot_pose_sub_ = nh_.subscribe("/amcl_pose",1,robotPoseCallback);
    save_path_sub_ = nh_.subscribe("/start_end_record", 1,savePathCallback);
    curr_trajectory_.header.frame_id = "map";
    curr_trajectory_.header.stamp = ros::Time::now();
    ros::spin();
    return 0;
}


運行上述程序后,控制小車運動,當走完所需的路徑后,需單獨發(fā)送一個話題,從而啟動路徑保存

rostopic pub /start_end_record std_msgs/String "data: 'end'" 

2.軌跡讀取并顯示

思路:讀取CSV文本并分割,將路徑點發(fā)布出去。
這里也發(fā)布了路徑起點和終點位置。

#include <ros/ros.h>
#include <geometry_msgs/PoseWithCovarianceStamped.h>
#include <nav_msgs/Odometry.h>
#include <std_msgs/String.h>
#include <tf/tf.h>
#include <nav_msgs/Path.h>
#include <geometry_msgs/PointStamped.h>
#include <geometry_msgs/Twist.h>
#include <ros/time.h>
#include <istream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <tf/tf.h>
using namespace std;

/**
 * 字符串分割
*/
std::vector<std::string> split(const std::string &str, const std::string &pattern) {
    char *strc = new char[strlen(str.c_str()) + 1];
    strcpy(strc, str.c_str()); // string轉(zhuǎn)換成C-string
    std::vector<std::string> res;
    char *temp = strtok(strc, pattern.c_str());
    while (temp != NULL) {
        res.push_back(std::string(temp));
        temp = strtok(NULL, pattern.c_str());
    }
    delete[] strc;
    return res;
}

int main(int argc,char** argv)
{
    ros::init(argc,argv,"path_pub");
    ros::NodeHandle n;
    ros::Rate r(10);
    ros::Publisher path_pub = n.advertise<nav_msgs::Path>("/path_pub",10);
    ros::Publisher path_end_pub = n.advertise<geometry_msgs::PointStamped>("/path_end_point",10);
    ros::Publisher path_start_pub = n.advertise<geometry_msgs::PointStamped>("/path_start_point",10);

    nav_msgs::Path nav_path;
    nav_path.header.frame_id= "/map";
    nav_path.header.stamp = ros::Time::now();
    geometry_msgs::PoseStamped path_pose;


   //讀取CSV文件
    std::ifstream csv_data("path/aaa.csv",std::ios::in);
    if(!csv_data)
    {
        std::cout<<"open .csv failed"<<std::endl;
        ROS_ERROR(" .csv  doesn't exisit ");
        std::exit(1);
    }
    geometry_msgs::Quaternion quat;
    std::string line;
    int line_num = 0;
    std::vector<std::string> strbuf;

    while(ros::ok())
    {
        while(std::getline(csv_data,line))
        {
            // std::cout<<line<<std::endl;
            path_pose.header.frame_id = "/map";
            path_pose.header.stamp =ros::Time::now();
            path_pose.header.seq = 0;
            line_num++;
            strbuf = split(line, ",");
            path_pose.pose.position.x = atof(strbuf[0].c_str());
            path_pose.pose.position.y = atof(strbuf[1].c_str());
            path_pose.pose.position.z = 0.0;
            float yaw = atof(strbuf[2].c_str());

            quat = tf::createQuaternionMsgFromYaw(yaw);

            path_pose.pose.orientation.x = quat.x;
            path_pose.pose.orientation.y = quat.y;
            path_pose.pose.orientation.z = quat.z;
            path_pose.pose.orientation.w = quat.w;
            nav_path.poses.push_back(path_pose);
        }
        path_pub.publish(nav_path);
        ros::Duration(1).sleep();
        path_end_pub.publish(nav_path.poses[nav_path.poses.size()-1]);
        // std::cout<<"----2-----"<<std::endl;
        path_start_pub.publish(nav_path.poses[0]);

        ros::spinOnce();
        r.sleep();
    }

    return 0;

}

在rviz中添加話題名稱,結(jié)果如圖:
rviz顯示軌跡,機器人,linux,學(xué)習文章來源地址http://www.zghlxwxcb.cn/news/detail-757138.html


到了這里,關(guān)于讀取機器人移動軌跡并在RVIZ界面中顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Ubuntu18.04 Turtlebot2機器人移動控制 Rviz Gazebo仿真實現(xiàn)

    Ubuntu18.04 Turtlebot2機器人移動控制 Rviz Gazebo仿真實現(xiàn)

    操作系統(tǒng)為ubuntu18.04 安裝ROS Melodic Turtlebot2,很多大佬分享了詳細的安裝過程,在這里就不多贅述,安裝遇到問題多百度,大部分都是可以解決的。 前期學(xué)習了趙虛左老師的ROS入門課程,結(jié)合Turtlebot2資料這里方便大家打開,放的創(chuàng)客制造的文檔,也推薦大家去看官方文檔 首先

    2023年04月25日
    瀏覽(33)
  • GPS學(xué)習(一):在ROS2中將GPS經(jīng)緯度數(shù)據(jù)轉(zhuǎn)換為機器人ENU坐標系,在RVIZ中顯示坐標軌跡

    GPS學(xué)習(一):在ROS2中將GPS經(jīng)緯度數(shù)據(jù)轉(zhuǎn)換為機器人ENU坐標系,在RVIZ中顯示坐標軌跡

    本文記錄在Ubuntu22.04-Humbel中使用NMEA協(xié)議GPS模塊的過程,使用國產(chǎn)ROS開發(fā)板魯班貓(LubanCat )進行調(diào)試。 在淘寶找了款性價比較高的輪趣科技GPS北斗雙模定位模塊作為入門學(xué)習使用,支持GNSS系統(tǒng)(北斗、GPS、GLONASS、日本的QZSS以及衛(wèi)星增強系統(tǒng)SBAS),定位精度在2.5m左右,屬于民用

    2024年02月03日
    瀏覽(41)
  • kuka示教器嵌套UR界面操作ros中rviz的UR機器人

    kuka示教器嵌套UR界面操作ros中rviz的UR機器人

    本例展示了用QT增加一個網(wǎng)頁視圖,背景是kuka示教器界面,中間增加UR的VNC網(wǎng)頁界面顯示。本人博客中一起有寫過ros2運行UR的操作。 ? ? ? ? ros2 UR10仿真包運行_基于ros的ur仿真-CSDN博客 ? ? ? 效果如下: ? ? 背景的增加,參考這篇文件。? qt for python創(chuàng)建UI界面-CSDN博客 ? 主要

    2024年02月21日
    瀏覽(24)
  • 【深藍學(xué)院】移動機器人運動規(guī)劃--第5章 最優(yōu)軌跡生成--筆記

    【深藍學(xué)院】移動機器人運動規(guī)劃--第5章 最優(yōu)軌跡生成--筆記

    Ch2講了基于搜索的路徑規(guī)劃方法,Ch3講了基于采樣的路徑規(guī)劃方法,這些都是global methods,框架都是Exploration and Exploitation,且在算力足夠大的情況下,一定能夠找到全局最優(yōu)解。 除了global methods,還有l(wèi)ocal methods,主要是Deterministic Optimization確定性優(yōu)化?;趦?yōu)化的方法,主要

    2024年02月19日
    瀏覽(26)
  • 【軌跡跟蹤】基于自適應(yīng)跟蹤(EAT)方法的無人機/移動機器人軌跡跟蹤(Matlab&Simulink)

    【軌跡跟蹤】基于自適應(yīng)跟蹤(EAT)方法的無人機/移動機器人軌跡跟蹤(Matlab&Simulink)

    ???????? 歡迎來到本博客 ???????? ??博主優(yōu)勢: ?????? 博客內(nèi)容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ?? 座右銘: 行百里者,半于九十。 ?????? 本文目錄如下: ?????? 目錄 ??1 概述 ??2 運行結(jié)果 ??3?參考文獻 ??4 Matlab代碼Simulink實現(xiàn) 摘

    2024年02月07日
    瀏覽(24)
  • rviz上不顯示機器人模型(模型只有白色)

    rviz上不顯示機器人模型(模型只有白色)

    文檔中的是base_footprint,需要根據(jù)自己所設(shè)的坐標系更改,我的改為base_link 如何查看自己設(shè)的坐標系: 這些parent父坐標系就是 同時打開rviz后需要更改成base_link

    2024年04月17日
    瀏覽(112)
  • 【ROS 2 基礎(chǔ)-常用工具】-7 Rviz仿真機器人

    【ROS 2 基礎(chǔ)-常用工具】-7 Rviz仿真機器人

    ?所有內(nèi)容請查看:博客學(xué)習目錄_Howe_xixi的博客-CSDN博客

    2024年02月08日
    瀏覽(24)
  • RViz成功顯示多個機器人模型以及解決顯示的模型沒有左右輪

    RViz成功顯示多個機器人模型以及解決顯示的模型沒有左右輪

    在RViz中顯示多個機器人模型需要設(shè)置好幾個關(guān)鍵的參數(shù) 首先點擊Add,找到RobotModel,添加進來 Fixed Frame:選擇TF樹最上層的坐標系,一般是世界坐標系,即固定不動的全局坐標系 Robot Description:/robot1/robot_description,要在robot_description前加上對應(yīng)的命名空間 TF Prefix:robot1,機器

    2024年01月18日
    瀏覽(133)
  • 機器人軌跡生成:軌跡規(guī)劃與路徑規(guī)劃

    機器人軌跡生成:軌跡規(guī)劃與路徑規(guī)劃

    機器人軌跡生成涉及到軌跡規(guī)劃和路徑規(guī)劃兩個關(guān)鍵概念,它們是機器人運動控制中的重要組成部分。下面對軌跡規(guī)劃和路徑規(guī)劃進行深入比較。 軌跡規(guī)劃(Trajectory Planning): 定義:軌跡規(guī)劃是指在機器人運動中確定機器人末端或關(guān)節(jié)的期望軌跡。它是在特定的工作空間中

    2024年02月12日
    瀏覽(27)
  • Matlab機器人的仿真(八):繪制機器人運動軌跡(復(fù)現(xiàn))

    Matlab機器人的仿真(八):繪制機器人運動軌跡(復(fù)現(xiàn))

    跑一得出運動軌跡的動圖結(jié)果: 跑二得出的繪出6個關(guān)節(jié)的角度,角速度,角加速度的信息圖: 跑三得出的結(jié)果:末端點軌跡(x-y-z視圖)

    2024年02月11日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包