3.0学习代码

 

纯白小白学习从零开始做自动驾驶定位(三): 软件框架 - 知乎过程中,看到的不会的一些知识点

1.

GeographicLib::LocalCartesian

功能就是把椭球体下的地理坐标系坐标转为ENU局部系下的坐标。

Reset 函数的作用是重置原点,LocalCartesian构造函数是默认在(0,0,0)也就是地心。

Forward (lat, lon, alt, x, y, z)函数就是把经纬高转换为ENU,前三个传入,后三个传出。

2.

ECEF坐标系
也叫地心地固直角坐标系。其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿过赤道和90度经度。

WGS-84坐标系(LLA)

也就是也叫经纬高坐标系(经度(longitude),纬度(latitude)和高度(altitude)LLA坐标系)。,全球地理坐标系、大地坐标系。可以说是最为广泛应用的一个地球坐标系,它给出一点的大地纬度、大地经度和大地高程而更加直观地告诉我们该点在地球中的位置,故又被称作经纬高坐标系。WGS-84坐标系的X轴指向BIH(国际时间服务机构)1984.0定义的零子午面(Greenwich)和协议地球极(CTP)赤道的交点。Z轴指向CTP方向。Y轴与X、Z轴构成右手坐标系。

东北天坐标系(ENU)
也叫站心坐标系以用户所在位置P为坐标原点。坐标系定义为: X轴:指向东边 .Y轴:指向北边 .Z轴:指向天顶.ENU局部坐标系采用三维直角坐标系来描述地球表面,实际应用较为困难,因此一般使用简化后的二维投影坐标系来描述。

3.

#include <pcl/point_types.h>          //PCL(点云库)对各种格式的点的支持头文件
#include <pcl/io/pcd_io.h>            //PCLPCD格式文件的输入输出头文件

CLOUD = pcl::PointCloud<POINT> //存储了数据类型为PointT的一个动态数组

4.

GNSSSubscriber() = default;

首先,什么是默认功能呢(Defaulted Function)?明确默认的函数声明式一种新的函数声明方式,在C++11发布时做出了更新。C++11允许添加“=default”说明符到函数声明的末尾,以将该函数声明为显示默认构造函数。这就使得编译器为显示默认函数生成了默认实现,它比手动编程函数更加有效。

5.

一般格式是这样的:
#ifndef <标识 >
#define <
标识 >
......
......
#endif <
标识 >


比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,所以就会报重定义错误。加上ifndef/define/endif,就可以防止这种重定义错误。

在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:

stdio.h


#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif

6.

ros::NodeHandle

一个ros的node只有一个NodeHandle,它提供这个node的对于topic的收发功能.

7.

nav_msgs/Odometry //里程计信息

8.

frame_id用来告诉你,发布的数据是来自哪一个坐标系的。

base_frame_id基础坐标系(坐标系与机器人底盘相连接)

child_frame_id子坐标系

9.

Subscriber所订阅的消息的发布频率可能是很高的,而这些操作的运算速度肯定达不到消息发布的速度。所以,如果我们要是没有取舍的对于每个消息都调用一次回调函数,那么势必会导致计算越来越不实时,很有可能当下在处理的还是几十秒以前的数据。所以,我们希望每次回调函数都处理当前时刻最新的一个消息,这就是我们的目标。
要达到这个目标有三点,第一点是要设置Publisher的queue_size等于1;第二点是要设置Subscriber的queue_size(消息队列大小)等于1;第三点非常重要,要设置Subscriber的buff_size(缓冲区大小)足够大,大于一个消息的大小。

1)Subscriber和Publisher的消息队列起什么作用,队列的大小有什么影响?

简单描述一下,Publisher的消息队列是为了缓存发布节点发布的消息,一旦队列中消息的数量超过了queue_size,那么最先进入队列的(最老的)消息被舍弃。Subscriber的消息队列是为了缓存节点接收到的信息,一旦自己处理的速度过慢,接收到的消息数量超过了queue_size,那么最先进入队列的(最老的)消息会被舍弃。所以,我们想只处理最新的消息,实际上只需要把两个queue_size都设置成1,那么系统不会缓存数据,自然处理的就是最新的消息。

2)Subscriber有消息队列缓存消息了,为什么Publisher还要有消息队列?

Publisher的消息队列是一定要有的,因为ROS中发布节点往外发送消息是基于Topic发送,而不是直接向Subscriber订阅者发送,所以必须要有一个消息队列来存放发布的消息,以供订阅者来获取。而且这个消息队列的好处是在网络差、带宽小、延时高的时候,保证数据不容易丢失。

