目前在学习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() 不断获取实时的订阅者数量,当发现订阅者数量发生变化时,发布一次话题(广播)。
然而,当我保持此次订阅,并重新创建另外一个订阅时,另外新创建的订阅会收到信息,这是正常的。但是原来打开的那个订阅,并没有收到新的信息。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwQGM4kjMmJzMlJzNzMWZ5gDM1QDOygDM0QmMiZ2M3kzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
所以,这个 /robot_description 话题是如何做到:
a.在订阅者订阅时立马发送一次信息给订阅者。
b.而且还是独立发送的。
答案是QoS,
参考这里
所以,假如我们也想要达到同样的效果,可以这样:
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));