ROS编程 csv文件读取/输出 与 YAML文件生成

2023-05-16

前言

代码是抄的, 感想是真的. cpp的文件操作对比起python来说是比较繁复的. 而每次学习cpp的时候都会去刻意留文件操作的教程. 其实直接做一次实验就可以理解了. 下面的代码是抄回来, 分别是做手眼标定与力传感器标定过程中需要将采集的数据输出与读取过程中遇到的文件操作情况,记录下来防止自己忘记.

代码

  1. csv文件生成. 代码场景 手眼标定 记录回传数据 生成csv文件
#include <ros/ros.h>
#include <iostream>
#include <fstream>
#include <message_filters/subscriber.h>
#include <message_filters/time_synchronizer.h>
#include <message_filters/sync_policies/approximate_time.h>
#include <sensor_msgs/JointState.h>
#include <geometry_msgs/PoseStamped.h>

using namespace sensor_msgs;
using namespace message_filters;
using namespace geometry_msgs;


void callback(const sensor_msgs::JointState::ConstPtr& msgs , const geometry_msgs::PoseStamped::ConstPtr& marker_msgs, std::fstream& fout_ref){
    //do something
    fout_ref << msgs->position[0] << "," << msgs->position[1] << ","
             << msgs->position[2] << "," << msgs->position[3] << ","
             << msgs->position[4] << "," << msgs->position[5] << ","
             << msgs->position[6] << "," << marker_msgs->pose.position.x << ","
             << marker_msgs->pose.position.y << "," << marker_msgs->pose.position.z << ","
             << marker_msgs->pose.orientation.x << "," << marker_msgs->pose.orientation.y << ","
             << marker_msgs->pose.orientation.z << "," << marker_msgs->pose.orientation.w << "\n";
};

int main(int argc, char* argv[]){
    ros::init(argc,argv,"receiver_node");
    ros::NodeHandle nh;

    // 创建文件
    std::fstream fout;
    fout.open("/home/xxx/path_to_package/data.csv",std::ios::out|std::ios::app);
    fout << "joint_1" << "," << "joint_2" << "," 
         << "joint_3" << "," << "joint_4" << ","
         << "joint_5" << "," << "joint_6" << ","
         << "joint_7" << "," << "x_marker" << ","
         << "y_marker" << "," << "z_marker" << ","
         << "rx_marker" << "," << "ry_marker" << ","
         << "rz_marker" << "," << "rw_marker" << "\n";

    message_filters::Subscriber<JointState> sub(nh,"joint_states",1);
    message_filters::Subscriber<PoseStamped> marker_sub(nh, "vrpn_client_node/marker/pose",5);
    //TimeSynchronizer<msgs::JointPosition, PoseStamped> sync(sub, marker_sub, 10);
    typedef sync_policies::ApproximateTime<JointState,PoseStamped> my_syncPolicy;

    Synchronizer<my_syncPolicy> sync(my_syncPolicy(10),sub,marker_sub);
    sync.registerCallback(boost::bind(&callback,_1,_2,boost::ref(fout)));

    ros::spin();
    return 0;
}
  1. csv文件读取. 代码场景 从csv文件中读取数据加载到计算程序中
#include <ros/ros.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

#include <sensor_msgs/JointState.h>
#include <geometry_msgs/PoseStamped.h>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include "sophus/so3.hpp"
#include "sophus/se3.hpp"

#include <moveit/move_group_interface/move_group_interface.h>
#include <moveit/robot_model_loader/robot_model_loader.h>
#include <moveit/robot_model/robot_model.h>
#include <moveit/robot_state/robot_state.h>

// 1. 获取marker在mocap系统下的位姿
// 2. 获取机器人末端位姿参数

