ROS学习笔记(五)(话题中编写Publisherz与Subscriber)

1.首先我们创建一个Publisher文件,Pubilsher是ROS中的话题发布者,代码与注释如下:

#include <sstream>
/*为了避免包含繁杂的ROS功能包头文件,ros.ros.h已经帮我们包含了大部分ROS中使用的头文件*/
#include "ros/ros.h"
/*节点会发布string类型的消息,所以我们应该包含该消息类型头文件String.h,该头文件根据String.msg消息结构定义自动生成*/
#include "std_msgs/String.h"

int main(int argc,char **agrv)
{
    /*
     *初始化ROS节点
     *三个参数,第一个和第二个是命令行或launch文件输出的参数,第三个是Publisher节点的名称,此名称在运行ROS中必须唯一
    */
    ros::init(argc,argv,"talker");
    /*
     *创建一个节点句柄,方便对节点资源的使用和管理
    */
    ros::NodeHandle n;
    /*
     *在ROS Master端注册一个Publisher,并告诉次节点将会以chatter为话题的String类型消息
     *第二个参数表示消息队列大小,如果消息数量超过最大队列,ROS会自动销毁最早的数据
    */
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
    /*
     *设置循环的频率,单位是Hz,这里设置的是Hz
    */
    ros::Rate loop_rate(10);

    int count = 0;
    /*循环部分*/
    while(ros::ok())
    {
        /*
         *初始化即将发布的消息,ROS中定义了很多通用的消息类型,这里我们使用最为简单的String消息类型,该消息类型只有一个成员,即data,用来存储字符串数据
        */
        std_msgs::String msg;
        std::stringstream ss;
        ss<<"hello world"<<count;
        msg.data = ss.str();

        /*
         *发布封装完毕的msg
        */
        chattter_pub.publish(msg);

        /*ROS_INFO类似于C语言中的printf函数,用来打印日志信息*/
        ROS_INFO("%s",msg.data.c_str());

        /*用来处理节点订阅话题的所有回调函数*/
        ros::spinOnce();
        
        /*节点休眠函数,之前已经设置了10Hz,这里每次运行完毕休息100ms、*/
        loop_rate.sleep();
        ++count;
    }

    return 0;
}

2.有了发布者之后,我们要收到信息还需要一个订阅者,订阅者Subscriber的代码与注释如下:

/**
 * 该例程将订阅chatter话题,消息类型String
 */
 
#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;

  // 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

  // 循环等待回调函数
  ros::spin();

  return 0;
}

3.编写代码之后,我们需要的是编译和连接程序,C++并不是像python那样的可执行文件,需要编译后才可以执行,
编译的配置便是在/catkin_ws/src下的CMakeList.txt文件中配置,在文件中增加或修改以下配置功能。

include_directories( include  ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)

target_link_libraries(talker   ${catkin_LIBRARIES} )

add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)

target_link_libraries(listener   ${catkin_LIBRARIES} )

 add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)

4.配置好后我们在/catkin_ws的目录下运行catkin_make指令进行编译,当进度达到100%即为编译完成

5.编译好后我们需要设置环境变量才可以运行此程序,输入以下指令:

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

6.修改完环境变量后,运行ros,输入指令roscore

7.运行发布者程序,输入指令:

rosrun learning_sun talker

8.运行订阅者程序,输入指令:

rosrun learning_sun listener

9.发布者订阅者程序实验完成

猜你喜欢

转载自blog.csdn.net/weixin_41407439/article/details/100990155