ROS学习(nine): Writing a Simple Publisher and Subscriber (C++)

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]
发布了29 篇原创文章 · 获赞 0 · 访问量 1722

猜你喜欢

转载自blog.csdn.net/fengxuewei123/article/details/104086267