ROS机器人004-ROS通信编程(话题编程,自定义话题消息)

一,ROS通讯编程类型

分为以下三种:
1,话题编程
2,服务编程
3,动作编程


二,话题编程

在这里插入图片描述

三,创建发布者

在功能包learn_communication/src/目录下添加talker.cpp文件:
在这里插入图片描述
1,添加头文件

//添加ROS包
#include "ros/ros.h"
//添加ROS string变量
#include "std_msgs/String.h"

2 Ros结点初始化,定义结点名称

 ros::init(argc,argv,"talker");

3创建结点句柄
通过创建结点句柄,方便我们对结点资源进行管理(包括发布者,订阅者等等的管理)

 //创建结点句柄
 ros::NodeHandle n;

4创建发布者
创建一个Publisher的对象,发布名为chatter的话题,消息类型为std_msg::String,发布者队列长度为1000(将数据放入队列,避免发布过快,接受者接收不到)

ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);

5发布消息

//发布消息
chatter_pub.publish(msg);

6完整代码

//添加ROS包
#include "ros/ros.h"
//添加ROS string变量
#include "std_msgs/String.h"

int main(int argc, char **argv)
{

 //ROS结点初始化
 //创建talker结点
 ros::init(argc,argv,"talker");
 
 //创建结点句柄
 ros::NodeHandle n;
 
 //创建一个Publisher,发布名为chatter的话题,消息类型为std_msgs::String
 ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);
 //设置循环的频率 10HZ
 ros::Rate loop_rate(10);

 int count = 0;
 while(ros::ok())
{
 //初始化std_msgs::String 类型的消息
 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,初始化ROS结点

//初始化ROS结点
  ros::init(argc,char **argv,"listrner");

2,创建结点句柄

 //创建结点句柄
  ros::NodeHandle n;

3,创建一个订阅者
并且绑定订阅的话题,收到消息的回调函数

//创建一个接受者,订阅名为chatter的话题,注册回调函数chatterCallback
  ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallback);

4,创建回调函数

//接收消息的回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard :{%s}",msg->data.c_str());
}

5,循环等待回调函数

  //循环等待回调函数
  ros::spin();

6,完整代码

#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结点
  ros::init(argc,argv,"listrner");

  //创建结点句柄
  ros::NodeHandle n;
  //创建一个接受者,订阅名为chatter的话题,注册回调函数chatterCallback 1000代表消息队列的大小
  ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallback);

  //循环等待回调函数
  ros::spin();
return 0;
}

五,编译代码

当我们用c++写完这两个结点的功能后,需要将代码编译为可执行文件(用python写就不用编译,Python本身就是可执行文件)
在这里插入图片描述
1,更改编译配置文件
更改功能包目录下的cmaklists.txt文件:
在这里插入图片描述
add_executable(${PROJECT_NAME}_node src/learing_communication_node.cpp)取消注释,并更改内容
在这里插入图片描述
更改为:
意思是将src目录下的talker.cpp编译为talker可执行文件

add_executable(talker src/talker.cpp)

链接第三方库:
因为这里没用到其他库,只有ROS默认的库,所以我们链接catkin_LIBRARIES

target_link_libraries(talker ${catkin_LIBRARIES})

更改后的完整内容为:


add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

2,编译
在工作空间目录catkin_ws下打开终端;
命令:

catkin_make

在这里插入图片描述
编译完成:
在这里插入图片描述
可以在devl目录下看见我们编译完成的可执行程序:

devel/lib/learing_communication/

在这里插入图片描述

六,运行可执行文件

1,启动rosMaster
新建终端

roscore

**在这里插入图片描述**
2,启动listener
rosrun命令
rosrun 功能包名 结点名

rosrun learing_communication talker

在这里插入图片描述
3,启动listner

 rosrun learing_communication listener

我们可以发现发送和接收保存同步
在这里插入图片描述

七,自定义话题

前面的话题我们都是发送一个string类型的数据,但是我们想要发送一组有类型的数据怎么办呢?
通过自定义话题来解决
在这里插入图片描述
1,定义msg文件
在功能包目录下创建msg文件夹(存放msg文件):
在这里插入图片描述
在文件夹下创建person.msg文件:
在这里插入图片描述
定义person相关信息,并且可以定义常量(unknown,male,female):

string name
uint8 sex
uint8 age

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

在这里插入图片描述
2,在package.xml中添加功能包依赖
打开功能包目录下的package.xml添加以下:

<build_depend>message_generation</build_depend> 
<exec_depend>message_runtime</exec_depend>

注意:
在这里插入图片描述
在这里插入图片描述
3,在cmakelist.txt添加编译选项
打开功能包目录下的cmakelist.txt做以下更改:

• find_package( ……  message_generation)
• catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
• add_message_files(FILES Person.msg) generate_messages(DEPENDENCIES  std_msgs)

添加功能包:

 find_package( ……  message_generation)

