ROS学习笔记(一) 话题(Topic)通信机制

阅读: 评论:0

ROS学习笔记(一) 话题(Topic)通信机制

ROS学习笔记(一) 话题(Topic)通信机制

ROS学习笔记(一) 话题(Topic)通信机制

一:话题(Topic)通信机制

topic通讯的具体实现是通过node(节点)之间传递message(消息)进行信息传输。

两个node之间建立数据通讯需要经过上图所示的7步骤:

  1. talker注册:通过1234端口向master注册发布者信息,其中包括话题名

  1. listener注册:向master注册订阅者信息,其中包括需要订阅的话题名

  1. ros master信息匹配:通过listener的订阅信息,在注册列表中查找,没有找到发布者,就等待发布者的加入;找到的话,就通过RPC向listener发布talker的RPC地址信息。

  1. listener发送连接请求:根据master给的地址,通过RPC向talker发送连接请求、话题名、消息类型、通讯协议

  1. talker确认连接请求:通过RPC向listener确认连接信息,其中包含TCP地址

  1. listener尝试与talker建立网络连接

  1. talker向listener发布数据

二:实例

自定义Topic发布者和订阅者

(1)创建工作空间

打开Home目录,在空白处右击,点击新建文件夹(New Folder)建立一个文件夹,命名为catkin_ws;

在文件夹 catkin_ws 下创建一个文件夹 src;

在src目录下右键在终端中打开(Open in Terminal),输入:

catkin_init_workspace

在src文件夹中出现文件

编译工作空间

打开终端(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
l

将打开后的l文件内容修改为:

<?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">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>

修改构建配置文件

输入以下命令:

将打开后的文件内容修改为

cmake_minimum_required(VERSION 3.0.2) 
project(ros_tutorials_topic) 
## catkin构建时需要的组件包。
## 是依赖包,是message_generation、 std_msgs和roscpp。
## 如果这些功能包不存在,在构建过程中会发生错误。
find_package(catkin REQUIRED COMPONENTSmessage_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发布者节点

在中“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 订阅者节点

在中“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

本文发布于:2024-02-08 20:05:43,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739419768686.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:学习笔记   机制   话题   通信   ROS
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23