话题中的Publisher和Subscriber

先运行乌龟程序
用如下命令查看例程节点关系图

$ rqt_graph

在这里插入图片描述

1.创建Publisher
Publisher主要作用是针对指定话题发布特定数据类型消息。接下来使用代码实现一个节点,节点中创建一个Publisher并发布字符串“Hello World”,源码learning_communication/src/talker.cpp如下
(源码的分析可以从其他博主空间里查找)

#include <sstream>
#include"ros/ros.h"
#include"std_msgs/String.h"
int main(int argc, char **argv)
{
 ros::init(argc, argv, "Talker");
 ros::NodeHandle n;
 ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);
 ros::Rate loop_rate(10);
 int count = 0;
 while (ros::ok())
 {
  std_msgs::String msg;
  std::stringstream ss;
  ss<< "hello world"<< count;
  msg.data = ss.str();
  ROS_INFO("%s", msg.data.c_str());
  chatter_pub.publish(msg);
  ros::spinOnce();
  loop_rate.sleep();
  ++count;
 }
 return 0;
}
  1. 建立Subscriber
    创建一个Subscriber以订阅Publisher节点发布的“Hello World”字符串,实现源码learning_communication/src/listener.cpp如下
    (源码的分析可以从其他博主空间里查找)
#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::init(argc, argv, "Listener");
 ros::NodeHandle n;
 ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
 ros::spin();
 return 0;
}
  1. 编译代码包
    打开CMakelLists.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)
add_executable(Listener src/Listener.cpp)
target_link_libraries(Listener   ${catkin_LIBRARIES} )
add_dependencies(Listener ${PROJECT_NAME}_generate_messages_cpp)

然后进行编译,编译会生成两个Talker、Listener,放在工作空间的~/catkin_ws/devel/lib/
修改完成后,进行编译

$ cd ~/catkin_ws
$ catkin_make

3.出现的问题

编译时会出现以下问题(笔者 出现的问题,但解决了)

在这里插入图片描述
在这里插入图片描述
出现这些问题时也找了一些办法但是都未解决,后来发现是同一工作空间目录下的文件夹中的文件有同名的“talker、listener”文件,因此去到learning_communication/src目录下,将talker与listener文件重命名,我就改成了“Talker、Listener”,但是也要记住要去,.cpp文件中把大小写改过来,同时CMakeLists.txt文件中也要改过来。
然后就行了。当然还可能遇到其他问题,这只是我遇到的问题解决方法。

  1. 运行Publisher与Subscriber
    在运行前,先要进行环境变量的设置
$ cd ~/catkin_ws
$ source ./devel/setup.bash

环境变量设置成功后
先启动roscore

$ roscore

再启动Publisher

$ rosrun learning_communication Talker

在这里插入图片描述然后启动Subscriber

$ rosrun learning_communication Listener

在这里插入图片描述
5.自定义话题服务消息
在learning_communication/msg目录下建立Person.msg文件
源码如下

string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

此时打开learning_communication的package.xml确保文件中设置了以下编译与运行依赖
(此处或许有两种运行依赖)我的如下:

<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>

很多的博文和教材里显示的第二句代码是

<run_depend>message_runtime</run_depend>

但是我运行时产生了报错,让我把exec代替了run 所以我的是这样。
完成添加后,再打开CMakelLists.txt文件,在find_package中添加消息生成依赖功能包message——generation。

find_package(catkin REQUIRED COMPONENTS
	roscpp
	rospy
	std_msgs
	message_generation
)

catkin依赖设置如下:

catkin_package(
INCLUDE_DIRS include
LIBRARIES learning_communication
CATKIN_DEPENDS  roscpp rospy std_msgs message_runtime
DEPENDS system_lib
)

最后设置编译的.msg文件

add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)

完成以上配置后,回到工作空间路径下用catkin_make进行编译,再用如下命令看Person消息

$ rosmsg show Person

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值