mavros话题订阅后无法触发回调

文章讲述了如何在树莓派与Pixhawk通信中使用ROS2时遇到订阅全球定位/磁航向主题的问题,发现是由于发布者和订阅者QoS设置不匹配(发布为best_effort,需改为SensorDataQoS)。作者提供了修改后的订阅代码以解决问题。
摘要由CSDN通过智能技术生成

前提

使用树莓派与pixhawk通信,安装好mavros,树莓派与pixhawk串口连接
启动节点mavros节点后,通过ros2 topic list可以查看到一系列话题
查看话题的类型可以去wiki mavros中查看
或者使用ros2 topic info 话题名称可以查看到

问题描述

  1. 订阅话题···/mavros/global_position/compass_hdg···
this->create_subscription<std_msg::msg::Float64>("/mavros/global_position/compass_hdg", 10, callbackfunc)

回调函数

void callbackfunc(const std_msg::msg::Float64::SharedPtr msg)
{
   cout << "callbackfunc" << endl;
   cout << "sub: " << msg->data << endl;
}

编译运行节点,无法触发回调函数,一句打印都没看到
使用 ros2 topic list可以看到话题存在,但是订阅后无法获得消息

分析

使用 ros2 topic info /mavros/global_position/compass_hdg查看

Type: std_msgs/msg/Float64
Publisher count: 1
Subscription count: 1

有1个订阅者,说明已经订阅上了,话题名称和话题类型已经对上
使用工具rqt_graph查看节点之间的关系,包含了话题发布与订阅,在连接图上可以看到和预想的一致
自己写了个一模一样的话题发布出来,也可以订阅到,说明订阅者没有问题

原因

从发布者找问题,在rqt_graph图谱上可以查看发布的话题配置信息
在这里插入图片描述
其中QOS(服务质量)下的reliability: best_effort
Qos是ros2才有的,相关信息可参考这
reliability默认是reliable
既然发布话题配置了best_effort,订阅者也需要配置,否则读取不到信息

解决办法

10 -> rclcpp::SensorDataQoS()

订阅话题修改为

this->create_subscription<std_msg::msg::Float64>("/mavros/global_position/compass_hdg",  rclcpp::SensorDataQoS(), callbackfunc)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值