ROS2探索总结-3.小试牛刀
ROS2探索总结-3.小试牛刀
说明
- 安装ROS2框架
看了之前ROS2的框架设计,是不是对ROS2产生了很多好奇。相比ROS1,ROS2中融入了很多新的东西,但是很多核心的概念并没有改变。
一、ROS中的Graph
还记不记得ROS1中Graph的几个概念?(可以出门左转复习《ROS探索总结(二)——ROS总体框架》)节点、消息、主题、服务,在ROS2里边又新加入了一个“发现(Discovery)”的概念。节点、消息、主题、服务这几个概念这里就不赘述了,在ROS2和ROS1里是相同的,我们来看一下什么叫Discovery。
我们从前边的框架中已经看到了,ROS2里是没有master的,那么节点之间是怎么知道彼此存在的呢?这就全靠一种自动发现的机制——Discovery。什么意思呢?简单来说,当一个节点启动后,首先在网络中发条广播,大声告诉这个世界我来了(忽然想到三体里人类向宇宙发送广播,招来了外星人。。。),其他节点听到之后,也纷纷反馈各自的信息,这样一来二去也就联系上了。当然,万一哪个节点掉线了怎们办?没关系,每个节点都会周期性的发布广播,告诉其他节点他还在线,就算要下线,他也会广播告诉其他节点他要走了,下次再聊。
二、小试牛刀
看了这么多概念,一时不一定消化得了,让我们小试牛刀,加强一下印象。从哪里下手呢?还记不记得ROS wiki上最初的talker and listener,ROS2还是继续从这里出发。
- 安装ROS2
目前ROS2还处于开发阶段,提供两种安装方法:二进制包和源码编译。我们还是偷偷懒,直接使用编译好的二进制包。打开网站 https://github.com/ros2/ros2/releases ,找到最新发布的ROS版本,目前最新版是Beta1,看看下载列表,是不是很激动的可以看到linux、osx、windows三个版本的二进制包,支持的平台确实比ROS1多了吧。不过我们还是从熟悉的Linux环境开始,需要Ubuntu16.04,从列表中下载ros2-beta1-package-linux-fastrtps.tar.bz2。
- 安装一些依赖包
$ sudo apt-get update && sudo apt-get install -q -y libopencv-core2.4v5 libhighgui2.4 libopencv-imgproc2.4v5 wget
解压刚才下载的ros2-beta1-package-linux-fastrtps.tar.bz2到你需要的目录下。
解压后如图所示:
设置环境变量
由于我们下载的是已经编译好的二进制包,不需要编译安装的过程(包括里边的示例代码,talker和listener都已经是编译好的),直接就可以使用了。当然运行前还是要设置一下环境变量(每个终端都需要,或者直接在.bashrc文件里添加):
$ source setup.bash
执行程序
在两个终端中分别执行“talker”和“listener”命令(使用apt-get install解决出现的错误)
两个节点成功连接上的界面
源码剖析
- talker和listener的源码:https://github.com/ros2/tutorials
- talker
#include <iostream>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
int main(int argc, char * argv[])
{
//ros::init(argc, argv, "talker");
rclcpp::init(argc, argv);
//ros::NodeHandle n;
auto node = rclcpp::node::Node::make_shared("talker");
rmw_qos_profile_t custom_qos_profile = rmw_qos_profile_default;
custom_qos_profile.depth = 7;
//ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
auto chatter_pub = node->create_publisher<std_msgs::msg::String>("chatter", custom_qos_profile);
//ros::Rate loop_rate(10);
rclcpp::WallRate loop_rate(2);
auto msg = std::make_shared<std_msgs::msg::String>();
auto i = 1;
//while (ros::ok())
while (rclcpp::ok()) {
msg->data = "Hello World: " + std::to_string(i++);
std::cout << "Publishing: '" << msg->data << "'" << std::endl;
//chatter_pub.publish(msg);
chatter_pub->publish(msg);
//ros::spinOnce();
rclcpp::spin_some(node);
//loop_rate.sleep();
loop_rate.sleep();
}
return 0;
}
- listener
#include <iostream>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
//void chatterCallback(const std_msgs::String::ConstPtr& msg)
void chatterCallback(const std_msgs::msg::String::SharedPtr msg)
{
std::cout << "I heard: [" << msg->data << "]" << std::endl;
}
int main(int argc, char * argv[])
{
//ros::init(argc, argv, "listener");
rclcpp::init(argc, argv);
//ros::NodeHandle n;
auto node = rclcpp::Node::make_shared("listener");
//ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
auto sub = node->create_subscription<std_msgs::msg::String>(
"chatter", chatterCallback, rmw_qos_profile_default);
//ros::spin();
rclcpp::spin(node);
return 0;
}
每句的代码上用注释标注了对应于ROS1中的代码,仔细阅读上边的代码,我们可以从以下几点做出对比分析:
ROS2中的API相比ROS1中发生了较大的变化,这和ROS2设计文档中描述的一致,ROS2并不是在ROS1的基础上查漏补缺,而是完全从新设计。关于ROS2的API说明,可以参考API文档:http://docs.ros2.org/beta1/api/rclcpp/index.html
使用了更多C++的特性,比如auto、make_shared等。
加入了QoS配置,从上边的代码中,我们可以看到QoS有默认的配置rmw_qos_profile_default,而且talker将QoS的depth配置设置为“7”。
代码的总体架构还是与ROS1极为相似的。
参考资料:
Overview of ROS 2 concepts : https://github.com/ros2/ros2/wiki/Overview-of-ROS-2-concepts
C++ ROS Client Library API:http://docs.ros2.org/beta1/api/rclcpp/index.html
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号