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订阅和发布节点_第1张图片

接下来需要将我们的工作空间添加到环境变量,以便让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功能包,创建包完成后,我们的目录下面多出了一些文件和目录。
ROS学习笔记-ROS订阅和发布节点_第2张图片
ROS学习笔记-ROS订阅和发布节点_第3张图片

通过命令可以查看功能包的依赖项
rospack depends mytest
ROS学习笔记-ROS订阅和发布节点_第4张图片

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 
#include 
#include 
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 
#include 
#include 
/*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})

ROS学习笔记-ROS订阅和发布节点_第5张图片

编译节点

cd ~/Develop/ROS/demo
catkin_make

6,运行测试节点

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

roscore
ROS学习笔记-ROS订阅和发布节点_第6张图片

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

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

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

rosrun mytest node_subcriber
ROS学习笔记-ROS订阅和发布节点_第7张图片

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

上面编写的发布者节点node_publisher和订阅者节点node_subscriber之间的关系
rosrun rqt_graph rqt_graph
ROS学习笔记-ROS订阅和发布节点_第8张图片

参考资料

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

你可能感兴趣的:(ROS学习)