1. 前言

在之前的笔记No.2 中,我们直接采用ndt_matching的方法实现定位,但需要在打开rviz中,通过2D Pose Estimate指定初始位置。加入GNSS后,可以帮助ndt_matching找到初始位置,同时如果ndt_matching在运动过程中匹配失败,GNSS可以帮助重定位。

在/ndt_matching算法中,有两个条件使用GNSS重定位:

(1) 如果设置ndt_matching的config中设置了GNSS,而非Initial Pos,那么ndt_matching会在程序初始运行中采用GNSS作为初值;

(2) 在车辆运行过程中,当topic /ndt_stat中的score值大于600(与地图匹配程度,值越大匹配的越差),同样会使用GNSS重定位。

下面介绍干货

2. GNSS读入数据配置

我们采用某品牌的GNSS设备,通过串口读入信息,所以首先在Autoware中设置为串口读入,如下图:

首先配置GNSS下的Serial GNSS的config,我们的串口GNSS设备的设备名称为/dev/ttyS0,波特率为115200,设置成功后,点击OK保存,然后点击Serial GNSS选项,这时会提示错误:

ERROR: cannot launch node of type [nmea_navsat_driver/nmea_topic_serial_reader]: nmea_navsat_driver
ROS path []=/opt/ros/kinetic/share/ros
ROS path []=/home/a/autoware/ros/src
ROS path []=/home/a/catkin_ws/src
ROS path []=/opt/ros/kinetic/share
ERROR: cannot launch node of type [nmea_navsat_driver/nmea_topic_driver]: nmea_navsat_driver
ROS path []=/opt/ros/kinetic/share/ros
ROS path []=/home/a/autoware/ros/src
ROS path []=/home/a/catkin_ws/src
ROS path []=/opt/ros/kinetic/share

这时由于Autoware中的串口驱动没有装,根据autoware/ros/src/sensing/drivers/gnss/packages/nmea_navsat/scripts/README.md文件,需要下载驱动,运行

$ sudo apt-get install ros-kinetic-nmea-navsat-driver

如果不能更新,也可以从源码下载,然后在autoware的工作空间下安装,源码的下载地址为:https://github.com/ros-drivers/nmea_navsat_driver.git,下载后切换到适合的kinetic分支即可运行。

这时在勾选Serial GNSS选项,通过查看topic /nmea_sentence,如果有输出,且在sentence中有内容,即GNSS设备数据读取成功。/nmea_sentence的数据内容:

---
header:
seq:
stamp:
secs:
nsecs:
frame_id: "/gps"
sentence: "$×××××,0,7847.600,360.000,1.663,0.720,0.0000000,0.0000000,0.00,0.000,0.000,0.000,0.000,0,0,0C*0C"

$*****代表nmea的标准,主流的标准有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL。而我们采用的传感器不是这些标准,所以需要自己写nmea的数据解析。

不同的GNSS设备,sentence的中内容的标准会有不同。

如果想了解nmea,请参考博客:https://blog.csdn.net/jickjiang/article/details/79086202

3. 数据解析

Autoware的数据解析程序为nmea2tfpose包,由于我们采用的设备不是标准协议,但我们的协议和$GPGGA很接近,所以我们采用在$GPGGA的基础上做了改进nmea2tfpose_core.cpp。

我们的修改思路为:

(1) 首先讲基站的经纬度作为原点;

(2) 采用$GPGGA的方式,将经纬度坐标系映射到以基站为原点的平面坐标系;

(3) 通过tf变换,将基站为原点的坐标系的转换到地图坐标系。

我们没有修改源码,而是将nmea2tfpose包拿出来修改,编译,然后单独发布。

nmea2tfpose包最终发布的topic为/gnss_pose。查看/gnss_pose与/ndt_pose发布的数据是否基本一致,如果基本一致,那么成功。这里我公布出部分源码,供大家参考(nmea2tfpose_core.cpp):

// 设置基站经纬度
geo_.set_origin(longitude_, latitude_);
    if (nmea.at() == "$×××××")  //heading pitch roll
{
// 直接读取gnss中的roll, pitch, yaw
position_time_ = stod(nmea.at());
roll_ = stod(nmea.at()) * M_PI / .;
pitch_ = - * stod(nmea.at()) * M_PI / .;
yaw_ = -stod(nmea.at()) * M_PI / . + M_PI*; //ROS_INFO("roll:%f, pitch:%f, yaw:%f.", roll_,pitch_,yaw_); // 根据GPGGA计算从经纬度到局部坐标系的映射
double lat = stod(nmea.at());
double lon = stod(nmea.at());
double h = stod(nmea.at());
geo_.set_llh_nmea_degrees(lat, lon, h);
}
// 基站为原点坐标系到地图坐标系的变换
tf::Pose tf_pose;
tf::poseMsgToTF(pose.pose, tf_pose);
tf::Quaternion q;
q.setRPY(, , 3.2277); // 基站为原点坐标系与地图坐标系夹角
tf::Transform tf_trans(q, tf::Vector3(-28.11, 10.79, )); // 基站为原点坐标系与地图坐标系原点的差
tf_pose = tf_trans.inverse() * tf_pose;
tf::poseTFToMsg(tf_pose, pose.pose);

