认识ROS(机器人操作系统)自动驾驶

文章目录

  • 前言
  • 一、ROS
    • 1、介绍ROS、安装和配置ROS环境
    • 2、安装ROS
      • 安装(ROS1)
      • 通过Docker容器安装(ROS2)
    • 3、环境变量设置
    • 4、创建ROS工作空间
    • 5、ROS文件系统导览/构建ROS软件包
      • 1)catkin软件包的组成:
      • 2)创建catkin软件包
      • 3)自定义自己的软件包
    • 6、理解ROS节点、话题(topic)、rostopic、rqt_graph
    • 7、ROS服务和参数
    • 8、ROS的rqt_console和roslaunch
    • 9、ROS消息和服务
    • 10、编写发布者和订阅者(C++)
    • 11、编写服务节点和客户端节点的通信
    • 12、ROS的可视化工具rviz
    • 13、rosbag使用
    • 14、roslog


前言

自动驾驶方面的知识分享。


一、ROS

1、介绍ROS、安装和配置ROS环境

定义:ROS是一个用于开发机器人应用程序的、类似操作系统的机器人软件平台。ROS提供开发机器人应用程序时所需的硬件抽象、子设备控制,以及机器人工程中广泛使用的传感、识别、绘图、运动规划等功能。此外ROS还提供进程之间的消息解析、功能包管理、库和丰富的开发及调试工具。依赖于Linux(一般支持的linux系统有ubuntu系列与debian系列)。

2、安装ROS

安装(ROS1)

我们在ROS发行版中提供支持服务,选择了ROS Noetic Ninjemys版本,它发布于2020年5月,长期支持且更加稳定,建议在Ubuntu 20.04上安装。

//安装源来自清华的镜像源(ROS)版本
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
//设置密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
//首先确保安装索引是最新的
sudo apt update 
//安装完整桌面版
sudo apt install ros-noetic-desktop-full
//如果有需要可以安装其他你需要的软件包
sudo apt install ros-noetic-PACKAGE

通过Docker容器安装(ROS2)

#我们在Ubuntu上安装docker
sudo apt install docker.io
#拉取docker里的ROS2的镜像
sudo docker pull osrf/ros:foxy-desktop
#进入已经安装好的镜像
sudo docker run -it osrf/ros:foxy - desktop

3、环境变量设置

ROS依赖于使用shell环境以及各种依赖包,这些专用的包(package)提供给我们的应用节点使用(node),所以,在查找和使用ROS软件包的过程中,需要确保已经正确配置好了环境变量【检查环境(ROS_ROOT和ROS_PACKAGE_PATH)的方法–$ printenv | grep ROS】。
认识ROS(机器人操作系统)自动驾驶_第1张图片
环境变量的设置文件可能来自多个不同的地方:
1、用软件包管理器安装的ROS(版本:kinetic和noetic)软件包已经提供了setup.*sh文件。
2、在rosbuild workspaces中使用类似rosws的工具生成。
3、编译或安装catkin软件包时自动生成,catkin现在是组织代码的推荐方式,它使用更标准的CMake约定,并具有更大的灵活性,特别是对于希望集成外部代码库或希望发布其软件的用户,我们可以在以下的路径中找到它们。
在这里插入图片描述
catkin_make 是一个命令行工具,它简化了标准catkin工作流程。你可以认为catkin_make是在标准CMake工作流程中依次调用了cmake和make。

4、创建ROS工作空间

我们选择创建一个catkin的工作空间(mkdir -p ~/catkin_ws/src),并在src目录下创建一个CMakeLists.txt的文档(catkin_make)。当我们查看该级目录下会发现,应该能看到build和devel这两个目录,在devel文件夹里含有setup.*sh文件。

5、ROS文件系统导览/构建ROS软件包

1)catkin软件包的组成:

workspace_folder/        -- WORKSPACE
  src/                   -- SOURCE SPACE
    CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin
    package_1/
      CMakeLists.txt     -- CMakeLists.txt file for package_1
      package.xml        -- Package manifest for package_1
    ...
    package_n/
      CMakeLists.txt     -- CMakeLists.txt file for package_n
      package.xml        -- Package manifest for package_n

