天天看点

关于在ROS2中订阅话题/robot_description后,立马返回相应信息的实现问题

目前在学习ROS2的过程中,发现了一个感觉有点意思的问题。

操作步骤如下

1.打开了gazebo的例程

ros2 launch gazebo_ros2_control_demos diff_drive.launch.py 
           

2.查看话题

[email protected]:~$ ros2 topic list
/clock
/diff_drive_base_controller/cmd_vel_unstamped
/diff_drive_base_controller/odom
/diff_drive_base_controller/transition_event
/dynamic_joint_states
/joint_state_broadcaster/transition_event
/joint_states
/parameter_events
/performance_metrics
/robot_description
/rosout
/tf
/tf_static
           

3.订阅话题

[email protected]:~$ ros2 topic echo /robot_description
data: <?xml version="1.0" ?><robot name="diff_drive"><!-- Base Link --><link name="chassis"><collision><origin rpy="0 0 0" xyz="-0.151...
---
           

可以看到,在订阅话题后,立马收到了话题的响应,获取到了信息。

一开始我以为是话题发布者通过 get_subscription_count() 不断获取实时的订阅者数量,当发现订阅者数量发生变化时,发布一次话题(广播)。

然而,当我保持此次订阅,并重新创建另外一个订阅时,另外新创建的订阅会收到信息,这是正常的。但是原来打开的那个订阅,并没有收到新的信息。

关于在ROS2中订阅话题/robot_description后,立马返回相应信息的实现问题

所以,这个 /robot_description 话题是如何做到:

a.在订阅者订阅时立马发送一次信息给订阅者。

b.而且还是独立发送的。

答案是QoS,

参考这里

关于在ROS2中订阅话题/robot_description后,立马返回相应信息的实现问题

所以,假如我们也想要达到同样的效果,可以这样:

rclcpp::QoS qos(10);
    qos = qos.transient_local(); // 就是这句起效
    command_subscribe = this->create_subscription<std_msgs::msg::String>("/robot_description", qos,
                         std::bind(&TopicSubscribe01::command_callback, this, std::placeholders::_1));