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. SQL Server 数据库备份语句

    ); --文件名 DECLARE @date DATETIME; --日期 ); --文件存放路径 SELECT @date = GETDATE(); --获取当前时间 --根据当前时间自动生成文件名 ...

  2. Spring高频面试题,你能答的上哪些?(高级篇)

    1.什么是 Spring 框架?Spring 框架有哪些主要模块? 2.使用 Spring 框架能带来哪些好处? 3.什么是控制反转(IOC)?什么是依赖注入? 4.请解释下 Spring 框架中的 ...

  3. Html 页面底部添加版权信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. CVE-2019-0708-BlueKeep漏洞复现

    环境 攻击机:Kali Linux IP:192.168.0.108 靶机:Windows Sever 7 SP1 旗舰版 IP:192.168.0.109 Exploit: https://gith ...

  5. Java web实现原理

    说明 最近在看一本java web和tomcat技术介绍的书籍.故此,希望通过文字总结的方式总结自己学习所获,本篇主要介绍java实现web基本的信息浏览的方法原理. web的本质 由于技术能力有限, ...

  6. ABP进阶教程8 - 自定义按钮

    点这里进入ABP进阶教程目录 在功能按钮区增加一个自定义按钮 - Add(创建课程) 添加按钮 打开展示层(即JD.CRS.Web.Mvc)的\wwwroot\view-resources\Views ...

  7. Flask 异步化

    web网站包含前端和后端, 异步处理可以用在前端, 也可以用在后端.  前端 jquery 进行 ajax 请求时, 可设置 async 属性为 true, 并为 success 设置一个 callb ...

  8. 为什么 Redis 为什么如此受欢迎

    现在大多数开发人员都会听说过 Redis.Redis 是目前市场上最好的开源内存 NoSQL 数据库之一.它为前端以及后端服务(如键值查找,队列,哈希等)提供了非常多的帮助. 一.什么是 Redis? ...

  9. 第十章 Centos7-系统进程管理

    第十章  Centos7-系统进程管理 本节所讲内容: 10.1  进程概述和ps查看进程工具 10.2  uptime查看系统负载-top动态管理进程 10.3  前后台进程切换- nice进程优先 ...

  10. Shell命令-网络操作之基础之telnet、ssh

    文件及内容处理 - telnet.ssh 1. telnet:使用TELNET协议远程登录 telnet命令的功能说明 telnet 命令用于远端登入.执行 telnet 指令开启终端机阶段作业,并登 ...