文章目录
1 rosbag
机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如:
机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式
方式1:可以控制机器人运动,将机器人传感器感知到的数据时时处理,生成地图信息。
方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。两种方式比较,显然方式2使用上更为灵活方便。
- 在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag
1.0 概念 - 作用 - 本质
概念
- 是用于录制和回放 ROS 主题的一个工具集
作用
- 实现了数据的复用,方便调试、测试
本质
- rosbag本质也是 ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。
1.1 rosbag 命令行
- 需求:ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放
实现方式
启动窗口1:roscore
启动窗口2:rosrun turtlesim turtlesim_node
启动窗口3:rosrun turtlesim turtle_teleop_key
- 准备:创建目录保存录制的文件
mkdir ./xxx
cd xxx
Copy
- 开始录制:ctrl + c 录制结束
rosbag record -a -O 目标文件
rosbag record -a -O bags/hello.bag
操作小乌龟一段时间,结束录制使用 ctrl + c,在创建的目录中会生成bag文件。
- 查看文件
rosbag info 文件名
rosbag info bags/hello tab补齐
- 回放文件
rosbag play 文件名
rosbag play bags/hello tab补齐
重启乌龟节点,会发现,乌龟按照录制时的轨迹运动
1.2 rosbag 使用_编码
命令实现不够灵活,可以使用编码的方式,增强录制与回放的灵活性,本节将通过简单的读写实现演示rosbag的编码实现。
1.2.1 C++ 写bag
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "std_msgs/String.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"bag_write");
ros::NodeHandle nh;
//创建bag对象
rosbag::Bag bag;
//打开
bag.open("/home/rosdemo/demo/test.bag",rosbag::BagMode::Write);
//写
std_msgs::String msg;
msg.data = "hello world";
bag.write("/chatter",ros::Time::now(),msg);
bag.write("/chatter",ros::Time::now(),msg);
bag.write("/chatter",ros::Time::now(),msg);
bag.write("/chatter",ros::Time::now(),msg);
//关闭
bag.close();
return 0;
}
1.2.2 C++ 读bag
/*
读取 bag 文件:
*/
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "rosbag/view.h"
#include "std_msgs/String.h"
#include "std_msgs/Int32.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"bag_read");
ros::NodeHandle nh;
//创建 bag 对象
rosbag::Bag bag;
//打开 bag 文件
bag.open("/home/rosdemo/demo/test.bag",rosbag::BagMode::Read);
//读数据
for (rosbag::MessageInstance const m : rosbag::View(bag))
{
std_msgs::String::ConstPtr p = m.instantiate<std_msgs::String>();
if(p != nullptr){
ROS_INFO("读取的数据:%s",p->data.c_str());
}
}
//关闭文件流
bag.close();
return 0;
}
2 rqt 工具箱
在 ROS 中使用了一些实用的工具,比如: ros_bag 用于录制与回放、tf2_tools 可以生成 TF 树 … 这些工具大大提高了开发的便利性,但是也存在一些问题: 这些工具的启动和使用过程中涉及到一些命令操作,应用起来不够方便,在ROS中,提供了rqt工具箱,在调用工具时以图形化操作代替了命令操作,应用更便利,提高了操作效率,优化了用户体验。
2.0 概念 - 作用 - 组成
概念
- ROS基于 QT 框架,针对机器人开发提供了一系列可视化的工具,这些工具的集合就是rqt
作用
- 可以方便的实现 ROS 可视化调试,并且在同一窗口中打开多个部件,提高开发效率,优化用户体验
组成:rqt 工具箱组成有三大部分
- rqt——核心实现,开发人员无需关注
- rqt_common_plugins——rqt 中常用的工具套件
- rqt_robot_plugins——运行中和机器人交互的插件(比如: rviz)
2.1 rqt 安装启动与基本使用
- 安装:一般只要你安装的是desktop-full版本就会自带工具箱
如果需要安装可以以如下方式安装
$ sudo apt-get install ros-noetic-rqt
$ sudo apt-get install ros-noetic-rqt-common-plugins
- 启动
rqt 启动方式有两种:
方式1:rqt
方式2:rosrun rqt_gui rqt_gui
- 基本使用
启动 rqt 之后,可以通过 plugins 添加所需的插件
2.2 rqt 常用插件:rqt_graph
- 简介:可视化显示计算图
- 启动:可以在 rqt 的 plugins 中添加,或者使用rqt_graph启动
- 乌龟跟随案例
- turtle1是乌龟GUI节点,key是键盘控制节点,只控制第1个乌龟运动,pub1/2订阅乌龟位姿信息产生坐标系相对关系并发布,向tf发布坐标变换,产生相对关系,control控制第2个。control订阅坐标变换关系。并生成速度关系。
- 圆圈是节点,方框是话题
2.3 rqt 常用插件:rqt_console
- 简介:rqt_console 是 ROS 中用于显示和过滤日志的图形化插件
- 准备:编写 Node 节点输出各个级别的日志信息
/*
ROS 节点:输出各种级别的日志信息
*/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"log_demo");
ros::NodeHandle nh;
ros::Rate r(0.3);
while (ros::ok())
{
ROS_DEBUG("Debug message d");
ROS_INFO("Info message oooooooooooooo");
ROS_WARN("Warn message wwwww");
ROS_ERROR("Erroe message EEEEEEEEEEEEEEEEEEEE");
ROS_FATAL("Fatal message FFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
r.sleep();
}
return 0;
}
启动:
- 可以在 rqt 的 plugins 中添加,或者使用rqt_console启动
2.4 rqt 常用插件:rqt_plot
- 简介:图形绘制插件,可以以 2D 绘图的方式绘制发布在 topic 上的数据
- 准备:启动 turtlesim 乌龟节点与键盘控制节点,通过 rqt_plot 获取乌龟位姿
- 启动:可以在 rqt 的 plugins 中添加,或者使用rqt_plot启动
启动窗口1
roscore
启动窗口2
rosrun turtlesim turtlesim_node
启动窗口3
rosrun turlesim turtle_teleop_key
启动窗口4
rqt_plot 或者rqt 里面 visualization里面的plot
2.5 rqt 常用插件:rqt_bag
- 简介:录制和重放 bag 文件的图形化插件
- 准备:启动 turtlesim 乌龟节点与键盘控制节点
- 启动:可以在 rqt 的 plugins 中添加,或者使用rqt_bag启动
启动窗口1
roscore
启动窗口2
rosrun turtlesim turtlesim_node
启动窗口3
rosrun turlesim turtle_teleop_key
启动窗口4
rqt_bag