ROS笔记–主题发布节点和主题订阅节点
节点是连接ROS网络的可执行文件。我们将创建一个主题发布者节点,该节点将连续广播一条消息。
一、创建工作空间
创建新文件夹,名字自定义,路径也根据自己设定。
mkdir mywork
创建好后,就需要将次路径添加到ROS_PACKAGE_PATH中。
查看目前ROS的工作空间
echo $ROS_PACKAGE_PATH
一般显示如下:
/opt/ros/kinetic/share
下面将路径添加到~/.bashrc中
echo "export ROS_PACKAGE_PATH=~/mywork:${ROS_PACKAGE_PATH}" >> ~/.bashrc
再次查看ROS正在使用的空间,确保路径正确添加。
二、创建ROS功能包
打开ROS工作目录:
cd ~/mywork
在该目录下创建功能包:
roscreate-pkg beginner std_msgs roscpp
功能包文件夹下一般包括Makefile、manifest.xml、CMakeLists.txt、mainpage.dox等文件。
std_msgs 包含常见等消息类型
roscpp cpp库
运行命令,查看功能包是否创建
rospack find beginner
三、编写代码
1、主题发布节点
在功能包中创建src/talker.cpp,并添加代码:
#include <ros/ros.h>
#include "std_msgs/String.h"
#include <iostream>
#include <sstream>
int main(int argc,char **argv)
{
ros::init(argc,argv,"talker"); //ros系统初始化,通过命令对名字进行重映射,节点名字在一个运行的系统中必须是唯一的
ros::NodeHandle n;//创建一个句柄,并自动初始化
ros::Publisher pub = n.advertise<std_msgs::String>("chatter",1000); //将std_msgs::String类型的消息发布给话题chatter,参数1000是消息队列的长度
//ros::Publisher pub1 = n.advertise<std_msgs::String>("mytest",1000);
ros::Rate rate(10);//指定自循环的频率 1/10
int count = 0;
//int mycount=0;
while(ros::ok()) //当按下Ctrl+c命令时,返回false
{
std_msgs::String msg;
std::stringstream ss;
ss<< "Hello ROS! "<<count;
msg.data =ss.str();
ROS_INFO("%s",msg.data.c_str());
pub.publish(msg);
// ss<< "Hello my world!this is a test!"<<count;
// msg.data =ss.str();
// ROS_INFO("%s",msg.data.c_str());
// pub1.publish(msg);
ros::spinOnce();
rate.sleep();
++count;
}
return 0;
}
2、主题订阅节点
在功能包中创建src/listener.cpp,并添加代码:
#include <ros/ros.h>
#include "std_msgs/String.h"
void chatcallback(const std_msgs::String::ConstPtr& msg)//回调函数
{
ROS_INFO("I heared :[%s]",msg->data.c_str());
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"listener");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter",1000,chatcallback);
// sub = nh.subscribe("mytest",1000,chatcallback);
ros::spin();
return 0;
}
四、编译节点
编辑CMakeLists.txt文件,在末尾处添加如下代码:
rosbuild_add_executable(talker src/talker.cpp)
rosbuild_add_executable(listener src/listener.cpp)
rosmake工具进行编译:
rosmake beginner
五、运行功能包
在运行功能包前,请确认节点管理器已经打开。使用下面的命令运行:
roscore
运行主题发布和主题订阅
rosrun beginner talker
rosrun beginner listener
运行效果截图: