publisher
// 是一个方便头文件 包含所有 联系 ROS 系统的文件
#include "ros/ros.h"
// 包含 std_msgs/String 消息
#include "std_msgs/String.h"
#include <sstream>
/**
* This tutorial demonstrates simple sending of messages over the ROS system.
*/
int main(int argc, char **argv)
{
// talker 是节点的名字
ros::init(argc, argv, "talker");
//
ros::NodeHandle n;
// 告知 master 我们将要 publish chatter 话题上的 std_msgs::String 类型的消息
// 让master 告知其他节点, 监听 chatter 话题, 我们将要在这个话题上面发布消息
// 1000: 是发布序列 在这种情况下,如果我们发布得太快,它将最多缓冲1000条消息,然后再开始丢弃旧消息
// NodeHandle::advertise 返回一个 ros::Publisher 对象
// 1. 包含一个publish(): 发布消息在这个被创建的话题上面
// 2. 当超出范围的时候, 自动取消发布
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
// 指定一个 循环的频率
// 它将跟踪自上次调用Rate :: sleep()以来已等待了多长时间,并睡眠了正确的时间。
// 在这种情况下,我们告诉我们要以10Hz运行。
ros::Rate loop_rate(10);
int count = 0;
/*
如果 CTRL-C 触发, 将会返回一个false
ros::ok() will return false if:
a SIGINT is received (Ctrl-C)
we have been kicked off(开始) the network by another node with the same name
ros::shutdown() has been called by another part of the application.
all ros::NodeHandles have been destroyed
一旦 ros::ok() 返回值为 false, 所有的ros都将会被毁灭
*/
while (ros::ok())
{
// 该消息类型中含有一个成员 data 成员
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
// printf
ROS_INFO("%s", msg.data.c_str());
// 广播这条消息给所有 和该节点相连接的 其他节点
chatter_pub.publish(msg);
// 和 接收回调函数 相关
// 若有一个 subscription , 有下面的代码是必须的, 否则不会执行任何回调函数
ros::spinOnce();
// 现在,我们使用ros :: Rate对象休眠剩余时间,使我们达到10Hz的发布速率。
loop_rate.sleep();
++count;
}
return 0;
}
subscriber
#include "ros/ros.h"
#include "std_msgs/String.h"
// 当有新的消息到达 某主题(chatter) 的时候, 该回调函数将会被调用
// 该消息在 boost shared_ptr 中传递,
// 这意味着您可以根据需要将其存储起来,而不必担心它下面的内容被删除,也无需复制基础数据。
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
// 订阅这个话题
// 当一个新的消息到达的时候, 执行回调函数
// 1000: 队列 大小
// NodeHandle::subscribe() 返回 ros::Subscriber 对象
// 当这个 subscriber 对象被毁灭的时候, 他将会自动的不调用chatter话题
// 有很多方式 调用回调函数, 这里只是一种
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
/*
// 和 接收回调函数 相关
// 若有一个 subscription , 有下面的代码是必须的, 否则不会执行任何回调函数
ros::spinOnce();
// 进入一个循环, 尽可能回调回调函数
// 一旦 ros::ok() 返回 false 的时候, ros::spin()将退出, 这就意味着 ros::shutdown() 被调用
ros::spin();
*/
ros::spin();
return 0;
}
building
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_message_files(
FILES
Num.msg
)
add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES beginner_tutorials
CATKIN_DEPENDS message_runtime roscpp rospy std_msgs
# DEPENDS system_lib
)
include_directories(
${catkin_INCLUDE_DIRS}
)
## 创建两个可执行文件 talker 和 listener 存放在 ~/catkin_ws/devel/lib/<package name> 路径下面
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
## 为可执行项增加依赖项
## 在使用之前确保头文件的生成
## 如果你想要使用 来自其他包(在该消息空间内部)的消息文件, 您还需要向其各自的生成目标添加依赖项,
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
target_link_libraries(talker
${catkin_LIBRARIES}
)
target_link_libraries(listener
${catkin_LIBRARIES}
)
你可以直接调用 执行文件, 也可以通过rosrun来调用它
# In your catkin workspace
$ cd ~/catkin_ws
$ catkin_make
# [ 88%] Building CXX object beginner_tutorials/CMakeFiles/listener.dir/src/listener.cpp.o
# [ 88%] Building CXX object beginner_tutorials/CMakeFiles/talker.dir/src/talker.cpp.o
# [ 94%] Linking CXX executable /home/fengxuewei/C++_myself/catkin_ws/devel/lib/beginner_tutorials/talker
# [ 94%] Built target talker
# [100%] Linking CXX executable /home/fengxuewei/C++_myself/catkin_ws/devel/lib/beginner_tutorials/listener
# [100%] Built target listener
run
roscore
cd ~/catkin_ws
source ./devel/setup.bash
# 运行 talker 节点 publisher
rosrun beginner_tutorials talker
[ INFO] [1580009213.495876843]: hello world 118
[ INFO] [1580009213.595839445]: hello world 119
[ INFO] [1580009213.695917918]: hello world 120
[ INFO] [1580009213.795837579]: hello world 121
[ INFO] [1580009213.895883961]: hello world 122
# 运行 listener 节点
rosrun beginner_tutorials listener
[ INFO] [1580009213.496291755]: I heard: [hello world 118]
[ INFO] [1580009213.596300007]: I heard: [hello world 119]
[ INFO] [1580009213.696377448]: I heard: [hello world 120]
[ INFO] [1580009213.796274979]: I heard: [hello world 121]
[ INFO] [1580009213.896306383]: I heard: [hello world 122]