【QoS】消息服务质量

【QoS】消息服务质量

QoS策略

※一组QoS策略组合在一起 形成一个QoS配置文件

预定义QoS配置文件

cat /opt/ros/$ROS_DISTRO/include/rmw/rmw/qos_profiles.h

默认配置
image
image
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配置

image

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;
}

->订阅者和发布者队列深度不同->不兼容
image
image
->修改订阅者配置:同样使用传感器配置
image
image

自定义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);

image

posted @ 2025-01-08 14:02  White_ink  阅读(406)  评论(0)    收藏  举报