ROS2学习(13)------ 数据分发服务DDS

打印 上一主题 下一主题

主题 1996|帖子 1996|积分 5990


  • 操纵系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11
  • ROS版本:2
ROS 2(Robot Operating System 2)采用了Data Distribution Service (DDS)作为其底层通讯中心件,以提供灵活且强盛的分布式通讯能力。与ROS 1使用的基于TCPROS/UDPROS的通讯机制差别,ROS 2通过DDS支持更广泛的特性,如发现机制、服务质量(QoS)策略和跨网络的无缝通讯等。以下是关于ROS 2中DDS的一些关键点分析:
算法描述

1. DDS简介
DDS是一个由对象管理组(OMG)定义的用于实时系统中的数据分发的中心件标准。它旨在为分布式应用提供高效可靠的数据传输服务,特别适用于需要高可靠性、实时性和可扩展性的情况。
2. ROS 2与DDS的关系
ROS 2通过抽象层封装了对多种DDS实现的支持,答应用户在差别的DDS供应商之间进行选择。这使得ROS 2不但能够利用DDS提供的高级特性,还能根据具体应用场景的需求选择最恰当的DDS实现。
支持的DDS实现包罗但不限于:


  • Fast DDS(原eProsima Fast RTPS):ROS 2默认使用的DDS实现。
  • Cyclone DDS:性能良好,社区活泼。
  • RTI Connext 和 ADLINK OpenSplice:商业级办理方案,适用于需要高度可靠性和性能的企业级应用。
3. 使用DDS的优势


  • 自动发现机制:节点可以自动发现网络上的其他参与者,并建立连接,无需手动设置。
  • 服务质量(QoS)策略:提供了丰富的QoS设置选项,答应用户根据需求调解通讯行为,例如长期化消息、历史深度、可靠性等。
  • 多语言支持:虽然ROS 2紧张使用C++和Python,但DDS本身支持多种编程语言,便于集成到异构情况中。
  • 安全性:一些DDS实现提供了加密、身份验证等安全功能,增强了系统的安全性。
4. 如何在ROS 2中选择和设置DDS实现


  • 选择DDS实现:可以通过设置RMW_IMPLEMENTATION情况变量来指定要使用的DDS实现。例如,使用Cyclone DDS:
  1. export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
复制代码


  • 安装DDS实现:通常需要额外安装你想要使用的DDS实现。例如,在Ubuntu上安装Cyclone DDS:
  1. sudo apt update && sudo apt install ros-<ros2-distro>-rmw-cyclonedds-cpp
复制代码


  • QoS设置:可以在创建发布者、订阅者、客户端或服务时指定QoS策略。以下是一个简朴的例子,展示了如何为发布者设置可靠的QoS策略:
  1.     auto qos = rclcpp::QoS(rclcpp::KeepLast(10));
  2.     qos.reliable();
  3.     auto publisher = node->create_publisher<std_msgs::msg::String>("topic_name", qos);
复制代码
5. 留意事项


  • 兼容性题目:只管ROS 2设计为与任何符合DDS标准的实现兼容,但在实际操纵中可能会碰到某些特定于某个DDS实现的功能或限定。
  • 资源斲丧:差别的DDS实现在内存占用、CPU使用等方面可能有所差别,部署前应考虑目标平台的资源限定。
  • 安全性设置:如果需要启用安全性功能,需确保所选的DDS实现支持这些特性,并精确设置相应的安全参数。
通过上述先容,你应该对ROS 2如何利用DDS进行高效的分布式通讯有了基本相识。ROS 2联合DDS的能力,使得开辟者能够构建更加复杂、健壮的机器人系统。
DDS示例

下面我将提供一个简朴的C++示例,展示如何在ROS 2中使用DDS进行通讯。这个例子会包罗创建一个发布者和订阅者,并且我们会先容如何设置一些基本的服务质量(QoS)策略。
示例:发布者与订阅者
准备工作

确保你已经安装了ROS 2以及所需的DDS实现(如Fast DDS或Cyclone DDS)。如果没有,请参考ROS 2官方文档来安装恰当你操纵系统的版本。
创建包
首先,我们需要创建一个新的ROS 2包来存放我们的示例代码。
  1. cd ~/ros2_ws/src
  2. ros2 pkg create --build-type ament_cmake cpp_ddsdemo --dependencies rclcpp std_msgs
复制代码
这将在~/ros2_ws/src目次下创建一个名为cpp_ddsdemo的新包,并添加须要的依赖项。

编写发布者代码

