ROS GPSD客户端/fix话题订阅节点开发及配置咨询
ROS GPSD Client Node for Subscribing to /fix Topic
我来帮你把这个GPS客户端节点补全,顺便把CMakeLists.txt和package.xml的配置细节说清楚,这样你的节点就能正常编译运行了。
Complete Node Implementation
你之前的代码已经有了基本框架,我帮你补全回调函数并完善整个节点逻辑:
#include <ros/ros.h> #include <sensor_msgs/NavSatFix.h> // 回调函数:处理接收到的GPS数据 void gpsFixCallback(const sensor_msgs::NavSatFixConstPtr& fix_msg) { // 检查GPS状态是否有效 if (fix_msg->status.status == sensor_msgs::NavSatStatus::STATUS_FIX) { ROS_INFO("Valid GPS Fix:"); ROS_INFO("Latitude: %.6f", fix_msg->latitude); ROS_INFO("Longitude: %.6f", fix_msg->longitude); ROS_INFO("Altitude: %.2f m", fix_msg->altitude); ROS_INFO("Position Accuracy: %.2f m", fix_msg->position_covariance[0]); } else { ROS_WARN("No valid GPS fix! Status code: %d", fix_msg->status.status); } } int main(int argc, char** argv) { // 初始化ROS节点 ros::init(argc, argv, "gps_client_node"); ros::NodeHandle nh; // 创建订阅者:订阅/fix话题,队列长度10,回调函数为gpsFixCallback ros::Subscriber gps_sub = nh.subscribe("/fix", 10, gpsFixCallback); ROS_INFO("GPS client node started, waiting for /fix messages..."); // 进入消息循环 ros::spin(); return 0; }
说明一下:
- 去掉了不必要的
using namespace gps_common;,因为你用的是sensor_msgs包的消息类型 - 补全了状态判断逻辑,当GPS有有效定位时打印经纬度、海拔和定位精度,否则输出警告
- main函数里完成了节点初始化、订阅者创建和消息循环的启动
CMakeLists.txt Modifications
你需要在CMakeLists.txt中添加以下配置,确保能正确编译这个节点:
cmake_minimum_required(VERSION 3.0.2) project(your_package_name) # 替换成你的包名 ## Compile as C++11, supported in ROS Kinetic and newer add_compile_options(-std=c++11) ## Find catkin macros and libraries find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs ) ## Declare a C++ executable add_executable(gps_client_node src/gps_client_node.cpp) # 替换成你的源文件路径 ## Specify libraries to link a library or executable target against target_link_libraries(gps_client_node ${catkin_LIBRARIES} ) ## Catkin specific configuration catkin_package( CATKIN_DEPENDS roscpp sensor_msgs )
关键修改点:
- 在
find_package中添加roscpp和sensor_msgs依赖 - 使用
add_executable声明你的节点可执行文件 - 通过
target_link_libraries链接ROS相关库 - 在
catkin_package中声明运行时依赖
package.xml Modifications
需要在package.xml中添加编译和运行时依赖:
<?xml version="1.0"?> <package format="2"> <name>your_package_name</name> <!-- 替换成你的包名 --> <version>0.0.0</version> <description>The your_package_name package</description> <!-- 编译依赖 --> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>sensor_msgs</build_depend> <!-- 运行时依赖 --> <exec_depend>roscpp</exec_depend> <exec_depend>sensor_msgs</exec_depend> <export> </export> </package>
Quick Test Tips
- 编译你的包:在工作空间根目录运行
catkin_make或catkin build - 启动节点前,确保有节点在发布
/fix话题(比如gpsd的ROS节点) - 运行你的节点:
rosrun your_package_name gps_client_node - 可以用
rostopic echo /fix验证话题数据是否正常
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

