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文件夹中出现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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值