【QoS】消息服务质量
【QoS】消息服务质量
QoS策略
※一组QoS策略组合在一起 形成一个QoS配置文件
预定义QoS配置文件
cat /opt/ros/$ROS_DISTRO/include/rmw/rmw/qos_profiles.h
默认配置
default 默认
历史记录History
仅保留最新(Keep last)(通过历史队列深度Depth配置)
全部保留(Keep all)
历史队列深度Depth
队列大小(Queue size)
可靠性Reliability
尽力而为(Best effort) 有丢包的无线网络环境
可靠传递(Reliable) 丢失后会重传
持久性(Durability)
瞬态本地(Transient local) 发布者为后续加入的订阅者保留数据
易失性(Volatile) 不保留任何数据
截止时间(Deadline)
持续时间(Duration) 消息需要在截止时间前被接收,否则会被丢弃
寿命Lifespan
持续时间(Duration)
活跃度(Liveliness)
自动(Automatic)
按主题手动(Manual by topic)
租约持续时间Liveliness Lease Duration
查看QoS配置
QoS兼容性
直接调用rclcpp::SensorDataQoS()就可获取QoS配置
#include<nav_msgs/msg/odometry.hpp>
#include<rclcpp/rclcpp.hpp>
class OdomPublisherSubscriber : public rclcpp::Node{
public:
OdomPublisherSubscriber():Node("odom_publisher_subscriber"){
//创建发布者并设置QoS为sensor
odom_publisher_=this->create_publisher<nav_msgs::msg::Odometry>(
"odom",rclcpp::SensorDataQoS()//直接调用rclcpp::SensorDataQoS()就可获取QoS配置
);
//创建订阅者(默认QoS配置)队列深度设置为5
odom_subscription_=this->create_subscription<nav_msgs::msg::Odometry>(
"odom",5,
[this](const nav_msgs::msg::Odometry::SharedPtr msg){
(void)msg;
RCLCPP_INFO(this->get_logger(),"收到里程计消息");
}
);
//创建1s定时器并指定回调函数
timer_=this->create_wall_timer(std::chrono::seconds(1),[this](){
odom_publisher_->publish(nav_msgs::msg::Odometry());
});
}
private:
rclcpp::Publisher<nav_msgs::msg::Odometry>::SharedPtr odom_publisher_;
rclcpp::Subscription<nav_msgs::msg::Odometry>::SharedPtr odom_subscription_;
rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc,char** argv){
rclcpp::init(argc,argv);
auto odom_node=std::make_shared<OdomPublisherSubscriber>();
rclcpp::spin(odom_node);
rclcpp::shutdown();
return 0;
}
->订阅者和发布者队列深度不同->不兼容
->修改订阅者配置:同样使用传感器配置
自定义QoS配置 rclcpp::QoS qos_profile
rclcpp::QoS qos_profile(10);//队列深度为10
qos_profile.reliability(RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT);//可靠性策略
qos_profile.durability(RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL);//持久性策略
qos_profile.history(RMW_QOS_POLICY_HISTORY_KEEP_LAST);//历史记录策略
qos_profile.deadline(rclcpp::Duration(1,0));//截止时间1s
odom_publisher_=this->create_publisher<nav_msgs::msg::Odometry>("odom",qos_profile);