ROS学习笔记(一) 话题(Topic)通信机制
一:话题(Topic)通信机制
topic通讯的具体实现是通过node(节点)之间传递message(消息)进行信息传输。
![](https://img-blog.csdnimg.cn/img_convert/a533a018595443823e92ebe3d27d5fff.png)
两个node之间建立数据通讯需要经过上图所示的7步骤:
talker注册:通过1234端口向master注册发布者信息,其中包括话题名
listener注册:向master注册订阅者信息,其中包括需要订阅的话题名
ros master信息匹配:通过listener的订阅信息,在注册列表中查找,没有找到发布者,就等待发布者的加入;找到的话,就通过RPC向listener发布talker的RPC地址信息。
listener发送连接请求:根据master给的地址,通过RPC向talker发送连接请求、话题名、消息类型、通讯协议
talker确认连接请求:通过RPC向listener确认连接信息,其中包含TCP地址
listener尝试与talker建立网络连接
talker向listener发布数据
二:实例
自定义Topic发布者和订阅者
(1)创建工作空间
打开Home目录,在空白处右击,点击新建文件夹(New Folder)建立一个文件夹,命名为catkin_ws;
![](https://img-blog.csdnimg.cn/img_convert/45da877ea21d7f33b265471fc93c8cff.png)
在文件夹 catkin_ws 下创建一个文件夹 src;
![](https://img-blog.csdnimg.cn/img_convert/7dabcf981c72196335a34769d4ae6052.png)
在src目录下右键在终端中打开(Open in Terminal),输入:
catkin_init_workspace
在src文件夹中出现CMakeLists.txt文件
编译工作空间
打开终端(Open in Terminal),输入:
cd ~/catkin_ws/
catkin_make
在catkin_ws文件夹里生成build和devel两个文件夹。
配置环境变量
打开终端(Open in Terminal),输入:
cd ~/catkin_ws/
source devel/setup.bash
echo $ROS_PACKAGE_PATH
(2)创建话题功能包
快捷键[Ctrl+Alt+t]打开一个新的终端,输入以下代码:
cd ~/catkin_ws/src
catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp rospy
修改功能包配置文件
输入以下命令:
cd ros_tutorials_topic
gedit package.xml
将打开后的package.xml文件内容修改为:
<?xml version="1.0"?>
<package>
<name>ros_tutorials_topic</name>
<version>0.1.0</version>
<description>ROS tutorial package to learn the action</description>
<license>BSD</license>
<author>Melonee Wise</author>
<maintainer email="pyo@robotis.com">pyo</maintainer>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>actionlib</build_depend>
<build_depend>message_generation</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>actionlib_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>actionlib</run_depend>
<run_depend>std_msgs</run_depend>
<run_depend>actionlib_msgs</run_depend>
<run_depend>message_runtime</run_depend>
<export></export>
</package>
修改构建配置文件
输入以下命令:
gedit CMakeLists.txt
将打开后的CMakeLists.txt文件内容修改为
cmake_minimum_required(VERSION 3.0.2)
project(ros_tutorials_topic)
## catkin构建时需要的组件包。
## 是依赖包,是message_generation、 std_msgs和roscpp。
## 如果这些功能包不存在,在构建过程中会发生错误。
find_package(catkin REQUIRED COMPONENTS
message_generation
std_msgs
roscpp
)
## 消息声明:MsgTutorial.msg
add_message_files(FILES MsgTutorial.msg)
## 这是设置依赖性消息的选项。
## 如果未安装std_msgs,则在构建过程中会发生错误。
generate_messages(DEPENDENCIES std_msgs)
## catkin功能包选项,描述了库、catkin构建依赖项和系统依赖的功能包。
catkin_package(
LIBRARIES ros_tutorials_topic
CATKIN_DEPENDS std_msgs roscpp
)
## 设置包含目录。
include_directories(${catkin_INCLUDE_DIRS})
## topic_publisher节点的构建选项。
## 配置可执行文件、目标链接库和其他依赖项。
add_executable(topic_publisher src/topic_publisher.cpp)
add_dependencies(topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(topic_publisher ${catkin_LIBRARIES})
## topic_subscriber节点的构建选项。
add_executable(topic_subscriber src/topic_subscriber.cpp)
add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(topic_subscriber ${catkin_LIBRARIES})
(3)创建topic_publisher发布者节点
在CMakeLists.txt中“add_executable(topic_publisher src/topic_publisher.cpp)”构建了src目录中的topic_publisher.cpp文件,因此需要在src目录中创建这个文件。
输入以下命令:
roscd ros_tutorials_topic/src
gedit topic_publisher.cpp
在打开的topic_publisher.cpp文件中输入以下内容:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
//ROS节点初始化
ros::init(argc, argv, "talker");
// 创建ROS节点句柄
ros::NodeHandle n;
// 在master端注册一个publisher,并告诉节点将会发布一个以chatter为话题的String类型消息
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
// 节点未发生异常一直循环
while (ros::ok()){
// 初始化即将发布的消息
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
// 发布消息
// ROS_INFO打印日志信息
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
//循环等待回调函数
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
(4)创建topic_subscriber 订阅者节点
在CMakeLists.txt中“add_executable(topic_subscriber src/topic_publisher.cpp)”构建了src目录中的topic_sunscriber.cpp文件,因此需要在src目录中创建这个文件。
输入以下命令:
roscd ros_tutorials_topic/src
gedit topic_subscriber.cpp
在打开的topic_subscriber.cpp文件中输入以下内容:
#include "ros/ros.h"
#include "std_msgs/String.h"
// 接收到订阅消息后,会进入消息回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
//将接收到的消息打印出来
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
// 初始化ROS节点;
ros::init(argc, argv, "listener");
// 创建节点句柄;
ros::NodeHandle n;
// 创建订阅方对象;声明自己订阅的消息话题
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
构建功能包
输入以下命令:
cd ~/catkin_ws
catkin_make
(5)运行测试
启动ROS Master确保roscore可用,在一个窗口中并运行:
roscore
打开一个新的终端,输入以下命令:
cd ~/catkin_ws/
source devel/setup.bash
rosrun ros_tutorials_topic topic_publisher
运行订阅者
快捷键[Ctrl+Alt+t]打开一个新的终端,输入以下代码:
rosrun ros_tutorials_topic topic_subscriber