Vector数组类型在ROS开发中的用法小结

2023-05-16

目录

  • 前言
  • 数组类型在不同消息类型中的定义
    • 在ROS消息中的定义
    • 在C++中定义数组
  • vector数组的一些常用操作
    • 基本操作
    • 求数组的最值
    • 遍历数组
    • 排序数组
    • 查找数组
    • 注意

前言

ROS系统的一个显著优势就是分布式和灵活性,用户可以很方便自定义消息类型。在自动驾驶中,无论是传感器消息sensoe_msgs,还是导航消息nav_msgs等等几乎都离不开一个基本的结构:vector数组。尤其是在SLAM中,在处理雷达消息更是必不可少的操作。所以把vector理解透彻对于ROS开发还是非常重要的。

接下来的内容以C++语言为主,python语言是类似的,但是语法可能稍有不同。(PS:对于搞自动驾驶的同学,还是强烈推荐用C++开发,原因无他,C++快!!!在自动驾驶领域,处理速度是决定性的一个因素)

数组类型在不同消息类型中的定义

在ROS消息中的定义

ROS常用的消息分别是msg、srv、action,分别对应于topic话题、service服务、action动作三种通信模式。对于这三种数据类型,数组的定义格式都是一样的:

DateType[] name
举例:
msg消息sensor_msgs/LaserScan.msg

[std_msgs/Header] header  

float32 angle_min  
float32 angle_max  
float32 angle_increment  
float32 time_increment  
float32 scan_time  
float32 range_min  
float32 range_max  
float32[] ranges  
float32[] intensities

这里ranges和intensities都是float32类型的数组

自定义srv消息

uint64 path_id #路径id
---
geometry_msgs/Pose2D[] path

geometry_msgs/Pose2D[] waypoints

自定义action消息

---

uint64 path_id #当前路径id

geometry_msgs/Pose2D[] path #所有路径点位姿,包括巡航点

geometry_msgs/Pose2D[] waypoints #巡航点位姿

bool success # 储存成功为true,否则为false

string message # error messages

---

uint64 path_id #当前路径id

geometry_msgs/Pose2D[] path_record #已经采样的路径点

geometry_msgs/Pose2D[] waypoints_record #已经采样的巡航点位姿

在C++中定义数组

使用它时需要包含头文件: #include<vector>
其构造函数为:

  vector();
  vector( size_type num, const TYPE &val );
  vector( const vector &from );
  vector( input_iterator start, input_iterator end );

举例:

vector<int> a;           //无参数 - 构造一个空的vector,
vector<int> a(10);       //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
vector<int> a(10,1);     //定义了10个整型元素的向量,且给出每个元素的初值为1
vector<int> a(b);        //用b向量来创建a向量,整体复制性赋值, 拷贝构造
vector<int> v3=a ;       //移动构造
vector<int> a(b.begin(),b.begin+3);   //定义了a值为b中第0个到第2个(共3个)元素
int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+6);    //从数组中获得初值,b[0]~b[5]

vector数组的一些常用操作

基本操作

    (1)a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
    (2)a.assign(4,2);        //是a只含4个元素,且每个元素为2
    (3)a.back();             //返回a的最后一个元素
    (4)a.front();            //返回a的第一个元素
    (5)a[i];                 //返回a的第i个元素,当且仅当a[i]存在2013-12-07
    (6)a.clear();            //清空a中的元素
    (7)a.empty();            //判断a是否为空,空则返回ture,不空则返回false
    (8)a.pop_back();         //删除a向量的最后一个元素
    (9)a.erase(a.begin()+1, a.begin()+3);  //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)
    (10)a.push_back(5);      //在a的最后一个向量后插入一个元素,其值为5
    (11)a.insert(a.begin()+1, 5);         //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
    (12)a.insert(a.begin()+1, 3,5);       //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
    (13)a.insert(a.begin()+1,b+3, b+6);   //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
    (14)a.size();            //返回a中元素的个数;
    (15)a.capacity();        //返回a在内存中总共可以容纳的元素个数
    (16)a.resize(10);        //将a的现有元素个数调至10个,多则删,少则补,其值随机
    (17)a.resize(10, 2);      //将a的现有元素个数调至10个,多则删,少则补,其值为2
    (18)a.reserve(100);      //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) 
    (19)a.swap(b);           //b为向量,将a中的元素和b中的元素进行整体性交换
    (20)a.begin();           // 返回指向容器第一个元素的迭代器
    (21)a.end();             // 返回指向容器最后一个元素的迭代器
    (22)a==b;                //b为向量,向量的比较操作还有!=,>=,<=,>,<
    (23) reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
   (24)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开        始复制,覆盖掉原有元素