软件包(Packages):包是ROS代码的软件组织单元,每个软件包都可以包含程序库、可执行文件、脚本或其他构件。
Manifests (package.xml): 清单(Manifest)是对软件包的描述。它用于定义软件包之间的依赖关系,并记录有关软件包的元信息,如版本、维护者、许可证等。
Cmake学习地址:http://wiki.ros.org/catkin/CMakeLists.txt

2)创建catkin软件包

现在使用catkin_create_pkg命令创建一个名为beginner_tutorials的新软件包,这个软件包依赖于std_msgs、roscpp和rospy:$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp。这将会创建一个名为beginner_tutorials的文件夹,这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件,这两个文件都已经部分填写了你在执行catkin_create_pkg命令时提供的信息。

3)自定义自己的软件包

认识ROS(机器人操作系统)自动驾驶_第2张图片
认识ROS(机器人操作系统)自动驾驶_第3张图片
build 目录是构建空间的默认位置,同时cmake和make也是在这里被调用来配置和构建你的软件包。而devel目录是开发空间的默认位置, 在安装软件包之前,这里可以存放可执行文件和库。
在这里插入图片描述

6、理解ROS节点、话题(topic)、rostopic、rqt_graph

Computer Graph
节点实际上只不过是ROS软件包中的一个可执行文件。ROS节点使用ROS客户端库与其他节点通信。节点可以发布或订阅话题,也可以提供或使用服务。

举例子:例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)

话题(topic)的通信是通过节点间发送ROS消息实现的。为了使发布者和订阅者进行通信,发布者和订阅者必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面消息的类型决定的。使用rostopic type命令可以查看发布在话题上的消息的类型。

rqt_graph(rqt_graph用动态的图显示了系统中正在发生的事情)

-rqt_graph是rqt程序包中的一部分:安装。
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
-打开一个新的终端,运行rqt_graph

$ rosrun rqt_graph rqt_graph //rqt_graph用动态的图显示了系统中正在发生的事情。

如果把鼠标放在/turtle1/command_velocity上方,相应的ROS节点(这里是蓝色和绿色)和话题(这里是红色)就会高亮显示。可以看到,turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来相互通信。
认识ROS(机器人操作系统)自动驾驶_第4张图片
认识ROS(机器人操作系统)自动驾驶_第5张图片

rostopic

$ rostopic -h //帮助选项查看可用的rostopic的子命令

$ rostopic echo [topic] //可以显示在某个话题上发布的数据。
$ rostopic list -v  //会列出所有发布和订阅的主题及其类型的详细信息。
$  rostopic type [topic] //用来查看所发布话题的消息类型。

$ rostopic pub [topic] [msg_type] [args] //把数据发布到当前某个正在广播的话题上。
$ rostopic hz [topic] //报告数据发布的速率。

认识ROS(机器人操作系统)自动驾驶_第6张图片
ROS消息

$ rostopic type [topic] //用来查看所发布话题的消息类型。

$ rostopic pub [topic] [msg_type] [args] //把数据发布到当前某个正在广播的话题上。

ROS分布式的通信机制:
认识ROS(机器人操作系统)自动驾驶_第7张图片
1)Talker注册
2)Listener注册
3)ROS Master 进行信息匹配
4)Listener 发送连接请求
5)Talker 确认连接请求并反馈给 Listener 确认信息
6)Listener 尝试与 Talker 建立网络连接
7)Talker 向 Listener 发布数据
认识ROS(机器人操作系统)自动驾驶_第8张图片
1)Talker注册
2)Listener注册
3)ROS Master 进行信息匹配并向 Listener 提供 Talker 的 TCP 地址信息
4)Listener 尝试与 Talker 建立网络连接
5)Talker 向 Listener 发布服务数据

7、ROS服务和参数

服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)。

rosservice list 输出活跃服务的信息
rosservice call 用给定的参数调用服务
rosservice type 输出服务的类型
rosservice find 按服务的类型查找服务
rosservice uri 输出服务的ROSRPC uri

