【ros】publisher和subscriber的编写与调试

本文利用std_msg传递string
本文的命名方式非常难以记忆,旨在极大地区分各种场合下的名称,保证调用时没有歧义,用以学习,但用于工程上还是方便记忆的名称更合适。


一、前提准备

快速配置工作空间如下:

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" />
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值