ROS学习笔记-ROS订阅和发布节点

一个简单的ROS包,一个发布者,一个订阅者

刚开始学习ROS,参考网上的资料完成了测试节点的编写,记录一下。

个人习惯在home/Develop目录中做开发,于是在Develop目录下面创建了一个ROS目录,专门用作ROS开发

1,创建工作空间

在自己的ROS目录(随便一个目录即可)下面新建一个工程目录demo,在demo目录下面创建一个工作空间

创建相关目录

cd /home/Develop/ROS
mkdir demo
cd demo
mkdir src
初始化工作空间
cd ~/Develop/ROS/demo/src/
catkin_init_workspace
cd ~/Develop/ROS/demo/
catkin_make

完成之后会在demo目录下面新增两个目录,一个是build目录(编译目录),另外一个是devel目录(开发目录)
在这里插入图片描述

接下来需要将我们的工作空间添加到环境变量,以便让ros可以在我们的工作空间下找ros包
source ~/Develop/ROS/demo/devel/setup.bash

2,创建功能包

上面创建的工作空间是没有功能包的,我们可以使用catkin_create_pkg创建自己的功能包

cd ~/Develop/ROS/demo/src
catkin_create_pkg mytest std_msgs roscpp
上面的命令在src目录下面创建了一个依赖于std::msgs和 roscpp的mytest功能包,创建包完成后,我们的目录下面多出了一些文件和目录。
在这里插入图片描述
在这里插入图片描述

通过命令可以查看功能包的依赖项
rospack depends mytest
在这里插入图片描述

3,编译功能包

cd ~/Develop/ROS/demo
catkin_make
此时因为我们未编写任何节点,因此不会编译出可执行程序

4,创建节点

在mytest包中添加两个节点,一个发布者node_publisher,一个订阅者node_subscriber

在我们的mytest包目录下的src文件夹下面创建两个cpp源文件,作为两个节点的源文件
cd ~/Develop/ROS/demo/src/mytest/src
touch node_publisher.cpp
touch node_subscriber.cpp

两个文件内容如下
发布者节点 node_publisher.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
int main(int argc, char** argv)
{
    ros::init(argc, argv,"node_publisher");
    ros::NodeHandle nd;
    
    /*publish string msg, 100 is the catch queue*/
    ros::Publisher pub = nd.advertise<std_msgs::String>("mytest_msg", 100);
    /*10 Hz*/
    ros::Rate loop_rate(10);
    int cnt = 0; 
    while(ros::ok())
    {
        std_msgs::String msg;
        std::stringstream ss;
        ss << "current:" << cnt;
        cnt++;
        
        msg.data = ss.str();
        pub.publish(msg);
        /*if some topics is subscribed,this is necessary*/
        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

订阅者节点 node_subscriber.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
/*msg callback function*/
void msgCallBack(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("info: [%s]", msg->data.c_str());
}
int main(int argc, char** argv)
{
    ros::init(argc, argv,"node_subscriber");
    ros::NodeHandle nd;
    
    /*publish string msg, 100 is the catch queue*/
    ros::Subscriber sub = nd.subscribe("mytest_msg", 100, msgCallBack);
    ros::spin();
    return 0;
}
5,修改CMakeLists文件,并编译节点

修该mytest包的CMakeLists.txt文件,将cpp文件编译成节点

gedit ~/Develop/ROS/demo/mytest/CMakeLists.txt
在文件末尾添加如下语句
add_executable(node_publisher src/node_publisher.cpp)
add_executable(node_subscriber src/node_subscriber.cpp)
target_link_libraries(node_publisher ${catkin_LIBRARIES})
target_link_libraries(node_subscriber ${catkin_LIBRARIES})

在这里插入图片描述

编译节点

cd ~/Develop/ROS/demo
catkin_make

6,运行测试节点

打开一个终端,运行如下命令,打开rosmaster主节点

roscore
在这里插入图片描述

打开另一个终端,运行如下命令,打开node_publisher节点,开始发布字符串类型的消息

rosrun mytest node_publisher
在这里插入图片描述

打开另一个终端,运行如下命令,打开node_subscriber节点,开始接收并打印字符串消息

rosrun mytest node_subcriber
在这里插入图片描述

使用如下命令查看结点之间的关系

上面编写的发布者节点node_publisher和订阅者节点node_subscriber之间的关系
rosrun rqt_graph rqt_graph
在这里插入图片描述

参考资料

古月大神
ROS节点订阅与发布
ros学习笔记–如何看可视化的话题与节点

  • 14
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值