rosparam能让我们在ROS参数服务器(Parameter Server)上存储和操作数据,参数服务器能够存储整型(integer)、浮点(float)、布尔(boolean)、字典(dictionaries)和列表(list)等数据类型。

$ rosparam list
$ rosparam set [param_name] 设置参数
$ rosparam get [param_name] 获取参数

8、ROS的rqt_console和roslaunch

rqt_console:
rqt_console连接到了ROS的日志框架,以显示节点的输出信息。
rqt_logger_level允许我们在节点运行时改变输出信息的详细级别。
日志级别的优先级按照以下的顺序进行排列:

roscd log将带您进入存储ROS日志文件的目录。需要注意的是,如果你没有执行过任何ROS程序,系统会报错说该目录不存在。

Fatal (致命)
Error (错误)
Warn  (警告)
Info  (信息)
Debug (调试)

运行以下命令:

$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level

认识ROS(机器人操作系统)自动驾驶_第9张图片
roslaunch:本质上是在管理一堆实现了ros的进程。
roslaunch可以用来启动定义在launch(启动)文件中的节点。–$ roslaunch [package] [filename.launch]
可以创建一个turtlemimic.launch的文件(这是在beginner_tutorials包里),例如内容为:

<launch>
  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>
</launch>

启动roslaunch:$ roslaunch beginner_tutorials turtlemimic.launch

9、ROS消息和服务

认识ROS(机器人操作系统)自动驾驶_第10张图片
msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码
msg文件存放在软件包的msg目录下。
msg文件就是简单的文本文件,每行都有一个字段类型和字段名称。可以使用的类型为:

int8, int16, int32, int64 (以及 uint*)
float32, float64
string
time, duration
//其他msg文件
variable-length array[] 和 fixed-length array[C]

10、编写发布者和订阅者(C++)

发布者
认识ROS(机器人操作系统)自动驾驶_第11张图片
1、初始化ROS系统
2、向主节点宣告我们将要在chatter话题上发布std_msgs/String类型的消息
3、以每秒10次的速率向chatter循环发布消息

订阅者
认识ROS(机器人操作系统)自动驾驶_第12张图片
1、初始化ROS系统
2、订阅chatter话题
3、开始spin自循环,等待消息的到达
4、当消息到达后,调用chatterCallback()函数

作为ROS的通信方式之一,话题是一种异步通信机制,使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者和发布者可以不唯一,这是一种单向的传输机制,即发布者以广播的形式不断发布信息,一个或多个订阅者可以订阅这个发布者,就可以获得发布者传递的信息。

//构建节点(改变CmakeLists.txt文件)

//在你的catkin工作空间下
$ cd ~/catkin_ws
$ catkin_make

认识ROS(机器人操作系统)自动驾驶_第13张图片
认识ROS(机器人操作系统)自动驾驶_第14张图片

11、编写服务节点和客户端节点的通信

ROS服务与话题相似,但服务与话题不同之处在于:在发布主题时,正在发送的数据能够以多对多的方式交互。但当需要从某个节点获得一个请求或应答时,就不能通过主题来实现了,服务派上用场,服务能够允许我们直接与某个节点进行交互。当一个节点提供某个服务时,所有的节点都可以通过使用ROS客户端库所编写的代码与它通信。

使用服务时,要先创建服务,相对于消息使用在package/msg目录下创建,服务则在package/srv目录下创建。
编写服务节点的代码:
认识ROS(机器人操作系统)自动驾驶_第15张图片
编写客户端节点的代码
认识ROS(机器人操作系统)自动驾驶_第16张图片
服务和客户端之间的通信的结果。
在这里插入图片描述

12、ROS的可视化工具rviz

一、安装和运行

安装命令:

$sudo apt-get install ros-kinetic-rviz //rviz包的安装

$rosdep install rviz//环境监测,安装
$rosmake rviz

-运行rviz
在一个新的终端那里打开:
输入 $ roscore
再另起一个终端:输入$rosrun rviz rviz
-显示
认识ROS(机器人操作系统)自动驾驶_第17张图片
认识ROS(机器人操作系统)自动驾驶_第18张图片
认识ROS(机器人操作系统)自动驾驶_第19张图片