`在这里插入图片描述
添加编译时的依赖:

catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)

在这里插入图片描述
指定消息文件的目录:

add_message_files(FILES Person.msg) generate_messages(DEPENDENCIES  std_msgs)

在这里插入图片描述
在这里插入图片描述
4,编译
将msg文件编译成对应语言的头文件:
在工作空间根目录进行编译:

catkin_make

可以看见他被编译成不同语言接口供我们使用
在这里插入图片描述
5,查看自定义的消息

rosmsg show person

在这里插入图片描述
证明该消息编译没问题,可以使用头文件包含进行使用了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Exbot易科机器人实验维护书籍,提供学习镜像包括indigo和kinetic等,努力为ROS爱好者和开发人员提供力所能及的服务。, 本书第2版概括性地介绍了ROS系统的各种工具。ROS是一个先进的机器人操作系统框架,现今已有数百个研究团体和公司将其应用在机器人行业中。对于机器人技术的非专业人士来说,它也相对容易上手。在本书中,你将了解如何安装ROS,如何开始使用ROS的基本工具,以及最终如何应用先进的计算机视觉和导航工具。, 在阅读本书的过程中无需使用任何特殊的设备。书中每一章都附带了一系列的源代码示例和教程,你可以在自己的计算机上运行。这是你唯一需要做的事情。, 当然,我们还会告诉你如何使用硬件,这样你可以将你的算法应用到现实环境中。我们在选择设备时特意选择一些业余用户负担得起的设备,同时涵盖了在机器人研究中最典型的传感器或执行器。, 最后,由于ROS系统的存在使得整个机器人具备在虚拟环境中工作的能力。你将学习如何创建自己的机器人并结合功能强大的导航功能包集。此外如果使用Gazebo仿真环境,你将能够在虚拟环境中运行一切。第2版在最后增加了一章,讲如何使用“Move it!”包控制机械臂执行抓取任务。读完本书后,你会发现已经可以使用ROS机器人进行工作了,并理解其背后的原理。, 主要内容, 第1章介绍安装ROS系统最简单的方法,以及如何在不同平台上安装ROS,本书使用的版本是ROS Hydro。这一章还会说明如何从Debian软件包安装或从源代码进行编译安装,以及在虚拟机和ARM CPU中安装。, 第2章涉及ROS框架及相关的概念和工具。该章介绍节点、主题和服务,以及如何使用它们,还将通过一系列示例说明如何调试一个节点或利用可视化方法直观地查看通过主题发布的消息。, 第3章进一步展示ROS强大的调试工具,以及通过对节点主题的图形化将节点间的通信数据可视化。ROS提供了一个日志记录API来轻松地诊断节点的问题。事实上,在使用过程中,我们会看到一些功能强大的图形化工具(如rqt_console和rqt_graph),以及可视化接口(如rqt_plot和rviz)。最后介绍如何使用rosbag和rqt_bag记录并回放消息。, 第4章介绍ROS系统与真实世界如何连接。这一章介绍在ROS下使用的一些常见传感器和执行器,如激光雷达、伺服电动机、摄像头、RGB-D传感器、GPS等。此外,还会解释如何使用嵌入式系统与微控制器(例如非常流行的Arduino开发板)。, 第5章介绍ROS对摄像头和计算机视觉任务的支持。首先使用FireWire和USB摄像头驱动程序将摄像头连接到计算机并采集图像。然后,你就可以使用ROS的标定工具标定你的摄像头。我们会详细介绍和说明什么是图像管道,学习如何使用集成了OpenCV的多个机器视觉API。最后,安装并使用一个视觉里程计软件。, 第6章将展示如何在ROS节点中使用点云库。该章从基本功能入手,如读或写PCL数据片段以及发布或订阅这些消息所必需的转换。然后,将在不同节点间创建一个管道来处理3D数据,以及使用PCL进行缩减采样、过滤和搜索特征点。, 第7章介绍在ROS系统中实现机器人的第一步是创建一个机器人模型,包括在Gazebo仿真环境中如何从头开始对一个机器人进行建模和仿真,并使其在仿真环境中运行。你也可以仿真摄像头和激光测距传感器,为后续学习如何使用ROS的导航功能包集和其他工具奠定基础。, 第8章是两章关于ROS导航功能包集中的第1章。该章介绍如何对你的机器人进行使用导航功能包集所需的初始化配置。然后用几个例子对导航功能包集进行说明。, 第9章延续第8章的内容,介绍如何使用导航功能包集使机器人有效地自主导航。该章介绍使用ROS的Gazebo仿真环境和rviz创建一个虚拟环境,在其中构建地图、定位机器人并用障碍回避做路径规划。, 第10章讨论ROS中移动机器人机械臂的一个工具包。该章包含安装这个包所需要的文档,以及使用MoveIt!操作机械臂进行抓取、放置,简单的运动规划等任务的演示示例。, 预备知识, 我们写作本书的目的是让每位读者都可以完成本书的学习并运行示例代码。基本上,你只需要在计算机上安装一个Linux发行版。虽然每个Linux发行版应该都能使用,但还是建议你使用Ubuntu 12.04 LTS。这样你可以根据第1章的内容安装ROS Hydro。, 对于ROS的这一版本,你将需要Ubuntu 14.04之前的版本,因为之后的版本已经不再支持Hydro了。, 对于硬件要求,一般来说,任何台式计算机或笔记本电脑都满足。但是,最好使用独立显卡来运行Gazebo仿真环境。此外,如果有足够的外围接口将会更好,因为这样你可以连接几个传感器和执行器,包括摄像头和Arduino开发板。, 你还需要Git(g

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值