先来看到 launch 文件夹,有三个 launch 文件,也不知道从哪看起,就从第一个看看先。
第一个文件为 gps_data_get.launch ,内容如下
<launch>
<!-- 获取GPS数据节点 -->
<include file="$(find gps_driver)/launch/gps_log.launch"/>
<node name="gps_geter" pkg="gps_driver" type="gps_talker_node" output="screen">
</node>
</launch>
第一个 <launch> 是文件的标签,反正每个 launch 文件都得有
然后就是 <include> 这个 标签允许将另一个 launcha 文件导入到当前文件,就是导入 前面路径 下的 gps_log.launch 文件,我懂。
先看下一条, <node> 这个 标签是启动一个节点,roslaunch 不提供节点开始的顺序保证,这个是特意的,没有办法知道哪个节点完全 初始化了,所以启动 代码必须在启动顺序上鲁棒性比较强。(鲁棒性-健壮和强壮的意思,Robust的音译) 。
启动了一个 名叫“gps_geter”的节点,pkg是节点的包,此个launch文件的包就是在 gps_driver里面。type是节点类型,必须有相应的同名的可执行文件,就是在Cmakelist文件里面修改的生成的可执行文件的名称。
pkg 和 type 两个属性结合起来,就等同于在终端中使用rosrun命令执行节点。
output 为 "screen"时,将节点的标准输出打印到屏幕终端,为 "log"时,将发送到log文件。默认 是log选项。
现在跳转 到gps_log.launch文件。
<?xml version="1.0"?>
<launch>
<node name="gps_log" pkg="gps_driver" type="gps_log_node">
</node>
</launch>
这个launch 文件开启了一个在"gps_driver"包下叫 gps_log的节点。
还有一个 launch文件“GPS_IMU_odom.launch,里面 内容不再当前的 "gps_driver"里,所以暂时不管,按名字看应该是融合gps、imu、odom数据的启动文件。内容如下
<?xml version="1.0"?>
<launch>
<node name="gps_conv" pkg="gps_common" type="utm_odometry_node" output="screen">
<!-- <remap from="odom" to="vo"/> -->
<remap from="fix" to="inspvax" />
<param name="rot_covariance" value="99999" />
</node>
</launch>
三个 launch 文件解析完毕,开启了两个节点,“gps_geter”和“gps_log”,先看重要的“gps_geter”。
在src文件找了一圈,没看到gps_geter这个名字的cpp文件,倒是看到了 gps_log.cpp,不,我偏要看gps_geter。
哦哦,弄错了,应该是找gps_talker_node 节点,去CMakeLists.txt文件里面翻了一下,看到这些
add_executable(gps_talker_node
src/talker.cpp
src/gps.cpp
src/message_extractor.cpp
src/gpgga.cpp
src/gptra.cpp
src/heading.cpp
src/bestpos.cpp
src/inspvax.cpp
src/inspva.cpp
src/corrimudata.cpp
src/parsing_utils.cpp
src/localfile_port.cpp
src/header.cpp)
add_executable(gps_listener_node src/listener.cpp)
add_executable(gps_log_node src/gps_log.cpp)
target_link_libraries(gps_talker_node ${catkin_LIBRARIES})
target_link_libraries(gps_listener_node ${catkin_LIBRARIES})
target_link_libraries(gps_log_node ${catkin_LIBRARIES})
add_dependencies(gps_talker_node ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(gps_listener_node ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(gps_log_node ${PROJECT_NAME}_generate_messages_cpp)
就是说,这个gps_talker_node可执行文件,是由以下13个cpp文件生成的。
先来 后到,cpp文件一个个 来。代码就不贴出来了,太多了,到时候直接放工程压缩包。
1、talker.cpp
// ROS节点初始化
ros::init(argc, argv, "gps_geter");
在 ROS 节点初始化这里看到了 gps_geter 这个名字,这个名字和launch文件可以不一样,但是最好一样。这里名字会检测在之前有没有启动同名的节点,有则 会关闭 之前的 节点。
然后发布名为三个的topic,消息类型为gps_driver::Inspvax、gps_common::GPSFix和gps_driver::ReadedBuffer;这三个消息等待填充后进行发布。
if(publish_inspvax_messages)
{
inspvax_pub_ = node.advertise<gps_driver::Inspvax>("inspvax", 100);
}
if(publish_manu_gps_common_messages)//此消息由inspvax消息填充,因此发布此消息前,必须先发布inspvax消息
{
manu_gps_common_pub_ = node.advertise<gps_common::GPSFix>("manugpscommon", 100);
}
if(publish_readed_buffer_messages)
{
readed_buffer_pub_ = node.advertise<gps_driver::ReadedBuffer>("readed_buffer", 100);
}
然后就这句代码,将很多信息进行了解析和填充。
ReadResult result = ProcessData(fd_log);
其中填充了fd_log文件,并且填充了 gpgga_msgs、gptra_msgs、heading_msgs等等这种数据,具体分析在
gps.cpp 和 message_extractor.cpp 文件里面实现,最后通过发布器,将可用信息发布出去。
详细分析 gps.cpp 和 message_extractor.cpp 这两个文件的以后再说,暂时没用起来就没太深究,大概了解了一下解析过程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)