栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ROS2初步:用Topic基本通信

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ROS2初步:用Topic基本通信

一、提要

        对于话题通信,学过一点ROS知识的都不陌生,然而,转化成ROS2实现,就得需要老老实实再走一遍,这是因为ROS2得机理与ROS1差别太大;ROS2的开发团队水平更高,ROS2的代码更抽象,因而更需要付出精力去磨练。对于从没有学过ROS1的,我建议大家直接从ROS2学起,这样省去很大精力。学习ROS2更实在的理由是,许多导航模型都在ROS2建立的,不懂ROS2将很难看懂。好,本篇将示范如何生成一个Topic发布者,和一个接收者的开发过程。

二、场景设置 2.1 网上对弈机器

(假如用ros2实现对弈,那么,第一步需要消化topic通信)

三、实现 3.1 新建工作空间
mkdir -p mytry_ws/src
cd  mytry_ws/src

mkdir -p: 递归创建目录,即使上级目录不存在,会按目录层级自动创建目录

3.2 创建工作包

cd  mytry_ws/src

ros2 pkg create mytopic --build-type ament_cmake --dependencies rclcpp std_msgs

注意语法:

ros2 pkg create mytopic --build-type ament_cmake --dependencies  rclcpp std_msgs

以上实质性参数有三个:

  • mytopic:        包名称
  • --build-type ament_cmake:     编译器是ament_cmake
  • --dependencies  rclcpp std_msgs:        依赖包指定为rclcpp、std_msgs;
  • 在ros2_ws/src/mytopic/src下创建lambda.cpp和sublambda.cpp

3.3 lambda.cpp节点创建

#include 
#include 
#include 

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using namespace std::chrono_literals;



class MinimalPublisher : public rclcpp::Node
{
public:
  MinimalPublisher()
  : Node("minimal_publisher"), count_(0)
  {
    publisher_ = this->create_publisher("topic", 10);
    auto timer_callback =
      [this]() -> void {
        auto message = std_msgs::msg::String();
        message.data = "Hello, world! " + std::to_string(this->count_++);
        RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
        this->publisher_->publish(message);
      };
    timer_ = this->create_wall_timer(500ms, timer_callback);
  }

private:
  rclcpp::TimerBase::SharedPtr timer_;
  rclcpp::Publisher::SharedPtr publisher_;
  size_t count_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared());
  rclcpp::shutdown();
  return 0;
}
  •      时光运算符  

        这些运算符在命名空间 std::literals::chrono_literals 中声明,其中文字和 chrono_literals 都是内联命名空间。可以使用命名空间 std::literals、使用命名空间 std::chrono_literals 和使用命名空间 std::literals::chrono_literals 来访问这些运算符。

        此外,在命名空间 std::chrono 中,指令 using namespace literals::chrono_literals;由标准库提供,因此如果程序员使用 using namespace std::chrono;为了访问 chrono 库中的类,相应的文字运算符也变得可见。

  • 你的类继承了Node后成为正式节点
class MinimalPublisher : public rclcpp::Node

构造函数中,直接用父类定义节点名称;和其它属性:计数器

 MinimalPublisher()
  : Node("minimal_publisher"), count_(0)
  • 定义发送字符串的发布器,字符串最长为10;

3.4 sublambda.cpp节点创建
#include 

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class MinimalSubscriber : public rclcpp::Node
{
public:
  MinimalSubscriber()
  : Node("minimal_subscriber")
  {
    subscription_ = this->create_subscription(
      "topic",
      10,
      [this](std_msgs::msg::String::UniquePtr msg) {
        RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
      });
  }

private:
  rclcpp::Subscription::SharedPtr subscription_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared());
  rclcpp::shutdown();
  return 0;
}
3.5 修改Cmakelist.txt

1)依赖项追加

        如果新建功能包的时候没有加--dependencies rclcpp std_msgs等功能包, 则需要手动添加: (任意位置均可)

  • find_package(rclcpp REQUIRED)
  • find_package(std_msgs REQUIRED)


2)可执行节定义

  •         add_executable()

            让编译器编译Customer.cpp和KFC.cpp这两个文件. 并生成可执行文件Customer_node和KFC_node

  •         ament_target_dependencies

             添加编译的依赖

add_executable(publisher_lambda lambda.cpp)
ament_target_dependencies(publisher_lambda rclcpp std_msgs)
add_executable(subscriber_lambda sublambda.cpp)
ament_target_dependencies(subscriber_lambda rclcpp std_msgs)

3)将编译好的文件安装到正确路径

install(TARGETS
  publisher_lambda
  subscriber_lambda
  DESTINATION lib/${PROJECT_NAME}
)

3.6 修改package.xml

        同样地, 新建功能包的时候没有加--dependencies rclcpp std_msgs等功能包, 则需要手动添加, 放置于标签下

rclcpp
std_msgs
也可自行修改下面这些声明, 与实现功能无关, 但是最好写全

0.0.0
TODO: Package description
fanziqi
TODO: License declaration
 

3.7 编译
  • 注意:编译的时候以包为单位,指定哪个包,就编译哪个。

--packages-select指定编译customer_and_kfc功能包

  • colcon build --packages-select mytopic 

win10进入终端:

 启动ROS2的环境设定:

call C:optrosfoxyx64local_setup.bat
colcon build


3.8 刷新环境
  • 在ubuntu下:

[echo "source /ros2_ws/install/setup.zsh" >> ~/.bashrc  ]
source ~/.bashrc

  • 在Window10下:
cd mytry_ws

call  install/setup.bat


 

3.9 运行


新建一个终端窗口, 运行发布节点

ros2  run mytopic  publisher_lambda

再另新建一个终端, 运行收听节点

ros2 run mytopic subscriber_lambda  

此时应该可以看见:

3.10 相关工具测试

  • rqt_graph

使用rqt_graph这个工具可以可视化显示节点和话题的连接关系。

另起一个终端, 输入

rqt_graph

 上图 展示了ROS计算图的网络形态, 可以清楚地看出一个节点的输入和输出是什么.

  • 查看系统中所有话题
ros2 topic list

C:WindowsSystem32>ros2 topic list
/parameter_events
/rosout
/topic

想具体查看每个话题传输的数据类型, 则添加-t

  • ros2 topic list -t

C:WindowsSystem32>ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/topic [std_msgs/msg/String]

输出实时话题内容

  • ros2 topic echo /topic

查看主题信息

  • ros2 topic info /hamburger

C:WindowsSystem32>ros2 topic info /topic
Type: std_msgs/msg/String
Publisher count: 1
Subscription count: 1

通过如下指令查看这个数据类型的具体数据结构

  • ros2 interface show std_msgs/msg/String

可以看到, std_msgs/msg/String中包含了string data

发布一个话题消息

  • ros2 topic pub /topic std_msgs/String "data: Hello ROS Developers"

 注意:此语句较难,需要多多注意,如海龟的发布语句:

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

查看某一个话题的发布频率

  • ros2 topic hz /topic

 参考文:

ROS2入门教程——14. 创建ROS2功能包 - 古月居 (guyuehome.com)

(1条消息) Ubuntu_范子琦的博客-CSDN博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019113.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号