天天看點

關于在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));