int main(int argc, char* argv[]){

    ros::init(argc, argv, "calibration_main");
    ros::NodeHandle node_handle;

    ros::AsyncSpinner spinner(1);
    spinner.start();
   
    std::ifstream fin("/home/xxxx/path_to_package/data.csv",std::ios::in);
    std::vector<double> data;
    std::string line, word, temp;
    int flag = 1;
    while(getline(fin,line)){

        // used for breaking words
        std::stringstream s(line);

        if (flag == 1) {
            flag++;
            continue;
        }
        // read every column data of a row and store it in a string variable 'word'
        while(std::getline(s,word,',')){
            // add all the column data 
            // of a row to a vector
            data.push_back(stod(word));
        }
        flag++;

       
        data.clear();
    }
  1. yaml-cpp文件生成 力传感器辨识后参数记录
    需要在CMakeLists.txt中加入

    find_package(yaml-cpp REQUIRED)
    include_directories(
    	include
    	${YAML_CPP_LIBRARIES}
    )
    
    add_executable(gravity_identify src/gravity_identify.cpp)
    target_link_libraries(gravity_identify ${catkin_LIBRARIES} 		${YAML_CPP_LIBRARIES})
    
    #include <yaml-cpp/yaml>
    #include <ros/package.h>
    //....
     std::string dir_package, dir_param_file;
    dir_package = ros::package::getPath("xxxxx");
    dir_param_file = dir_package + "/config/param.yaml";
    std::ofstream fout(dir_param_file);
    
    YAML::Emitter out(fout);
    out << YAML::BeginMap;
    out << YAML::Key << "l";
    out << YAML::BeginSeq;
    out << YAML::Value << h(0,0);
    out << YAML::Value << h(1,0);
    out << YAML::Value << h(2,0);
    out << YAML::EndSeq;
    out << YAML::Key << "G_b";
    out << YAML::BeginSeq;
    out << YAML::Value << g(0,0);
    out << YAML::Value << g(1,0);
    out << YAML::Value << g(2,0);
    out << YAML::EndSeq;
    out << YAML::Key << "F0";
    out << YAML::BeginSeq;
    out << YAML::Value << g(3,0);
    out << YAML::Value << g(4,0);
    out << YAML::Value << g(5,0);
    out << YAML::EndSeq;
    out << YAML::Key << "T0";
    out << YAML::BeginSeq;
    out << YAML::Value << h(3,0);
    out << YAML::Value << h(4,0);
    out << YAML::Value << h(5,0);
    out << YAML::EndSeq;
    out << YAML::EndMap;
    fout.close();
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS编程 csv文件读取/输出 与 YAML文件生成 的相关文章

随机推荐

  • Docker入门指南

    https yeasy gitbook io docker practice
  • STL迭代器模版详解

    1 STL iterator迭代器 STL xff08 Standard Template Library xff0c 标准模板库 是惠普实验室开发的一系列软件的统称 它是由Alexander Stepanov Meng Lee和David
  • 4种YOLO目标检测的C++和Python两种版本实现

    本文原创首发于极市平台公众号 xff0c 如需转载请私信作者 2020年 xff0c 新出了几个新版本的YOLO目标检测 xff0c 在微信朋友圈里转发的最多的有YOLOv4 xff0c Yolo Fastest xff0c YOLObil
  • Activity的任务栈Task以及启动模式与Intent的Flag详解

    什么是任务栈 Task 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity 这些 Activity 按照各自的打开顺序排列在堆栈 xff08 即 返回栈 xff09 中 其实就是以栈的结构 先进后出 将依次打
  • 什么是标记化?令牌?

    什么是标记化 xff1f 标记化就是 xff1a 将敏感数据元素 xff08 例如银行帐号 xff09 替换为非敏感替代项 xff08 称为令牌 xff09 令牌是一个随机数据字符串 xff0c 没有基本或可利用的值或含义 它是一个唯一的标
  • 如何使用c语言解析httppost请求

    头文件 ifndef UPLOAD define UPLOAD include 34 fastcgi fcgiapp h 34 include 34 sysinc h 34 ifdef WIN32 def GRCALL the callin
  • STM32F103ZET6单片机双串口互发程序设计与实现

    STM32库函数开发系列文章目录 第一篇 xff1a STM32F103ZET6单片机双串口互发程序设计与实现 文章目录 STM32库函数开发系列文章目录前言一 STM32F103ZET6单片机双串口互发程序设计与实现是什么 xff1f 二
  • STL的一些常见应用场景

    set 集合 去除重复元素并从小到大排序 平衡二叉树 xff08 红黑树 xff09 维护 span class token comment 华为机试 gt HJ3 span span class token macro property
  • Pixhawk原生固件Linux环境下编译

    Pixhawk原生固件在Linux下编译的资料网上很多 xff0c 官网 http dev px4 io starting installing linux html 也有其具体流程 xff0c 本文只是针对自己从安装ubuntu14 04
  • GNGGA 解析北斗数据获得经纬度 以及数据NMEA数据转换

    char GPS1 61 34 GNGGA 121252 000 3937 3032 N 11611 6046 E 1 05 2 0 45 9 M 5 7 M 0000 77 34 int Parse GPS char data char
  • C++ math.h函数

    include int abs int num double fabs double arg long labs long num 函数返回num的绝对值 include double acos double arg 函数返回arg的反余弦
  • 动态ip原理

    所谓动态是指每次上网时 xff0c 运营商会随机从池子中分配一个IP地址 xff0c 动态ip池子因不同服务机构质量有所不同 xff0c 透明一般是在免费代理中出现 xff0c 而不同透明度还是有相应区分 代理IP的匿名度 xff1a 匿名
  • 自建隧道代理

    隧道代理可自动变更 xff0c 免去频繁更换代理的麻烦 xff0c 仅需一次性配置一个代理IP xff0c 其它变IP工作由隧道自动完成 假设你从免费代理手上拿到一些池子 xff0c 当然你也可以用爬虫程序自己爬找出后测试筛选可用的 xff
  • socks5代理怎么用?如何使用?

    SOCKS5代理不会重写数据包的标头 xff0c 并结合了TCP和UDP协议 Sock5代理服务器是把你的网络数据请求通过一条连接你和代理服务器之间的通道 xff0c 由服务器转发到目的地 Proxifier是一款功能非常强大的socks5
  • Python代理ip代码示例

    隧道代理和其他代理ip也有共同点优势比路由器更容易配置 xff0c 可以在工作过程中生成各种记录 xff0c 工作在应用层 xff0c 可以对各种数据进行检查 xff0c 按照一定的准则 xff0c 生成各种日志 记录 除此之外 xff0c
  • python 爬虫SSL错误是怎么回事?

    今天摸鱼 xff08 划掉 xff09 看道一个问题蛮有意思的 xff0c 想来展开说说 xff1a 别急 xff0c 解决办法是有的 1 这个错误很可能是因为你正在尝试读取一个 JSON 格式的响应 xff0c 但是实际返回的却是 HTM
  • python写的爬虫,抓取百度的搜索结果,被屏蔽了怎么办?

    某乎上有个热门话题 xff0c 引起了很大的讨论 这个问题通常是由于频繁的请求导致百度的反爬虫机制触发了验证码的保护机制 解决办法无非是那几套流程走一遍 1 增加请求的时间间隔 通过在每个请求之间增加一些时间间隔 xff0c 可以降低请求频
  • HTTP代理挑选最强攻略

    最近上班合理上网的时候 xff0c 在某乎上刷到一个话题 xff0c 本来这个话题我也经常刷到没打算看 xff0c 本着看新动态的心思 xff0c 点进来一看 xff0c 好家伙 xff0c 这话题底下除了各大HTTP代理服务商 xff0c
  • 电设飞控从零学起(一) 基础篇 无人机硬件与结构设计简介

    1 常见无人机的分类 xff08 1 xff09 固定翼 xff1a 续航时间长 xff0c 载荷最大 xff0c 但必须助跑 滑行 xff08 2 xff09 直升机 xff1a 可垂直起降 xff0c 但机械结构复杂 维护成本高 xff
  • ROS编程 csv文件读取/输出 与 YAML文件生成

    前言 代码是抄的 感想是真的 cpp的文件操作对比起python来说是比较繁复的 而每次学习cpp的时候都会去刻意留文件操作的教程 其实直接做一次实验就可以理解了 下面的代码是抄回来 xff0c 分别是做手眼标定与力传感器标定过程中需要将采