热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

目录前言数组类型在不同消息类型中的定义在ROS消息中的定义在C中定义数组vector数组的一些常用操作基本操作求数组的最值遍历数组排序数组查找数组注意前言ROS系统的一个显著优势




目录


  • 前言
  • 数组类型在不同消息类型中的定义
    • 在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( size_type num, const TYPE &val );
vector( const vector &from );
vector( input_iterator start, input_iterator end );

举例:

vector a; //无参数 - 构造一个空的vector,
vector a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
vector a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
vector a(b); //用b向量来创建a向量,整体复制性赋值, 拷贝构造
vector v3=a ; //移动构造
vector a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
int b[7]={1,2,3,4,5,9,8};
vector 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(); // 返回指向容器最后一个元素的迭代器
&#xff08;22&#xff09;a&#61;&#61;b; //b为向量&#xff0c;向量的比较操作还有!&#61;,>&#61;,<&#61;,>,<
(23) reverse(a.begin(),a.end()); //对a中的从a.begin()&#xff08;包括它&#xff09;到a.end()&#xff08;不包括它&#xff09;的元素倒置&#xff0c;但不排列&#xff0c;如a中元素为1,3,2,4,倒置后为4,2,3,1
&#xff08;24&#xff09;copy(a.begin(),a.end(),b.begin()&#43;1); //把a中的从a.begin()&#xff08;包括它&#xff09;到a.end()&#xff08;不包括它&#xff09;的元素复制到b中&#xff0c;从b.begin()&#43;1的位置&#xff08;包括它&#xff09;开 始复制&#xff0c;覆盖掉原有元素

求数组的最值

可以用max_element&#xff08;&#xff09;及min_element&#xff08;&#xff09;函数&#xff0c;二者返回的都是迭代器或指针。

需要加入头文件&#xff1a;#include
1.求数组的最大值或最小值

1&#xff09;vector容器

vector v;
最大值&#xff1a;int maxValue &#61; *max_element(v.begin(),v.end());
最小值&#xff1a;int minValue &#61; *min_element(v.begin(),v.end());

2&#xff09;普通数组

a[]&#61;{1,2,3,4,5,6};
最大值&#xff1a;int maxValue &#61; *max_element(a,a&#43;6);
最小值&#xff1a;int minValue &#61; *min_element(a,a&#43;6);

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

1&#xff09;vector容器

vector v;
最大值下标&#xff1a;int maxPosition &#61; max_element(v.begin(),v.end()) - v.begin();
最小值下标&#xff1a;int minPosition &#61; min_element(v.begin(),v.end()) - v.begin();

2&#xff09;普通数组


最大值下标&#xff1a;int maxPosition &#61; max_element(a,a&#43;6) - a;
最小值下标&#xff1a;int minPosition &#61; min_element(a,a&#43;6) - a;

注意&#xff1a;返回的是第一个最大&#xff08;小&#xff09;元素的位置。


遍历数组

1.
struct Point
{
double x;
double y;
Point()
{
x &#61; 0;
y &#61; 0;
}
};
vector m_testPoint;
//第一种遍历方式&#xff0c;下标
cout <<"第一种遍历方式&#xff0c;下标访问" < for (int i &#61; 0; i {

cout < }

//第二种遍历方式&#xff0c;迭代器
cout <<"第二种遍历方式&#xff0c;迭代器访问" < for (vector::iterator iter &#61; m_testPoint.begin(); iter !&#61; m_testPoint.end(); iter&#43;&#43;)
{
cout <<(*iter).x <<" " <<(*iter).y < }

//第三种遍历方式&#xff0c;auto关键字
cout <<"C&#43;&#43;11,第三种遍历方式&#xff0c;auto关键字" < for (auto iter &#61; m_testPoint.begin(); iter !&#61; m_testPoint.end(); iter&#43;&#43;)
{
cout <<(*iter).x <<" " <<(*iter).y < }

//第四种遍历方式&#xff0c;auto关键字的另一种方式
cout <<"C&#43;&#43;11,第四种遍历方式&#xff0c;auto关键字" < for (auto i : m_testPoint)
{
cout < }

排序数组

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

查找数组

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

注意

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







推荐阅读
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 本文介绍了一个使用Spring框架和Quartz调度器实现每周定时调用Web服务获取数据的小项目。通过详细配置Spring XML文件,展示了如何设置定时任务以及解决可能遇到的自动注入问题。 ... [详细]
  • 本文介绍了如何解决 ChinaASP.Upload 错误 '80040002',即必须添加版权信息的问题,并提供了详细的步骤和注意事项。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
author-avatar
小艾6456
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有