ROS: 实现两个节点之间通话

机器环境

ubuntu:16.04

ROS 实现目标

新建 ROS 工程,两个节点: node_anode_b。其中,node_a 负责每隔一定时间发送一个数字, node_b 负责接收数字并显示数字,通过 roslaunch 运行这两个 node

具体过程

创建 ROS 工作空间

打开终端创建一个 ROS 工作环境

在这里插入图片描述

mkdir -p ros_ws/src
cd ros_ws/
catkin_make

编译成功后,打开目录,会出现如下文件夹

ROS: 实现两个节点之间通话_第1张图片
每次打开次项目ros_ws,都需要配置一下环境变量

在这里插入图片描述

source devel/setup.bash

也可以将 source devel/setup.bash 直接添加在~/.bashrc 文件中,这样可以在任何目录下运行项目,也不用每次都加载环境变量。

vim ~/.bashrc

在文件尾添加完成路径如下:

source /home/stoner/ros_ws/devel/setup.bash

保存并退出

输出环境变量,若终端中输出已添加的路径,则添加成功

echo $ROS_PACKAGE_PATH 

创建 ROS 项目

使用 catkin_create_pkg 创建一个 package 包并添加 roscppstd_msgs 依赖 项

ROS: 实现两个节点之间通话_第2张图片

cd ~/ros_ws/src
catkin_create_pkg pub_sub_test roscpp std_msgs

创建成功系统会在 ~ros/src/pub_sub_test 目录下, 生成如下文件及文件夹。

ROS: 实现两个节点之间通话_第3张图片
进入到目录 ~ros/src/pub_sub_test/src 下,创建 publisher.cppsubscriber.cpp
在这里插入图片描述

touch publisher.cpp
touch subscriber.cpp

文件 publisher.cpp 内容如下

#include "ros/ros.h"
#include "std_msgs/Int32.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "publisher");
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<std_msgs::Int32>("num", 1000);
    ros::Rate loop_rate(10);
    int count = 0;
    while (ros::ok())
    {
        std_msgs::Int32 msg;
        msg.data = count;
        ROS_INFO("node_a : %d", msg.data);
        pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
        ++count;
    }
    return 0;
}

文件 subscriber.cpp 内容如下

#include "ros/ros.h"
#include "std_msgs/Int32.h"

void chatterCallback(const std_msgs::Int32::ConstPtr& msg)
{
    ROS_INFO("node_b : %d\n", msg->data);
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "subscriber");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("num", 1000, chatterCallback);
    ros::spin();
    return 0;
}

使用 catkin_create_pkg 创建 launch 包,不添加任何依赖项
在这里插入图片描述

catkin_create_pkg launch

进入 ~/ros_ws/src/launch 目录,创建 run.launch 文件

touch run.launch

文件 run.launch 内容如下

<launch>
    <node pkg="pub_sub_test" name = "node_a" type = "publisher" output="screen" />
    <node pkg="pub_sub_test" name = "node_b" type = "subscriber" output="screen" /> 
</launch>

配置项目

打开 ~ros_ws/src/pub_sub_test 目录下 CMakelists.txt 文件 , 在 151 行之后添加内容

add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher ${catkin_LIBRARIES})

add_executable(subscriber src/subscriber.cpp)
target_link_libraries(subscriber ${catkin_LIBRARIES})

编译运行

回到 ~ros_ws 目录, 编译项目

catkin_make

编译成功后即可运行

roslaunch launch run.launch

可以使用 rqt_graph 查看节点见关系

rqt_graph

效果如下
ROS: 实现两个节点之间通话_第4张图片
ROS: 实现两个节点之间通话_第5张图片

你可能感兴趣的:(ROS)