求数组的最值

可以用max_element()及min_element()函数,二者返回的都是迭代器或指针。

需要加入头文件:#include<algorithm>
1.求数组的最大值或最小值

1)vector容器

vector<int> v;

最大值:int maxValue = *max_element(v.begin(),v.end()); 

最小值:int minValue = *min_element(v.begin(),v.end());

2)普通数组

a[]={1,2,3,4,5,6};

最大值:int maxValue = *max_element(a,a+6); 

最小值:int minValue = *min_element(a,a+6);

2.求数组最大值最小值对应的下标

1)vector容器

vector<int> v;

最大值下标:int maxPosition = max_element(v.begin(),v.end()) - v.begin(); 

最小值下标:int minPosition = min_element(v.begin(),v.end()) - v.begin();

2)普通数组


最大值下标:int maxPosition = max_element(a,a+6) - a; 

最小值下标:int minPosition = min_element(a,a+6) - a;

注意:返回的是第一个最大(小)元素的位置。

遍历数组

1.    
  struct Point
  {
      double x;
      double y;
      Point()
      {
          x = 0;
          y = 0;
      }
  };

        vector<Point> m_testPoint;
        //第一种遍历方式,下标
	cout << "第一种遍历方式,下标访问" << endl;
	for (int i = 0; i<m_testPoint.size(); ++i)
	{
 
		cout << m_testPoint[i].x << "	" << m_testPoint[i].y << endl;
	}
 
	//第二种遍历方式,迭代器
	cout << "第二种遍历方式,迭代器访问" << endl;
	for (vector<Point>::iterator iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++)
	{
		cout << (*iter).x << "	" << (*iter).y << endl;
	}
 
	//第三种遍历方式,auto关键字
	cout << "C++11,第三种遍历方式,auto关键字" << endl;
	for (auto iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++)
	{
		cout << (*iter).x << "	" << (*iter).y << endl;
	}
 
	//第四种遍历方式,auto关键字的另一种方式
	cout << "C++11,第四种遍历方式,auto关键字" << endl;
	for (auto i : m_testPoint)
	{
		cout << i.x << "	" << i.y << endl;
	}

排序数组

sort(a.begin(),a.end());     //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列

查找数组

find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

注意

