本文利用std_msg传递string
本文的命名方式非常难以记忆,旨在极大地区分各种场合下的名称,保证调用时没有歧义,用以学习,但用于工程上还是方便记忆的名称更合适。
publisher和subscriber
一、前提准备
快速配置工作空间如下:
cd ~
mkdir catkin_ws
cd catkin_ws
mkdir src
cd src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
创建功能包:
cd ~/catkin_ws/src
catkin_create_pkg chat_read roscpp rospy std_msgs geometry_msgs turtlesim
cd ~catkin_ws/src/chat_read
mkdir src
cd ~catkin_ws/src/chat_read/src
二、创建publisher
1.cpp文件的建立
进入src中创建cpp文件,笔者创建pub_owner.cpp 文件。
其内容如下:
#include<ros/ros.h>
#include<std_msgs/String.h>
#include<iostream>
int main(int argc, char **argv)
{
// 节点初始化,其节点名称为“pub_owner_msg",若查看节点图可辨别该处节点,
ros::init(argc,argv,"pub_owner_msg");
// 句柄设置
ros::NodeHandle n;
//发布者创建
ros::Publisher msg_pub = n.advertise<std_msgs::String>("chatter",10);
// 此处为创建数据传递的类型为std_msgs::String
//注意此处的String并非std中的string,不可以直接用cin进行输入,此处我采用的策略是定义一个string类型对其data进行改变,解决方法有很多。
std_msgs::String msg;
std::string ss;
std::cout<<"I am waiting for your massages."<<std::endl;
std::cin >> ss;
//定义一个循环,此处循环设置不佳,还需要进行调整
ros::Rate loop_rate(10);
while(ros::ok())
{
//ros::spin(); 如果上文有订阅等情况需要回调,则应添加spin查看。
//话题发布
msg_pub.publish(msg);
//每次循环都会等待输出,可以将ss前后对比,ss未改变则直接输出,不需要cin输入。
std::cin >> ss;
msg.data=ss;
//此行为测试用
std::cout<<"I heard "<<ss<<std::endl;
loop_rate.sleep();
}
return 0;
}
2.CMakeLists.txt的调整
打开chat_read的CMakeLists.txt
在BUILD模块中加入:
add_executable(pub_owner src/pub_owner.cpp)
target_link_libraries(pub_owner ${catkin_LIBRARIES})
①第一行,指明将什么文件编译为什么。例如此处将 pub_owner.cpp编译为pub_owner。以后我们要调用此cpp程序则利用pub_owner。编译后的名字更加关键。
②第二行,指明编译后的文件与链接库相联系。
综上:利用到别的程序中时,需要更改的名称如下:
pub_owner和pub_owner.cpp 直接在文中替换就行。
三、创建subcriber
1.cpp文件的建立
进入chat_read的src中创建cpp文件,笔者创建sub_putout.cpp 文件。代码如下:
#include<ros/ros.h>
#include<std_msgs/String.h>
#include<iostream>
void poseCallback(const std_msgs::String::ConstPtr& msg)
{
//输出方式很多,可以随意更改
ROS_INFO("%s",msg->data.c_str());
}
int main(int argc, char **argv)
{
//初始化节点,其节点名称为"sub_owner_msg"
ros::init(argc,argv,"sub_owner_msg");
//建立句柄
ros::NodeHandle n;
//注册订阅者和回调函数,每次chatter传入都会调用
ros::Subscriber msg_sub = n.subscribe<std_msgs::String>("chatter",10,poseCallback);
//开始处理回调函数
ros::spin();
return 0;
}
2.CMakeLists.txt的调整
在BUILD模块中加入:
add_executable(sub_owner src/sub_putout.cpp)
target_link_libraries(sub_owner ${catkin_LIBRARIES})
第一行,指明将什么文件编译为什么。
例如此处将 sub_owner.cpp编译为sub_owner。以后我们要调用此cpp程序则利用sub_owner。编译后的名字更加关键。
第二行,指明编译后的文件与链接库相联系。
3.进行编译
退回到工作空间,如catkin_ws的目录
进入到终端,输入:
cd ~/catkin_ws
catkin_make
四、注意点
1.分别启动时,需要先启动roscore
roscore
2.添加路径
source ~/catkin_ws/devel/setup.bash
3.启动工作节点
rosrun owner pub_owner
// rosrun 功能包 编译后文件名称,也就是CMakeLists文件内的名称
4.换一个终端想要启动工作节点都需要进行source(第二步)
5.利用launch文件启动:
<launch>
<node name ="pub_owner_msg" pkg="owner" type="pub_owner" />
<node name ="sub_owner_msg" pkg="owner" type="sub_owner" />
</launch>
node name = 节点名称,cpp文件中初始化时命名
pkg = 功能包名称
type = 可执行文件名称,即CMakeLists中的文件名称
利用launch文件可以启动多个节点,且不需要额外启动roscore,方便调试,此为最简单的示例。
若需要额外打开窗口,则应该在打开节点出添加属性launch-prefix=“gnome-terminal -x”
如下:
<node name ="sub_owner_msg" pkg="owner" type="sub_owner" launch-prefix="gnome-terminal -x" />