目录
1. ROS简介
ROS是一个适用于机器人的开源的元操作系统。它并不是一个真正的操作系统,其底层的任务调度、编译、寻址等任务还是由Linux 操作系统完成,也就是说ROS实际上是运行在Linux 上的次级操作系统。但是ROS提供了操作系统应用的各种服务(如:硬件抽象、底层设备控制、常用函数实现、进程间消息传递、软件包管理等),也提供了用于获取、编译、跨平台运行代码的工具和函数。ROS主要采用松耦合点对点进程网络通信,目前主要还是支持Ubuntu系统,windows和MacS目前支持的还不好,所以推荐在Ubuntu系统上安装使用ROS。
ROS就是一个分布式的通信机制,帮助程序进程之间更方便的通信。由于机器人是一个多部件的设备,四肢、视觉、听觉等部位都有配套的程序进行控制,那么要协调这些部位,就需要让这些分散的部位能够互相的通信,这正是ROS被设计的最初目的。涵盖了大量的第三方工具和大量的实用的开源算法软件包,机器人的各种算法的开发还是基干我们常见的C++和Python的。
节点是主要的计算执行进程,功能包中创建的每个可执行程序在被启动加载到系统进程中后,该进程就是一个ROS节点,node1、node2、node3等都是节点(node)。节点都是各自独立的可执行文件,能够通过主题(topic)、服务(server)或参数服务器(parameter server) 与其他节点通信。ROS 通过使用节点将代码和功能解提高了系统的容错力和可维护性。所以你最好让每一个节点都具有特定的单一的功能,而不是创建一个包罗万象的大节点。节点如果用c++进行编写,需要用到ROS提供的库roscpp;节点如果用python 进行编写,需要用到ROS提供的rospy。
ROS1的核⼼是⼀个基于master中⼼节点的匿名发布-订阅通信中间层,相⽐之下,ROS2采⽤基于RTSP(Real-Time Publish-Subscribe)协议的DDS作为中间层,DDS(Data-Distribution Service)是⼀种⽤于实时和嵌⼊式系统发布-订阅式通信的⼯业标准,这种点到点的通信模式类似于ROS1的中间层,但是DDS不需要像ROS1那样借由master节点来完成两个节点间通信,这使得系统更加容错和灵活,DDS 被⼴泛应⽤于关键系统中,包括战舰、⼤型基础设施(如⽔电站)、⾦融系统、空间系统、航空系统等场景,这些⽤例也证实了DDS的可靠性。
ROS2中引⼊了Quality of Service, QoS(服务质量)的策略⽤于配置节点间通信,进⽽提升了ROS2适应于不同应⽤场景的灵活性。ROS1只⽀持基于TCP的通信。通过配置QoS,ROS2可以表现出TCP的可靠性,也可以表现出UDP那样的⾼实时性。⽤⼾可以通过选择不同的QoS配置⽂件以实现不同的通信表现,QoS配置⽂件为策略的集合,ROS2提供了预设的QoS配置⽂件,如下所⽰:
- 发布-订阅机制的QoS设定
- 服务 (Service) 的QoS设定
- 传感器数据的QoS设定
- 参数的QoS设定
- DDS中间层默认的QoS设定
ROS2并不需要像ROS1那样启动roscore(即master节点),ROS2这种去中⼼化的策略能让其适应更多⼯业应⽤和产品级应⽤场景的需求。
NOTE: ROS1和ROS2可以并存于同⼀台电脑,你只需要source不同的setup.bash即可完成环境的选择。
.1) 不同版本ROS环境配置
ros2和ros1都安装在Ubuntu18.04/20上面,怎么隔离?
1)打开bashrc文件: sudo gedit -/.bashrc
2)第二步在bashrc文件末尾加入以下代码:
echo "ros melodic(1) or ros2 dashing(2)?"
read edition
if ["$edition" -eq "1" ];then
source /opt/ros/melodic/setup.bash
else
source /opt/ros/dashing/setup.bash
fi
3)重启终端,将显示:
4)通过输入1或者2来切换ROS版本即可。
2.ROS指令
.1) rostopic hz
当使用ROS命令rostopic hz
时,它会显示指定ROS话题的发布频率(帧率)。如果rostopic hz
显示的帧率过大,可能是由以下原因导致:
-
数据发布速度过快:发布者节点以非常高的速率发布数据到指定话题。这可能是由于发布者节点的逻辑错误、频繁的数据产生或循环中的错误导致的。检查发布者节点的代码,确保数据发布的速率符合预期。
-
话题重复发布:可能存在多个发布者节点同时发布相同的话题,导致数据被重复发布。这将导致帧率显示过高。确保只有一个发布者节点发布指定的话题。
-
时间戳错误:数据中的时间戳可能配置不正确,导致
rostopic hz
无法正确计算帧率。确保发布的数据中的时间戳正确设置,并与实际数据发布的频率匹配。 -
计算误差:
rostopic hz
计算帧率时可能存在计算误差。这种误差可能是由于计算机性能、ROS系统负载或运行其他节点的影响造成的。在这种情况下,可以尝试使用更准确的测量工具或方法来获取实际的帧率信息。
综上所述,如果rostopic hz
显示的帧率过大,您应该检查发布者节点的代码和配置,确保数据发布的速率和时间戳设置正确,并排除其他可能的计算误差因素。
.2) pcl_conversions
pcl_conversions::toPCL
函数有两个参数,它们的含义如下:
-
ros_cloud
:这是一个ROS消息类型的点云数据,通常是sensor_msgs::PointCloud2
消息。ROS中的点云消息包含了点的坐标、颜色和其他属性。 -
pcl_cloud
:这是PCL库中的点云类型,比如pcl::PointCloud<pcl::PointXYZ>
。PCL库提供了多种点云类型用于不同的应用场景。
pcl_conversions::toPCL
函数的作用是将ROS消息类型的点云数据转换为PCL库中对应的点云类型。它会解析ROS消息中的数据,并将其填充到PCL点云对象中,以便后续在PCL库中进行点云处理和算法操作。示例用法如下:
sensor_msgs::PointCloud2 ros_cloud; // ROS点云消息
pcl::PointCloud<pcl::PointXYZ> pcl_cloud; // PCL点云对象
// 将ROS消息类型的点云数据转换为PCL点云类型
pcl_conversions::toPCL(ros_cloud, pcl_cloud);
pcl_conversions::toPCL
函数也可以用于将ROS时间戳(ros::Time
)转换为PCL时间戳(pcl::uint64_t
),以便在PCL库中使用。
在给定的代码片段中,pcl_conversions::toPCL
函数的参数含义如下:
-
ros::Time(timestamp)
:这是一个ROS时间戳对象,表示某个特定时间点。时间戳可以用于标记数据的时刻,通常与ROS消息一起使用。 -
cld->header.stamp
:这是PCL点云对象(cld
)的时间戳字段,通常存储着点云数据的采集时间或创建时间。
通过调用pcl_conversions::toPCL
函数,将ROS时间戳转换为PCL时间戳,可以方便地将ROS消息中的时间信息与PCL库中的点云对象关联起来。示例用法如下:
ros::Time timestamp = ros::Time::now(); // 获取当前ROS时间戳
pcl::PointCloud<pcl::PointXYZ> pcl_cloud;
// 将ROS时间戳转换为PCL时间戳,并赋值给PCL点云对象的时间戳字段
pcl_conversions::toPCL(ros::Time(timestamp), pcl_cloud.header.stamp);
这样,您可以在PCL库中使用pcl_cloud.header.stamp
来访问点云数据的时间戳信息。
#ifndef PCL_CONVERSIONS_H__
#define PCL_CONVERSIONS_H__
namespace pcl_conversions {
/** PCLHeader <=> Header **/
// PCL的时间戳 与 ros的时间戳 间的转换
inline
void fromPCL(const std::uint64_t &pcl_stamp, ros::Time &stamp)
{
stamp.fromNSec(pcl_stamp * 1000ull); // Convert from us to ns
}
inline
void toPCL(const ros::Time &stamp, std::uint64_t &pcl_stamp)
{
pcl_stamp = stamp.toNSec() / 1000ull; // Convert from ns to us
}
inline
ros::Time fromPCL(const std::uint64_t &pcl_stamp)
{
ros::Time stamp;
fromPCL(pcl_stamp, stamp);
return stamp;
}
inline
std::uint64_t toPCL(const ros::Time &stamp)
{
std::uint64_t pcl_stamp;
toPCL(stamp, pcl_stamp);
return pcl_stamp;
}
} // namespace pcl_conversions
参考链接:https://blog.csdn.net/tiancailx/article/details/110816649
.3) roslaunch命令和launch 文件
roslaunch命令执行格式:roslaunch 功能包名称 launch文件 [参数设置]
<arg>中的name 表示参数的名称,default 表示参数默认的值。如果需要设置别的值,可以在roslaunch 命令中加入节点名。
<node>中pkg、type、name 字段含义如下:
- pkg 功能包名称。
- type 实际运行的节点的名称(节点名)。
- name 与上述type对应的节点被运行时起的名称(运行名)。一般情况下使用与type相同的名称。但可以根据需要在运行时更改名称。
.4) rosbag
rosbag 工具可以录制一个包、从一个或多个包中重新发布消息、查看一个包的基本信息、检查一个包的消息定基于Python 表达式过滤一个包的消息,压缩和解压缩一个包以及重建一个包的索引。rosbag目前常用的命令如下 (fix 和 filter 暂时没有用到):
- record:用指定的话题录制一个 bag 包
- info:显示一个 bag 包的基本信息,比如包含哪些话题
- play:回放一个或者多个 bag 包
- check:检查一个 bag 包在当前的系统中是否可以回放和迁移
- compress:压缩一个或多个 bag 包
- decompress:解压缩一个或多个 bag 包+
- reindex:重新索引一个或多个损坏 bag 包
.6) 其他常见指令
命令 | 详细说明 |
rostopic list | 显示活动的话题目录 |
rostopic echo [话题名称] | 实时显示指定话题的消息内容 |
rostopic find [类型名称] | 显示使用指定类型的消息的话题 |
rostopic type [话题名称] | 显示指定话题的消息类型 |
rostopic bw [话题名称] | 显示指定话题的消息带宽(bandwidth) |
rostopic hz [话题名称] | 显示指定话题的消息数据发布周期 |
rostopic info [话题名称] | 显示指定话题的信息 |
rostopic pub [话题名称] [消息类型] [参数] | 用指定的话题名称发布消息 |
rostopic echo/话题名: 查看返回的数据,除了数字什么也显示不出来。想要查看数据的frame_id等信息,加上--noarr 参数即可,排除话题数据中的数组信息。
rosbag record -b 4092 /topic_name 扩大录制内存限制 (-l循环播放)。
rosrun pcl_ros bag to_pcd 指令,ROS官方支持bag转PCD。
rosrun pcl_ros bag_to_pcd 3.bag /velodyne points pcd
上述命令中,三个参数分别为bag 包名,需要解析的节点名称和解析后存储的位置。
$ rosrun pcl_ros bag_to_pcd <input_file.bag> <topic> <output_directory>
/*
<input_file.bag> is the bag file name to read.
<topic> is the topic in the bag file containing messages to save.
<output_directory> is the directory on disk in which to create PCD files from the point cloud messages.
*/
.5) ROS环境变量配置
设置环境,将ROS环境变量自动添加到新 bash 会话:
echo "source /opt/ros/melodic/setup.bash” >> ~/.bashrc
source -/.bashrc
- source: 使当前shell 读入路径为 filepath 的shell 文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
- ~/是进入当前用户的主目录。比如我用的用户名是USER 那么命令 cd~/就进入了/home/USER 目录。
- .bashrc 是进入bashrc文件夹,就是用户目录下的名字是bashrc 的目录。当登录时以及每次打开新的shell时该文件被读取。bashrc 文件的内容。每个用户的 home 目录都有这个 shell 脚本。它用来存储并加载你的终端配置和环境变量。你对 bashrc 所做的任何修改将在下一次启动终端时生效。如果你想立刻生效的话,运行下面的命令source-/.bashrc)。
3. ROS2指令
ROS2也提供类似于ROS1的命令⾏指令,指令和ROS1略有区别:
- ros2 node : 输出node相关信息
- ros2 topic : topic相关指令,包括list,hz,echo等
- ros2 service :service相关指令,如list,call,type等
- ros2 bag : rosbag相关指令, 录包,播包,打印数据包信息等
- ros2 bag :package相关指令
- ros2 param: 参数相关
- ros2 launch:运⾏launch⽂件
- ros2 run:运⾏单个节点
ros2 topic list //命令将返回系统中当前活动的所有话题的列表。
ros2 topic echo<topic_name> //要查看正在发布的关于某个话题的数据。
ros2 topic hz /turtle1/pose //查看数据/turtle1/pose 发布的速率
.1) Ros2 qos简介
用于节点之前的数据通信,为了保证数据能够可靠和高校的传输。ROS2提供了一套非常丰富的服务质量(Qualityof Service.OoS)策略。rclcpp:Qos 是一个用于配置 ROS2 发布者和订阅者质量保证 (Quality of Service,QoS)的类。QoS 可以用来配置通信中的一些属性,例如消息传输的可靠性、延迟和带宽等。
在ROS2中,发布者和阅者可以通过使用 rclcpp::Qos 类来配置其 QoS。
(1)历史记录(History)
保留近期记录(Keep last):缓存最多N条记录,可通过队列长度选项来配置。
保留所有记录(Keep all):缓存所有记录,但受限于底层中间件可配置的最大资源。