4. 结果

上面的代码完成后,可以按照Autoware 笔记4的内容进行设置,这时无论车停在轨迹上的任何位置,可以直接找到位置,无需2D Pose Estimate指定初始位置。

Autoware 笔记 No. 5——基于GNSS的定位的更多相关文章

  1. 驱动开发学习笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

    驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflas ...

  2. Autoware 培训笔记 No. 2——基于点云的定位

    1. 前言 构建出地图后,应该测试点云地图定位效果,这里用到ndt的scan_matching方法,这是一种scan-to-map方法.这里用的是我们自己采集的数据进行仿真. 本章内容有和No. 1重 ...

  3. python appium笔记(二):元素定位

    #这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境 #环境配置和一些参数的意思不清楚可以看我上一篇python appium笔记(一) ...

  4. Python+Selenium笔记(六):元素定位

      (一)  前言 Web应用以及包含超文本标记语言(HTML).层叠样式表(CSS).JS脚本的WEB页面,基于用户的操作(例如点击提交按钮),浏览器向WEB服务器发送请求,WEB服务器响应请求,返 ...

  5. ROS学习笔记八:基于Qt搭建ROS开发环境

    1 前言 本文介绍一种Qt下进行ROS开发的完美方案,使用的是ros-industrial的Levi-Armstrong在2015年12月开发的一个Qt插件ros_qtc_plugin,这个插件使得Q ...

  6. (2)《Head First HTML与CSS》学习笔记---img与基于标准的HTML5

    1.浏览器处理图像的过程: 1.服务器获取文件,显示出文本结构,以及预留默认的大小给<img>(如果该<img>有width-1值和height-1值,则根据这个值提前设好页面 ...

  7. (一)学习了解OrchardCore笔记——开篇:基于asp.net core的OrchardCore

    想深入了解OrchadCore源码许久了,但是读源码的时候遇到很多问题而网上的参考资料太少了(几乎都是OrchadCms不带OrchardCore的),现在解决得差不多了,做下笔记方便自己查看,有错误 ...

  8. 【读书笔记】《基于UG NX系统的二次开发》笔记

    我有几本二次开发的书,但是从头到尾读下来的却没有几本.有时候遇到困难发帖求助,好不容易得到答案.后来却发现在书上的前几章就有详细介绍.读书笔记不仅是一种记录,更是一种督促自己读书的方法.还有一个原因是 ...

  9. Django笔记&教程 7-1 基于类的视图(Class-based views)介绍

    Django 自学笔记兼学习教程第7章第1节--基于类的视图(Class-based views)介绍 点击查看教程总目录 1 介绍 Class-based views (CBVs) are view ...

随机推荐

  1. rxjava介绍

    Observable 在RxJava1.x中,最熟悉的莫过于Observable这个类了,笔者刚使用RxJava2.x时,创建一个Observable后,顿时是懵逼的.因为我们熟悉的Subscribe ...

  2. 【linux】切换到root用户,并重置root用户密码

    1.切换当前用户 到 root用户 sudo -i 2.重置root用户密码 sudo passwd root

  3. AFNetworking遇到错误 Request failed: unacceptable content-type: text/html

    iOS 使用AFNetworking遇到错误 Request failed: unacceptable content-type: text/html 原因: 不可接受的内容类型 “text/html ...

  4. MBProgressHUD源码(上)

    本篇博文记录MBProgressHUD源码学习过程,从官方提供的Demo项目入手,一步步了解其代码结构,学习它使用的技术,体会作者的编程思想. 一.结构 我们先来看下MBProgressHUD的结构, ...

  5. Android JS打开原生应用

    设置App通过网页JS,唤醒打开本地应用. 在AndroidManifest 中,在应用启动页配置下,添加android:exported="true",设置category 添加 ...

  6. 论文学习-混沌系统以及机器学习模型-11-29-wlg

    混沌系统以及机器学习模型 概述: 必要条件下: negative values of the sub-Lyapunov exponents. 通过rc方法, 可以在参数不匹配的情况下,实现输入信号,混 ...

  7. 概要设计文档(final)

    1. 引言部分 引言部分主要说明编写目的.系统的范围和参考资料等. 1.1目的 该文档的目的是描述“自习吧”微信小程序的概要设计,主要内容包括系统功能简介.系统结构设计.模块设计和界面设计等. 本文档 ...

  8. oracle自定义存储过程:删除表(无论表是否存在)和检测表是否存在

    oracle删除表,如果表不存在,就报错,在跑大型脚本(脚本长且耗时的时候)比较麻烦,一般希望的是点开始然后脚本运行到结束,不可能一直盯着屏幕等弹出提示手工点掉,mysql就很好有drop table ...

  9. rabbitmq和kafka大概比较

    两者都是一个分布式架构 kafka 具有较高的吞吐量,rabbimq 吞吐量较小 rabbitmq 的可靠性更好,确认机制(生产者和 exchange,消费者和队列),支持事务,但会造成阻塞,委托(添 ...

  10. Mysql—数据备份与恢复

    数据备份 # 备份单个数据库 [root@localhost ~]# mysqldump -h主机名 -u用户名 -p密码 数据库名字 > 备份的数据库名字.sql [root@localhos ...