topic通讯的具体实现是通过node(节点)之间传递message(消息)进行信息传输。
两个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发布数据
打开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
快捷键[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})
在中“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;
}
在中“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
启动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小时内删除。
留言与评论(共有 0 条评论) |