3)Publisher有消息队列了,为什么Subscriber还要有消息队列?

由于ROS毕竟是分布式系统,Publisher和Subscriber不一定在同一台主机上,因此消息需要通过网络来交换。但是网络的性能时好时坏,如果Subscriber没有消息队列,那么每次运行Callback函数前都要先通过网络取回消息,然后才能处理。当网络很差时,就会让系统堵塞。而有消息队列的话,Subscriber就可以一边处理队列中的消息,一边通过网络缓存新的消息,而不用每次处理消息前都要临时去读一个回来。这样就增加了系统的可靠性。

4)为什么要设置缓冲区的大小?

这个缓冲区的大小是指消息队列使用的缓冲区物理内存空间大小。如果这个空间小于一个消息所需要的空间,比如消息是一副图片或者一帧点云,数据量超过了缓冲区的大小。这个时候为了保证通信不发生错误,就会触发网络通信的保护机制,TCP的Buffer会为你缓存消息。这种机制就会导致每一帧消息都被完整的缓存下来,没有消息被丢弃,感觉上就像queue_size被设置成了无穷大。

10.

GeoConverter是一种静态(“1:1”)地理空间文件数据格式转换器和坐标转换器。它是作为一个网络应用程序运行的,旨在供那些偶尔需要转换GIS和GPS数据的技术用户使用。

11.

1) gnss sensordata中完成的内容:

(1)设置原点:geo_converter.Reset(latitude, longitude, altitude);

(2)将经纬度转化成xyz:geo_converter.Forward(latitude, longitude, altitude, local_E, local_N, local_U);

12.

在ROS中表示点云的数据结构有:

第一代:sensor_msgs::PointCloud

第二代:sensor_msgs::PointCloud2

PCL中表示点云的数据结构有:

第一代:ppcl::PointCloud2< pcl::PointXYZ >

第二代:pcl::PCLPointCloud2

13.

ROSPCL数据格式

1sensor_msgs::PointCloud2pcl::PCLPointCloud2

pcl_conversions::toPCL(sensor_msgs::PointCloud2, pcl::PCLPointCloud2)

2sensor_msgs::PointCloud2pcl::PointCloud<pcl::PointXYZ>

pcl::fromROSMsg (sensor_msgs::PointCloud2, pcl::PointCloud<pcl::PointXYZ>);

PCLROS数据

1pcl::PCLPointCloud2sensor_msgs::PointCloud2

pcl_conversions::fromPCL(pcl::PCLPointCloud2, sensor_msgs::PointCloud2);

2pcl::PointCloud<pcl::PointXYZ>sensor_msgs::PointCloud2

pcl::toROSMsg (pcl::PointCloud<pcl::PointXYZ>,sensor_msgs::PointCloud2);

PCL中数据互转

1pcl::PCLPointCloud2pcl::PointCloud <pcl::PointXYZ>

pcl::fromPCLPointCloud2(pcl::PCLPointCloud2,pcl::PointCloud<pcl::PointXYZ>);

2pcl::PointCloud<pcl::PointXYZ>pcl::PCLPointCloud2

pcl::toPCLPointCloud2(pcl::PointCloud<pcl::PointXYZ>, pcl::PCLPointCloud2);

———————————————

原文链接:ROS中PCL数据转换_wangmin-CSDN博客

14.

uint32 seq //存储原始数据类型uint32

time stamp //存储ROS中的时间戳信息

string frame_id //用于表示和此数据关联的帧,在坐标系变化中可以理解为数据所在的坐标系名称

15.

msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。

注意,在构建的时候,我们只需要"message_generation"。然而,在运行的时候,我们只需要"message_runtime"。

16.

node 节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。

Message 消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。

Topic 话题,节点可以发布消息到话题,也可以订阅话题以接收消息。

Master 节点管理器,ROS名称服务 (比如帮助节点找到彼此)。

Rosout 节点用于收集和记录节点调试输出信息,所以它总是在运行的。

节点与节点之间通过话题相互通信,话题之间的通信是通过在节点之间发送ROS消息实现的,发布器和订阅器之间必须发送和接收相同类型的消息,话题的类型是由发布在它上面的消息类型决定的。

————————————————

原文链接:我的ROS入门(五):总算搞通ROS的服务节点订阅发布消息话题了_liulj95的博客-CSDN博客_ros节点发布消息

17.

nodehandle包含两个很重要的函数advertise和subscribe,两个函数的共同目的是,通知master我想在话题chatter上发布或订阅消息。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值