创建独有的程序包:$catkin_create_pkg using_markers roscpp visualization_msgs
创建节点:touch basic_shapes.cpp (https://www.guyuehome.com/36509)
编辑CmakeLists.txt文件
add_executable(basic_shapes src/basic_shapes.cpp)
target_link_libraries(basic_shapes ${catkin_LIBRARIES})
编译源码:$catkin_make
运行节点:$rosrun using_markers basic_shapes

13、rosbag使用

rosbag对软件包进行操作,消息记录包是一种用于保存和回放ROS消息数据的文件格式,它能够获取并记录各种难以收集的传感器数据。我们可以通过消息记录包反复获取实验数据,进行必要的开发和算法测试。

rosbag 主要用于记录、回放、分析 rostopic 中的数据。它可以将指定 rostopic 中的数据记录到 .bag 后缀的数据包中,便于对其中的数据进行离线分析和处理。对于 subscribe 某个 topic 的节点来说,它无法区分这个 topic 中的数据到底是实时获取的数据还是从 rosbag 中回放的数据。这就有助于我们基于离线数据快速重现曾经的实际场景,进行可重复、低成本的分析和调试。

rosbag命令可以记录、回放和操作包,指令列表如下:
认识ROS(机器人操作系统)自动驾驶_第20张图片
认识ROS(机器人操作系统)自动驾驶_第21张图片

$rosbag record -a //录制所有的话题

$rosbag record /topic_name1 /topic_name2 /topic_name3 //也可以录制某些其中一个的topic

其余各种录制信息命令:

$rosbag record --duration=30 /topic_name #持续30s录制,还可以指定m,h,和--split类似
$rosbag record --split --size=1024 /topic_name1 #空间达到1024M后分文件存储
$rosbag record --split --duration=30 /topic_name1 #持续时间到30s后分文件存储
$rosbag record --split --duration=5m /topic_name1 #持续时间到5m后分文件存储
$rosbag record --split --duration=2h /topic_name1#持续时间到2h后分文件存储
$rosbag record -l 1000 /topic_name1 # 录制该主题1000个消息限制



rosbag info

$rosbag info filename.bag //显示数据包中的信息

rosbag play 

$rosbag play <bagfile> //回放数据包中的topic

更多rosbag信息可以参照这篇博客:https://blog.csdn.net/lemonxiaoxiao/article/details/121693548

14、roslog

ROS使用rosout包来记录各个节点的log信息,通常这些log信息是一些可以读懂的字符串信息,这些信息一般用来记录节点的运行状态。ROS有五种不同类型的log信息,分别为:logdebug、loginfo、logwarn、logerr、logfatal。

rospy.logdebug(msg, *args, **kwargs)
rospy.loginfo(msg, *args, **kwargs)
rospy.logwarn(msg, *args, **kwargs)
rospy.logerr(msg, *args, **kwargs)
rospy.logfatal(msg, *args, **kwargs)

以上语句中的msg表示待显示的字符串。当传入msg是格式字符串时,可以传入*args,**kwargs 作为格式字符串的参数。举例:rospy.logerr(“%s returned the invalid value %s”, other_name, other_value)

以上五种类型的日志信息会流向不同的地方:stdout (标准输出设备):loginfo类的信息会流向这里stderr (标准错误输出设备):logerr,logfatal,logwarn类信息会流向这里。默认情况下,标准输出设备和标准错误输出设备都是显示器。也就是说,当使用它们时,msg信息会显示到显示器上。

节点日志文件:当使用logging功能时,ROS会在ROS_ROOT/log 或 ~/.ros/log路径下生成.log格式的日志文件。这五类日志信息都会保存在这里。/rosout 话题: 默认情况下,除logdebug外,其余类型的日志消息都会发布到/rosout话题下。注意:在节点初始化之前,日志信息不会发布到/rosout话题下,节点初始化后才能看到信息。logdebug信息也可以发布到话题下,使用这个语句:rospy.init_node(‘my_node’, log_level=rospy.DEBUG)
认识ROS(机器人操作系统)自动驾驶_第22张图片

你可能感兴趣的:(c++,自动驾驶,自动驾驶,docker,人工智能)