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.发布者订阅者程序实验完成