本文将分别使用C++和Python来实现话题发布者和订阅者,首先创建一个功能包,命名为topic_pub_sub
,添加roscpp
,rospy
等依赖项。
C++实现
在该功能包的src
目录下创建publisher.cpp
文件,添加如下程序:
#include <iostream>
#include <sstream>
#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc, char** argv){
ros::init(argc, argv, "publisher");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<std_msgs::String>("msg", 1000);
ros::Rate loop_rate(10)
int cnt = 0;
while(ros::ok()){
std_msgs::String msg;
std::stringstream ss;
ss << "hello world! " << cnt;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
}
在src
目录下创建subscriber.cpp
文件,添加如下程序:
#include <iostream>
#include <ros/ros.h>
#include <std_msgs/String.h>
void callback(std_msgs::String::ConstPtr msg){
ROS_INFO("%s", msg->data.c_str());
}
int main(int argc, char** argv){
ros::init(argc, argv, "subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("msg", 10, callback);
ros::spin();
}
编辑该功能包的CMakeLists.txt
文件,如下:
cmake_minimum_required(VERSION 3.0.2)
project(topic_pub_sub)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
)
include_directories(
include
${catkin_INCLUDE_DIRS}
)
# 生成话题发布节点
add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher
${catkin_LIBRARIES}
)
# 生成话题订阅节点
add_executable(subscriber src/subscriber.cpp)
target_link_libraries(subscriber
${catkin_LIBRARIES}
)
接下来使用catkin_make
进行编译即可
需要运行三个终端,分别运行roscore,发布节点,订阅节点
- 运行
roscore
,在第一个终端输入:
roscore
- 运行话题发布者,在第二个终端中输入:
source ./devel/setup.bash
rosrun topic_pub_sub publisher
- 运行话题订阅者,在第三个终端中输入:
source ./devel/setup.bash
rosrun topic_pub_sub subscriber
结果如下:
使用rqt_graph
命令可以查看节点间的关系,如图
使用rostopic
可以查看当前的话题状态、内容等数据,用法如下:
命令 | 功能 |
---|
rostopic list | 列举所有活动中的话题 |
rostopic echo <topic name> | 实时显示指定话题的消息内容 |
rostopic info <topic name> | 显示指定话题的信息 |
Python实现
相较于C++,Python实现会简单很多,也不需要编译,在一些简单的、对性能要求不高的场景,可以使用Python快速完成程序原型的设计
在开始前,要先在topic_pub_sub
功能包目录下新建一个scripts
文件夹
在scripts
目录下创建publisher.py
文件,内容如下:
import rospy
from std_msgs.msg import String
rospy.init_node("publisher")
pub = rospy.Publisher("msg", String, queue_size=1000)
loop_rate = rospy.Rate(10)
cnt = 0
while not rospy.is_shutdown():
msg = String()
cnt += 1
msg.data = "hello python! " + str(cnt)
rospy.loginfo(msg.data)
pub.publish(msg)
loop_rate.sleep()
编写完成后,需要给这个文件执行权限,使用如下命令
sudo chmod 777 publisher.py
在scripts
目录下创建subscriber.py
文件,内容如下:
import rospy
from std_msgs.msg import String
def callback(msg):
rospy.loginfo(msg.data)
rospy.init_node("subscriber")
sub = rospy.Subscriber("msg", String, callback)
rospy.spin()
同样需要提高它的执行权限:
sudo chmod 777 subscriber.py
操作流程基本和C++实现一节基本一致,运行节点时可以直接使用rosrun topic_pub_sub xxxx.py
来运行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)