C++学习ros2话题机制(发布与订阅)


话题机制=>发布与订阅=>talker and listener
服务机制=>服务端与客户端=>service and client

一、创建文件和文件夹

1、结构

工作包1下的node1是发布
工作包2下的node1是订阅
在这里插入图片描述

2、创建工作空间和工作包

 mkdir workspace
 cd workspace
 mkdir src 
 cd src
 ros2 pkg create workpackage1 --build-type ament_cmake --dependencies rclcpp
 ros2 pkg create workpackage2 --build-type ament_cmake --dependencies rclcpp

在这里插入图片描述

3、直接创建node.cpp文件

二、编写节点文件(发布订阅)

1、node1.cpp(发布)

# include "rclcpp/rclcpp.hpp"//导包
# include "std_msgs/msg/string.hpp"//导入消息类型
// # include "std_msgs/msg/u_int32.hpp"//导入发布者消息类型
using std::placeholders::_1;//占一个位置
using namespace std::chrono_literals;
class SolveNode:public rclcpp::Node{//自定义节点继承public rclcpp::Node

public:
//
//构造函数
//
//
    SolveNode(std::string name):Node(name), count(0){
        //RCLCPP_INFO(this->get_logger(),"这是%s的构造函数",name.c_str());//打印节点
        puber=this->create_publisher<std_msgs::msg::String>("mytopic",10);//创建发布者
        timer = this->create_wall_timer(500ms, std::bind(&SolveNode::callback, this));//创建定时器
    }

private:
//
//回调函数
//
//
    void callback(){//回调函数
        std_msgs::msg::String mytopic;//定义主题
        mytopic.data="第"+ std::to_string(count++)+"次回调函数";//设置主题内容
        puber->publish(mytopic);//发布主题
    }
//
//定义变量
//
//

    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr puber;//发布者
    rclcpp::TimerBase::SharedPtr timer;//计时器
    //const int count=1;//计数
    size_t count;
};//节点类

int main(int argc,char ** argv){//argc参数个数,argv参数数组
    rclcpp::init(argc,argv);//初始化
    auto node=std::make_shared<SolveNode>("pub_node");//新建节点对象,类型是Node指针
    RCLCPP_INFO(node->get_logger(),"这是pub节点的主函数");//打印节点
    rclcpp::spin(node);//循环节点
    rclcpp::shutdown();//关闭节点
}

2、CMakeLists.txt(发布)

add_executable(pub_node src/node1.cpp)
ament_target_dependencies(pub_node rclcpp std_msgs)
install(TARGETS
  pub_node
  DESTINATION lib/${PROJECT_NAME}
)

3、node1.cpp(订阅)

# include "rclcpp/rclcpp.hpp"//导包
# include "std_msgs/msg/string.hpp"//导入消息类型
using std::placeholders::_1;//占一个位置
class SolveNode:public rclcpp::Node{//自定义节点继承public rclcpp::Node

public:
//
//
//构造函数
//
//
    SolveNode(std::string name):Node(name){
        //RCLCPP_INFO(this->get_logger(),"这是%s的构造函数",name.c_str());//打印节点
        suber=this->create_subscription<std_msgs::msg::String>("mytopic",10,std::bind(&SolveNode::callback,this,_1));
    }
private:
//
//回调函数
//
//   
    void callback(const std_msgs::msg::String::SharedPtr mytopic){//回调函数
        RCLCPP_INFO(this->get_logger(),"这是%s的回调函数",mytopic->data.c_str());//打印节点
    }
//
//
//定义变量
//
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr suber;//订阅者
};

int main(int argc,char ** argv){//argc参数个数,argv参数数组
    rclcpp::init(argc,argv);//初始化
    auto node=std::make_shared<SolveNode>("sub_node");//新建节点对象,类型是Node指针
    RCLCPP_INFO(node->get_logger(),"这是订阅节点主函数");//打印节点
    rclcpp::spin(node);//循环节点
    rclcpp::shutdown();//关闭节点
}

4、CMakeLists.txt(订阅)

add_executable(sub_node src/node1.cpp)
ament_target_dependencies(sub_node rclcpp)
install(TARGETS
  sub_node
  DESTINATION lib/${PROJECT_NAME}
)

三、编译与运行

1、编译(终端)

编译全部工作包

cd ..
colcon build

编译指定工作包

cd ..
colcon build --packages-select workpackage1

在这里插入图片描述

2、运行

订阅(终端1)

source install/setup.bash
ros2 run workpackage2 sub_node#sub_node定义在CMakeList.txt中

发布(终端2)

source install/setup.bash
ros2 run workpackage1 pub_node#pub_node定义在CMakeList.txt中

3、查看节点及详细信息

在ros2 run XXX XX的情况下重新开一个终端
查看关系

rqt_graph

查看节点

ros2 node list
ros2 node info /node1

查看话题

ros2 topic list
ros2 topic info /chatter

实时话题内容

ros2 topic echo /mytopic
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值