在cpp_ddsdemo包的src目次下创建一个名为talker.cpp的文件,并添加以下代码:
  1. #include "rclcpp/rclcpp.hpp"
  2. #include "std_msgs/msg/string.hpp"
  3. class Talker : public rclcpp::Node {
  4. public:
  5.     Talker() : Node( "talker" )
  6.     {
  7.         publisher_ = this->create_publisher< std_msgs::msg::String >( "chatter", 10 );
  8.         auto qos_profile = rclcpp::QoS( rclcpp::KeepLast( 10 ) );
  9.         qos_profile.reliable();
  10.         timer_ = this->create_wall_timer( std::chrono::milliseconds( 500 ), std::bind( &Talker::publish_message, this ) );
  11.     }
  12. private:
  13.     void publish_message()
  14.     {
  15.         auto message = std_msgs::msg::String();
  16.         message.data = "Hello, DDS!";
  17.         RCLCPP_INFO( this->get_logger(), "Publishing: '%s'", message.data.c_str() );
  18.         publisher_->publish( message );
  19.     }
  20.     rclcpp::Publisher< std_msgs::msg::String >::SharedPtr publisher_;
  21.     rclcpp::TimerBase::SharedPtr timer_;
  22. };
  23. int main( int argc, char* argv[] )
  24. {
  25.     rclcpp::init( argc, argv );
  26.     rclcpp::spin( std::make_shared< Talker >() );
  27.     rclcpp::shutdown();
  28.     return 0;
  29. }
复制代码
编写订阅者代码

同样地,在src目次下创建另一个名为listener.cpp的文件,并添加以下代码:
  1. #include "rclcpp/rclcpp.hpp"
  2. #include "std_msgs/msg/string.hpp"
  3. class Listener : public rclcpp::Node {
  4. public:
  5.     Listener() : Node( "listener" )
  6.     {
  7.         auto qos_profile = rclcpp::QoS( rclcpp::KeepLast( 10 ) );
  8.         qos_profile.reliable();
  9.         subscription_ = this->create_subscription< std_msgs::msg::String >( "chatter", qos_profile, std::bind( &Listener::topic_callback, this, std::placeholders::_1 ) );
  10.     }
  11. private:
  12.     void topic_callback( const std_msgs::msg::String::SharedPtr msg ) const
  13.     {
  14.         RCLCPP_INFO( this->get_logger(), "I heard: '%s'", msg->data.c_str() );
  15.     }
  16.     rclcpp::Subscription< std_msgs::msg::String >::SharedPtr subscription_;
  17. };
  18. int main( int argc, char* argv[] )
  19. {
  20.     rclcpp::init( argc, argv );
  21.     rclcpp::spin( std::make_shared< Listener >() );
  22.     rclcpp::shutdown();
  23.     return 0;
  24. }
复制代码
运行演示

  1. base) dingxin@dev01:/media/dingxin/data/projects/ros2/ros2_ws$ colcon build --packages-select cpp_ddsdemo
  2. Starting >>> cpp_ddsdemo
  3. Finished <<< cpp_ddsdemo [0.10s]                  
  4. Summary: 1 package finished [0.25s]
  5. (base) dingxin@dev01:/media/dingxin/data/projects/ros2/ros2_ws$ source install/setup.bash
  6. (base) dingxin@dev01:/media/dingxin/data/projects/ros2/ros2_ws$ ros2 run cpp_ddsdemo talker &
  7. ros2 run cpp_ddsdemo listener
  8. [1] 1160036
  9. [INFO] [1748245206.358214598] [talker]: Publishing: 'Hello, DDS!'
  10. [INFO] [1748245206.358651899] [listener]: I heard: 'Hello, DDS!'
  11. [INFO] [1748245206.858210334] [talker]: Publishing: 'Hello, DDS!'
  12. [INFO] [1748245206.858562915] [listener]: I heard: 'Hello, DDS!'
  13. [INFO] [1748245207.358192083] [talker]: Publishing: 'Hello, DDS!'
  14. [INFO] [1748245207.358469411] [listener]: I heard: 'Hello, DDS!'
  15. [INFO] [1748245207.858307761] [talker]: Publishing: 'Hello, DDS!'
  16. [INFO] [1748245207.858611755] [listener]: I heard: 'Hello, DDS!'
  17. [INFO] [1748245208.358326562] [talker]: Publishing: 'Hello, DDS!'
  18. [INFO] [1748245208.358733223] [listener]: I heard: 'Hello, DDS!'
  19. [INFO] [1748245208.858240497] [talker]: Publishing: 'Hello, DDS!'
  20. [INFO] [1748245208.858584031] [listener]: I heard: 'Hello, DDS!'
  21. [INFO] [1748245209.358235552] [talker]: Publishing: 'Hello, DDS!'
  22. [INFO] [1748245209.358555639] [listener]: I heard: 'Hello, DDS!'
  23. [INFO] [1748245209.858258810] [talker]: Publishing: 'Hello, DDS!'
  24. [INFO] [1748245209.858585246] [listener]: I heard: 'Hello, DDS!'
复制代码
你应该能看到发布者每半秒发送一次消息,而订阅者吸收并打印这些消息。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表