所用设备的输出:

[21:39:29:911] $GPTRA,043930.40,265.39,-00.05,000.00,4,20,0.00,0000*52␍␊
[21:39:29:916] $GPGGA,043930.40,2309.5803027,N,11320.5363700,E,1,20,0.7,40.0725,M,-6.810,M,,*70␍␊

其中GPTRA获取到的是航向信息,GPGGA获取到的是位置信息和差分状态信息,具体每个数字代表的是什么意思,可以查看NEMA协议
在基础的gps导航中,只要获取到小车的航向偏差,位置偏差就可以让小车按照预定的轨迹行走。这其中用到的便是航向与位置。第一步要做的就是把它们发布成话题发布出来。

使用的环境是ubuntu18.04+ros(melodic)。
代码:
gps.msg

Header header #时间包头
#string utc_time #utc时间 eg:073617.90 表示07时36分17.9秒
float64 latitude #纬度
float64 longitude #经度
int32 satellite_num #可搜索卫星数
int32 gps_status # GPS状态
float64 elevation #高程值
float64 time_diff #差分延时
float64 speed #速度
float64 roll_angle #横滚角
float64 heading_angle #航向角

pub_gps.cpp
其中串口号需要根据插入设备在自己机器上的情况进行修改。
可以先通过sudo apt-get install cutecom安装cutecom,再在终端使用sudo cutecom查看

头文件

//头文件
#ifndef _PUB_ANDROID_H
#define _PUB_ANDROID_H
#include "ros/ros.h"
#include "pub_gps/double_gps.h"
#include <sstream>
#include <serial/serial.h>
#include <ctime>
#include <iostream>
#include <cstdlib>
#include <libudev.h>
using namespace std;
tm time_struct = {0};class GPSParser {public:GPSParser();~GPSParser();void run();private:void parseData(const std::string &data);private:ros::NodeHandle nh_;ros::Publisher pub_gps_data_;serial::Serial ser_;ros::Rate loop_rate_;
};
#endif

源文件

