一、创建功能包
cd ~/catkin_ws/src
catkin_create_pkg packagename std_msgs roscpp rospy
其中,packagename替换成自己需要的包名称。
创建完成后,回到工作空间进行编译。
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
二、创建Publisher
cd ~/catkin_ws/src/packagename/src
vim talkname.cpp
其中,talkname替换成自己需要的发布者名称。
下面编写发布者,发布的内容为姓名学号以及当前系统的时间。
#include <sstream>
#include <ctype.h>
#include <algorithm>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <time.h>
using namespace std;
int main(int argc, char **argv)
{
//ROS节点初始化
ros::init(argc, argv, "nodename1");//第三个参数替换为需要的节点名称
//创建节点句柄
ros::NodeHandle n;
//创建一个Publisher,发布名为cendou的topic,消息类型为std_msgs::String
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("cendou", 1000);
//设置循环的频率
ros::Rate loop_rate(1);//发布的频率为1Hz
int count = 0;
while (ros::ok())
{
//初始化std_msgs::String类型的消息
std_msgs::String msg;
std::stringstream ss;
time_t tt;
time( &tt );
tt = tt + 8*3600; // 转换时区
tm* t= gmtime( &tt );
int year, mon, day, hour, min, sec;
year = t->tm_year + 1900;
mon = t->tm_mon + 1;
day = t->tm_mday;
hour = t->tm_hour;
min = t->tm_min;
sec = t->tm_sec;
string Y;
stringstream yy;
yy<<year;
yy>>Y;
Y.erase(remove(Y.begin(), Y.end(), ','), Y.end());//此处为了去除自动生成的分隔符
locale::global(locale(""));
locale l("");
wcout.imbue(l);//识别中文
ss << "姓名 学号 " << Y << "-" << mon << "-" << day << " " << hour << ":" << min << ":" << sec << endl;
msg.data = ss.str();
//发布消息
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
//循环等待回调函数
ros::spinOnce();
//按照循环频率延时
loop_rate.sleep();
++count;
}
return 0;
}
三、创建Subscriber
方法同上,这里只放出如何编写订阅者。
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)//回调函数
{
setlocale(LC_ALL, "");
setlocale(LC_CTYPE, "zh_CN.utf8");//输出中文
ROS_INFO("%s", msg->data.c_str());//打印接收到的信息
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "nodename2");//第三个参数需改成需要的节点名称
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("cendou", 1000, chatterCallback);
ros::spin();
return 0 ;
}
四、修改CMakeLists.txt文件
回到功能包,打开CMakeLists.txt文件,找到对应部分进行修改,并去掉注释。
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(talkname src/talkname.cpp)
target_link_libraries(talkname ${catkin_LIBRARIES})
add_dependencies(talkname ${PROJECT_NAME}_generate_messages_cpp)
add_executable(listenname src/listenname.cpp)
target_link_libraries(listenname ${catkin_LIBRARIES})
add_dependencies(listenname ${PROJECT_NAME}_generate_messages_cpp)
修改完成后,我们返回到工作空间,进行catkin_make。
cd ~/catkin_ws
catkin_make
五、运行
首先进行环境变量的配置——一劳永逸方法:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
打开一个终端
roscore
打开第二个终端,我们先启动订阅者。
rosrun packagename listenname
此时终端没有任何输出,因为我们没有启动发布者。
打开第三个终端,启动发布者。
rosrun packagename talkname
此时发布者开始输出发布内容,短暂延迟后,订阅者输出同样的内容。
当然,你也可以再次打开一个终端,运行下面命令来查看节点运行可视化图。
rqt_graph
|