C++11版本以后建议优先使用emplace_back()来代替push_back()。因为emplace_back能通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vector数组类型在ROS开发中的用法小结 的相关文章

  • 视觉SLAM融合GPS尝试

    一 前言 最近在做无人机建图的相关工作 xff0c 基本的方案是ORB SLAM2 43 Map2DFusion 在调试好代码后 xff0c 我利用大疆精灵4在附近的一个公园进行算法测试 xff0c 得到的效果图如下 xff1a 但在一些细
  • python读取与保存图片的exif信息

    图片的exif文件格式中保存了很多信息 xff0c 比如GPS经纬度 xff0c 高度 xff0c 焦距等信息 在图片的属性中可以看到这些信息 xff1a 我们可以使用python来进行exif数据的读取和保存 1 首先安装piexif p
  • ROS深度图转化为点云

    自己编写C 43 43 的ROS代码 xff0c 订阅D435i深度图像 xff0c 转化为点云数据 xff0c 并发布出去 说明 xff1a D435i本身就可以输出点云 xff0c 不需要自己编写代码 本博客的目的是通过自己编写深度图转
  • 大疆校招测评题--循环赛问题

    笔者在2022 7参加了大疆的测评题 其中有道循环赛问题 xff0c 记录下解题思路 循环赛问题 六名选手A B C D E F进行循环赛 每两名选手间比赛一次 xff0c 每名选手每天比赛一场 五天内完成循环赛 已知 xff1a 第一天C
  • Ubuntu22.04安装libudev-dev时的Bug

    新安装了Ubuntu22 04 xff0c 然后安装libudev dev xff1a sudo apt install libudev dev 发现了非常奇怪的事情 xff1a 正在读取软件包列表 完成 正在分析软件包的依赖关系树 完成
  • python爬虫教程——科研向

    引言 在科研中 xff0c 有时需要爬取网站上的文本数据 xff0c 用于统计分析 xff0c 或是制作机器学习所用的数据集 举个例子 xff0c 假如我们需要在世界野生鸟类声音网XenoCanto中 xff0c 爬取网站上的鸟类声音标签信
  • Ubuntu18.04虚拟机下安装opencv

    内容提要 xff1a 此文主要讲在Ubuntu18 04虚拟机下通过编译源码的方式安装opencv 一 首先 xff0c 安装VMware Workstations vmware下载渠道很多我是通过360软件管家下载的 安装过程默认就好 x
  • 笔记本Ubuntu18.04安装NVIDIA驱动,配置darknet环境,并跑yolov3例程(完全过程记录)

    前言 xff1a 我的笔记本电脑显卡为GTX 1050 xff0c 想利用它跑深度学习 xff0c 但是配置环境时遇到了好多问题 前前后后重装了十几次ubuntu xff0c 一个一个试网上的问题解决方案 xff0c 最终把环境搭好了 说多
  • Win7安装Ubuntu1804双系统

    靖哥哥我平时使用ubuntu不多 xff0c 所以都是在虚拟机安装ubuntn 不过因为有一次物理机强制关机 xff0c 导致虚拟机文件损坏 xff0c 此后再使用虚拟机时 xff0c 常遇到死机的情况 xff0c 所以琢磨一下安装双系统
  • C++编译之make cmake bazel模板

    前面文章介绍了C 43 43 编译过程 xff1a 预处理 编译 汇编 链接 xff0c 内容比较简单 xff0c 只要会使用命令行 xff0c 就能根据文章的内容实践操作 xff0c 直观的了解编译全过程 一个项目往往不只一两个cpp文件
  • android之Fragment(官网资料翻译)

    Fragment要点 Fragment作为Activity界面的一部分组成出现 可以在一个Activity中同时出现多个Fragment xff0c 并且 xff0c 一个Fragment亦可在多个Activity中使用 在Activity
  • 个人面试经历经验谈

    到昨天接到金蝶得Offer xff0c 我想我为期三个星期的找工作面试之旅应该是告一段落了 原以为接到Offer会有点高兴 xff0c 但是一回味这三个星期的起起落落 xff0c 便实在是高兴不起来 xff0c 虽然手上有好几个Offer可
  • linux 查看端口占用情况

    1 查看系统端口 netstat anptl显示所有正在监听的端口 2 刷选某个端口 netstat anptl grep 39 3350 39 3 查看占用端口的应用程序 ps lt PID gt 下图中可以看到端口8080 的PID 6
  • eclipse tomcat部署项目开发环境修改访问路径

    eclipse tomcat部署项目开发环境修改访问路径
  • 欢迎使用CSDN-markdown编辑器

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来 xff0c 用它写博客 xff0c 将会带来全新的体验哦 xff1a Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传
  • PLSQL 11 注册码

    PLSQL 11 注册码 注册码 xff1a Product Code xff1a 4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number xff1a 601769 password xff1a x
  • ORA-28000: the account is locked-的解决办法

    ORA 28000 the account is locked 第一步 xff1a 使用PL SQL xff0c 登录名为system 数据库名称不变 xff0c 选择类型的时候把Normal修改为Sysdba 第二步 xff1a 选择my
  • IOS中bootstrap-select 动态加载的下拉框点击不展示(已解决)

    问题描述 bootstrap select 动态加载的option 在安卓浏览器中能点击后展示 但是在ios浏览器中点击没反应 发现原因 在重新渲染方法后加了一行 s e
  • S7-PLCSIM 无法找到STEP 7 V15 许可证(必须在此计算机上安装STEP V15应用程序)。-----(已解决)

    已经安装过step7 并且已经授权过了 xff0c 但是启动时提示下图错误 记得右键已管理员身份运行
  • 新建springboot项目, pom.xml报错 Unkown error 解决思路

    新建项目pom xml 报错 网上解决思路 xff1a 1 大多都是项目右键 Maven Update Project 选中Force Update of Snapshots Releases 进行强制更新 2 1 5 改成了2 1 3 修

随机推荐

  • 嵌入式软件面试总结

    背景 先说说本人的背景 xff0c 我 xff0c 一个大专人 xff0c 从事嵌入式开发两年了 xff0c 之前在一家公司是负责单片机和物联网开发的 2020年年底我选择了裸辞 xff08 主要想出去玩 xff09 直到春节结束后 xff
  • Intel NUC安装ubuntu系统的方法

    使用intel nuc安装ubuntu系统 xff0c 试验了好多次UEFI安装 xff0c 但是结果都是开机时会出现 A bootable device 除了这句话都是黑屏的现象 原因我查了很多 xff0c 也不敢确定 xff0c 现在总
  • 白骑士的树莓派教学(二):镜像烧录

    本期内容让我们来了解一下树莓派操作系统镜像烧录的操作 xff0c 所需的设备 xff1a PC机 xff0c U盘 xff0c 树莓派相关设备 什么是镜像 xff1f 所谓镜像文件其实和ZIP压缩包类似 xff0c 它将特定的一系列文件按照
  • VS Code Remote SSH远程连接异常:Resolver error: Error: Running the contributed command

    VS Code Remote SSH远程连接异常 问题描述原因分析解决方案扩展Remote SSH首次连接插件做了什么Remote SSH对于远程Linux的要求 问题描述 通过VS Code插件Remote SSH连接一台新主机时 xff
  • PHP常用六大设计模式

    单例模式 特点 xff1a 三私一公 xff1a 私有的静态变量 xff08 存放实例 xff09 xff0c 私有的构造方法 xff08 防止创建实例 xff09 xff0c 私有的克隆方法 防止克隆对象 xff0c 公有的静态方法 xf
  • matlab中文乱码的解决(UTF-8不支持的问题)

    1 解决editor中的UTF 8不支持的问题 xff0c 需要加入下面几行 在matlab 安装的目录的bin子文件夹中找到lcdata xml文件 xff1a 打开加入 lt Locale entries example gt lt l
  • FreeRTOS分析

    freertos是一个轻量级的rtos xff0c 它目前实现了一个微内核 xff0c 并且port到arm7 avr pic18 coldfire等众多处理器上 xff1b 目前已经在rtos的市场上占有不少的份额 它当然不是一个与vxw
  • STM32之FreeRTOS

    学习操作系统 xff0c 我并没有一开始就学习UCOS xff0c 而是选择了FreeRTOS FreeRTOS可以方便地搭建在各个平台上 xff0c 因为汇编相关 xff0c 都已经由官方完成 xff0c 我们要做的仅是添加自己的代码 x
  • FrankMocap Fast monocular 3D Hand and Body Motion Capture by Regression and Intergretion

    paper title FrankMocap Fast monocular 3D Hand and Body Motion Capture by Regression and Intergretion paper link https ar
  • 矩阵中的路径(C++)

    题目 xff1a 请设计一个函数 xff0c 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中的任意一个格子开始 xff0c 每一步可以在矩阵中向左 xff0c 向右 xff0c 向上 xff0c 向下移动一个格
  • TensorFlow入门(五)多层 LSTM 通俗易懂版

    欢迎转载 xff0c 但请务必注明原文出处及作者信息 64 author huangyongye 64 creat date 2017 03 09 前言 根据我本人学习 TensorFlow 实现 LSTM 的经历 xff0c 发现网上虽然
  • 程序员面试经历

    现在找工作 已经没有了毕业以后那时候找工作的那种紧张心情 自从在上家公司离职以后 自己进行了一段时间的工作 世界上本来没有面霸 面试的多了 也就成了面霸 不得不承认 一开始自己面试是有些紧张 但是 面试的多了 也就不觉得紧张 反而有些平淡了
  • keil中快速注释一段代码

    方法一 xff1a 在该段代码的前面加 在该段代码的后面加 代码 方法二 xff1a 自行添加快捷键 lt 1 gt 点击configuration lt 2 gt 点击shortcut keys xff0c 选择Edit Advanced
  • java实习两个月总结

    实习两个月总结 刚开始实习的时候激情满满 慢慢的激情也退却了 在杭州月薪3000干了两个月我自己都觉得不可思议 杭州的物价大家有目共睹 先谈谈收获 认识了java8的新特性 了解了开发中常用的工具和工具包 持续集成部署的jenkins sw
  • 一台电脑如何装3个系统操作教程

    很多小伙伴都想安装个三系统试试 xff0c 但是安装三系统需要一些装机基础才能成功安装 xff0c 电脑如何安装三系统 接下来快启动小编带大家了解电脑如何安装三系统的详细操作 xff0c 希望给走入迷途的小伙伴一些正能量 电脑三系统安装准备
  • Modbus的常见问题解答:多台设备如何连接?为什么要加终端电阻?RS485总线可挂接多少个设备?在RS485通讯中,最大传输距离是多少?

    多台RS485设备如何连接呢 xff1f 使用屏蔽双绞线 xff0c 采用手拉手菊花链式拓扑结构将网关和各串行设备节点连接起来 xff0c 并在网络起始端和末尾端设备的RS485 43 和RS485 之间各并接一个120 电阻以减少信号在两
  • ADRC学习|TD微分跟踪器(原理解析和Matlab实现)

    系列文章目录 TD微分跟踪器 原理解析和Matlab实现 状态扩张观测器 目录 系列文章目录前言微分跟踪器作用原理线性TD非线性TDTD的一个定理最速离散控制函数 Matlab实现参考文献 前言 学习韩老师的ADRC xff0c 把学习过程
  • ROS踩坑|warning:clock skew detected. Your build may be incomplete

    报错展示 warning xff1a clock skew detected Your build may be incomplete 问题分析 ROS编译时遇到这个问题95 是因为系统时钟错误了 xff0c 比如说你之前的编译的时间时20
  • ros学习|功能包相关|查找、安装、卸载删除某个功能包

    在运行别人的demo时 xff0c 是不是会出现找不到功能包的情况 所以查找 安装和卸载某个功能包是蛮重要的 查找 查询当前安装完成的所有包文件 rospack list 查询ros的所有功能包 span class token funct
  • Vector数组类型在ROS开发中的用法小结

    目录 前言数组类型在不同消息类型中的定义在ROS消息中的定义在C 43 43 中定义数组 vector数组的一些常用操作基本操作求数组的最值遍历数组排序数组查找数组注意 前言 ROS系统的一个显著优势就是分布式和灵活性 xff0c 用户可以