室外gps+imu小车系列(一)——双天线gps话题的发布
所用设备的输出:
[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话题的发布相关推荐
- GPS项目实战系列1:GPS数据解析1
前面写了一系列关于Linux的文章,从这一篇开始换个题目,叫做GPS项目实战系列,后面的很多篇内容都会围绕着这个项目展开.这个项目要完成的任务,可以参考之前的文章:https://topsemic.c ...
- Quaternion kinematics for error state kalman filter实现GPS+IMU融合,(附源码)
最近在学习kalman滤波相关的知识,恰好工作可能需要使用ESKF算法,因此将Joan Sola大神的书看了一遍,同时推导了相关的公式.俗话说得好:"Talk is cheap, show ...
- 【智能无线小车系列十一】利用GPS 模块定位我的小车
本章介绍一个额外的扩展模块:GPS定位模块,借助该模块我们可以实现小车的地理位置定位的功能. 使用从淘宝上淘得一个GPS模块,拿来测试一下: 下面直接贴一下关键的代码实现,仅供参考: get_gps_ ...
- GPS/IMU事后差分
无人机机载高动态GPS/IMU事后差分 无人机机载差分GPS航空摄影测量技术作为一种新型摄影测量手段,其影像数据获取响应速度快,4D产品涵盖三维信息量丰富,在反映地物地貌特征和类别上更为直观.形象,成 ...
- matlab智能小车避障,Arduino智能小车系列教程4——超声波避障
Arduino智能小车系列教程4--超声波避障 Arduino智能小车系列教程 准备材料 超声波模块HC-SR04 舵机固定架 舵机安装 超声波接线 代码测试 代码详解 int getDistance ...
- gps数据转坐标c语言,GPS原始坐标转百度地图坐标(纯C代码)
一.环境介绍 GPS模块型号:中科微电子GPS模块 GPS输出的原始数据帧: $GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0. ...
- gps服务器修改,怎么修改照片GPS信息?修改照片GPS定位方法
GPS定位是一款便捷的地理位置显示,但是有时候我们并不想让图片显示出来,你知道怎么修改照片GPS信息的吗?接下来我们一起往下看看修改照片GPS定位方法吧. 方法步骤 1.运行"MagicEX ...
- 智能小车系列文章之小车简介
智能小车系列文章之小车简介 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成 ...
- 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:中 ...
最新文章
- Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[-0]情况]
- c语言第四章作业,大学C语言第四章作业答案
- itext转html为pdf 锚点,ITEXT输出pdf..docx
- symantec 5220牛刀小试系列(二)
- 下单问题分析及解决方式
- Zookeeper01_必看
- FORM级别和数据库级别的Trace
- petshop4.0 详解之三(PetShop数据访问层之消息处理)
- python中集合变量_详解python的变量缓存机制
- 数据结构——划分树模板
- c语言写成汇编语言程序 冒泡排序,MIPS汇编程序设计——冒泡排序
- 【2017宁波联考】生成树
- 耗时30分钟C++制作象棋程序,网友:优秀啊!
- 2015年3月TIOBE编程语言排行榜单
- 蓝牙耳机怎么挑选?鹏鹏数码盘点2023口碑蓝牙耳机排行榜
- Pandas+Pyecharts | 某APP大学生用户数据分析可视化
- python游戏引擎3d_一个人独立开发 3D 游戏引擎可能吗?
- 你真的了解什么是Beta测试?完整测试指南
- 字符串String类型 、数组 Array类型
- 2021年晋城二中高考成绩查询,太骄傲 | 晋城八大高中高考成绩全记录!请为晋城学子点赞!...
热门文章
- 机器人工程毕业设计☞区域覆盖(扫地)
- [ZZ] [siggraph10]color enhancement and rendering in film and game productio
- nessus无限ip扫描w10版
- 阿里巴巴架构师,20页PPT讲透2亿用户的钉钉系统架构实践
- 电动汽车整车控制器 VCU 电动汽车整车控制含canbootloader 基于飞思卡尔MC9S12XEP100整车控制器 VCU方案
- 彻底弄懂 ASCII 码的所有符号
- 说说IOPS的重要指标
- vivado下QSFP模块调试遇到的一些坑和调试简单记录
- django 快速入门
- 爬虫:爬取某壳长租公寓数据