#include "pub_gps/pub_Android.h"GPSParser::GPSParser(): loop_rate_(100)  // 定义定时器的频率为100Hz
{pub_gps_data_ = nh_.advertise<pub_gps::double_gps>("/GpsData", 100);std::string port = "/dev/tty_doubleGps";  // 假设串口号为 绑定串口号unsigned long baudrate = 115200;try {ser_.setPort(port);ser_.setBaudrate(baudrate);serial::Timeout to = serial::Timeout::simpleTimeout(1000);ser_.setTimeout(to);ser_.open();} catch (serial::IOException &e) {ROS_ERROR_STREAM("Unable to open port.");return;}if (ser_.isOpen()) {ROS_INFO_STREAM("Serial Port initialized.");} else {return;}
}GPSParser::~GPSParser()
{ser_.close();
}void GPSParser::run()
{while (ros::ok()) {if (ser_.available()) {std::string raw_data = ser_.readline();parseData(raw_data);}ros::spinOnce();loop_rate_.sleep();  // 等待定时器到期,以达到设定的频率}
}void GPSParser::parseData(const std::string &data)
{pub_gps::double_gps gps_data;std::istringstream ss(data);std::string token;std::getline(ss, token, ','); // 包头gps_data.header.stamp = ros::Time::now();gps_data.header.frame_id = "gps_link";gps_data.header.seq = 1;std::getline(ss, token, ','); // utc时间戳std::getline(ss, token, ','); // 纬度gps_data.latitude = std::stold(token);std::getline(ss, token, ','); // 经度gps_data.longitude = std::stold(token);std::getline(ss, token, ','); // 卫星数目gps_data.satellite_num = std::stoi(token);std::getline(ss, token, ','); // 差分状态gps_data.gps_status = std::stoi(token);std::getline(ss, token, ','); // 高程gps_data.elevation = std::stold(token);std::getline(ss, token, ','); // 差分延时gps_data.time_diff = std::stold(token);std::getline(ss, token, ','); // 速度gps_data.speed = std::stold(token);std::getline(ss, token, ','); // 横滚gps_data.roll_angle = std::stold(token);std::getline(ss, token); // 航向gps_data.heading_angle = std::stold(token);pub_gps_data_.publish(gps_data);
}int main(int argc, char **argv)
{ros::init(argc, argv, "gps_parser_node");GPSParser gps_parser;gps_parser.run();return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project(pub_gps)find_package(catkin REQUIRED COMPONENTSgeometry_msgsroscppsensor_msgsserialstd_msgsmessage_generation
)add_message_files(FILESdouble_gps.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(DEPENDENCIESstd_msgs
)catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES pub_gpsCATKIN_DEPENDS geometry_msgs roscpp sensor_msgs serial std_msgs message_runtime
#  DEPENDS system_lib
)include_directories(include ${catkin_INCLUDE_DIRS}
)add_executable(pub_gps src/pub_gps.cpp)add_executable(pub_Android src/pub_Android.cpp)add_dependencies(pub_gps ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})add_dependencies(pub_Android ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
target_link_libraries(pub_gps${catkin_LIBRARIES})
target_link_libraries(pub_Android${catkin_LIBRARIES}udev
)

package.xml

<?xml version="1.0"?>
<package format="2"><name>pub_gps</name><version>0.0.0</version><description>The pub_gps package</description><!-- One maintainer tag required, multiple allowed, one person per tag --><!-- Example:  --><!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --><maintainer email="pc@todo.todo">pc</maintainer><!-- One license tag required, multiple allowed, one license per tag --><!-- Commonly used license strings: --><!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --><license>TODO</license><!-- Url tags are optional, but multiple are allowed, one per tag --><!-- Optional attribute type can be: website, bugtracker, or repository --><!-- Example: --><!-- <url type="website">http://wiki.ros.org/pub_gps</url> --><!-- Author tags are optional, multiple are allowed, one per tag --><!-- Authors do not have to be maintainers, but could be --><!-- Example: --><!-- <author email="jane.doe@example.com">Jane Doe</author> --><!-- The *depend tags are used to specify dependencies --><!-- Dependencies can be catkin packages or system dependencies --><!-- Examples: --><!-- Use depend as a shortcut for packages that are both build and exec dependencies --><!--   <depend>roscpp</depend> --><!--   Note that this is equivalent to the following: --><!--   <build_depend>roscpp</build_depend> --><!--   <exec_depend>roscpp</exec_depend> --><!-- Use build_depend for packages you need at compile time: --><!--   <build_depend>message_generation</build_depend> --><!-- Use build_export_depend for packages you need in order to build against this package: --><!--   <build_export_depend>message_generation</build_export_depend> --><!-- Use buildtool_depend for build tool packages: --><!--   <buildtool_depend>catkin</buildtool_depend> --><!-- Use exec_depend for packages you need at runtime: --><!--   <exec_depend>message_runtime</exec_depend> --><!-- Use test_depend for packages you need only for testing: --><!--   <test_depend>gtest</test_depend> --><!-- Use doc_depend for packages you need only for building documentation: --><!--   <doc_depend>doxygen</doc_depend> --><buildtool_depend>catkin</buildtool_depend><build_depend>geometry_msgs</build_depend><build_depend>roscpp</build_depend><build_depend>sensor_msgs</build_depend><build_depend>serial</build_depend><build_depend>std_msgs</build_depend><build_depend>message_generation</build_depend><build_export_depend>geometry_msgs</build_export_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>sensor_msgs</build_export_depend><build_export_depend>serial</build_export_depend><build_export_depend>std_msgs</build_export_depend><exec_depend>geometry_msgs</exec_depend><exec_depend>roscpp</exec_depend><exec_depend>sensor_msgs</exec_depend><exec_depend>serial</exec_depend><exec_depend>std_msgs</exec_depend><exec_depend>message_runtime</exec_depend><!-- The export tag contains other, unspecified, tags --><export><!-- Other tools can request additional information be placed here --></export>
</package>

我使用的编程环境是vscode。把整个功能包导入自己的工作空间后,由于使用了自定义的msg文件,需要在catkin_make后把build生成的gps.h文件的路径加入到c_cpp_properties.json文件里,具体为:

配置好后使用如下指令可以发布话题

rosrun pub_gps pub_gps

然后查看话题发布和话题的频率,这里我用的是10hz

后续会写怎么用gps+imu控制小车跑起来。

室外gps+imu小车系列(一)——双天线gps话题的发布相关推荐

  1. GPS项目实战系列1:GPS数据解析1

    前面写了一系列关于Linux的文章,从这一篇开始换个题目,叫做GPS项目实战系列,后面的很多篇内容都会围绕着这个项目展开.这个项目要完成的任务,可以参考之前的文章:https://topsemic.c ...

  2. Quaternion kinematics for error state kalman filter实现GPS+IMU融合,(附源码)

    最近在学习kalman滤波相关的知识,恰好工作可能需要使用ESKF算法,因此将Joan Sola大神的书看了一遍,同时推导了相关的公式.俗话说得好:"Talk is cheap, show ...

  3. 【智能无线小车系列十一】利用GPS 模块定位我的小车

    本章介绍一个额外的扩展模块:GPS定位模块,借助该模块我们可以实现小车的地理位置定位的功能. 使用从淘宝上淘得一个GPS模块,拿来测试一下: 下面直接贴一下关键的代码实现,仅供参考: get_gps_ ...

  4. GPS/IMU事后差分

    无人机机载高动态GPS/IMU事后差分 无人机机载差分GPS航空摄影测量技术作为一种新型摄影测量手段,其影像数据获取响应速度快,4D产品涵盖三维信息量丰富,在反映地物地貌特征和类别上更为直观.形象,成 ...

  5. matlab智能小车避障,Arduino智能小车系列教程4——超声波避障

    Arduino智能小车系列教程4--超声波避障 Arduino智能小车系列教程 准备材料 超声波模块HC-SR04 舵机固定架 舵机安装 超声波接线 代码测试 代码详解 int getDistance ...

  6. gps数据转坐标c语言,GPS原始坐标转百度地图坐标(纯C代码)

    一.环境介绍 GPS模块型号:中科微电子GPS模块 GPS输出的原始数据帧: $GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0. ...

  7. gps服务器修改,怎么修改照片GPS信息?修改照片GPS定位方法

    GPS定位是一款便捷的地理位置显示,但是有时候我们并不想让图片显示出来,你知道怎么修改照片GPS信息的吗?接下来我们一起往下看看修改照片GPS定位方法吧. 方法步骤 1.运行"MagicEX ...

  8. 智能小车系列文章之小车简介

    智能小车系列文章之小车简介 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成 ...

  9. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)

    GPS坐标互转:WGS-84(GPS).GCJ-02(Google地图).BD-09(百度地图) WGS-84:是国际标准,GPS坐标(Google Earth使用.或者GPS模块) GCJ-02:中 ...

最新文章

  1. Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[-0]情况]
  2. c语言第四章作业,大学C语言第四章作业答案
  3. itext转html为pdf 锚点,ITEXT输出pdf..docx
  4. symantec 5220牛刀小试系列(二)
  5. 下单问题分析及解决方式
  6. Zookeeper01_必看
  7. FORM级别和数据库级别的Trace
  8. petshop4.0 详解之三(PetShop数据访问层之消息处理)
  9. python中集合变量_详解python的变量缓存机制
  10. 数据结构——划分树模板
  11. c语言写成汇编语言程序 冒泡排序,MIPS汇编程序设计——冒泡排序
  12. 【2017宁波联考】生成树
  13. 耗时30分钟C++制作象棋程序,网友:优秀啊!
  14. 2015年3月TIOBE编程语言排行榜单
  15. 蓝牙耳机怎么挑选?鹏鹏数码盘点2023口碑蓝牙耳机排行榜
  16. Pandas+Pyecharts | 某APP大学生用户数据分析可视化
  17. python游戏引擎3d_一个人独立开发 3D 游戏引擎可能吗?
  18. 你真的了解什么是Beta测试?完整测试指南
  19. 字符串String类型 、数组 Array类型
  20. 2021年晋城二中高考成绩查询,太骄傲 | 晋城八大高中高考成绩全记录!请为晋城学子点赞!...

热门文章

  1. 机器人工程毕业设计☞区域覆盖(扫地)
  2. [ZZ] [siggraph10]color enhancement and rendering in film and game productio
  3. nessus无限ip扫描w10版
  4. 阿里巴巴架构师,20页PPT讲透2亿用户的钉钉系统架构实践
  5. 电动汽车整车控制器 VCU 电动汽车整车控制含canbootloader 基于飞思卡尔MC9S12XEP100整车控制器 VCU方案
  6. 彻底弄懂 ASCII 码的所有符号
  7. 说说IOPS的重要指标
  8. vivado下QSFP模块调试遇到的一些坑和调试简单记录
  9. django 快速入门
  10. 爬虫:爬取某壳长租公寓数据