软件环境基础(ROS、CMake)

参考视频:【全】无人驾驶系列知识入门到提高
本文旨在对视频内容规划控制方面做一些学习记录,希望帮助有需要的人学习提高。不对处,望指正。

0 ROS介绍

ROS特点:

  • 点对点设计(比如一个结点读取相机数据,传送给相应的处理程序。)
  • 优点:可以分散实时计算的压力
  • 分布式设计(节点可以放在多个设备上面)
  • 多语言(官方支持C++、python)
  • 轻量级
  • 免费且开源
  • 社区完善
    软件环境基础(ROS、CMake)_第1张图片

1)消息一种publish/subscribe的方式传递
2)节点可以在给定的主题中发布/订阅消息
3)一个节点可以订阅/发布多个不同的主题
4)允许多个节点订阅/发布同一个主题
5)订阅节点和发布节点并不知道相互之间的存在

1 Cmake

ROS 的编译系统

  1. ROS对CMake进行了拓展
  2. 适合ROS进行大型项目,多包,多节点的场景下进行批量编译
    软件环境基础(ROS、CMake)_第2张图片
    Cmake是预编译,make是编译
1.1 Packages & Catkin Workspaces
  1. packages:ROS系统中最底层最基本的组织,里面保存着各种文件库、工具、可执行文件等
  2. Catkin workspaces:包的顶层工作目录,一个catkin workspace 包含一个工程下面多个ros package
  3. Package.xml:每个包的描述文件,都需要放置在包的根目录下,对包的名字/版本/作者/依赖关系进行说明。其中,最重要的是下面的depend
  4. CMakeList.txt:定义一个包的编译指令,cmake不会找package.xml文件.依据cmakelist.txt文件编译需要清晰指出头文件和库文件的指向

catkin_package(CATKIN_DEPENDS roscpp) 声明依赖本包同时需要的其他ros包
find_package(catkin REQUIRED COMPONENTS …) 声明编译本包所需要的其他ros包
add_executable 声明编译本包生成的可执行文件
target_link_libraries 链接可执行文件和依赖库

1.2 ROS Node

常用命令:

rosnode list:查看当前注册到ros master的所有节点
rosnode info:查看某个节点的具体信息

1.3 ROS Topic

节点之间通过一个ROS topic来相互通信

  • 通过publicer声明所发布topic名称
  • 通过subscriber声明所需要监听的topic名称

常用命令:

rostopic list:查看当前注册到ros master 的所有topic列表
rostopic echo:把当前topic输出到控制台,方便调试和查看

1.4 ROS param

rosparam命令允许我们在ROS参数服务器上存储和复制数据。参数服务器可以存储整数、浮点数、布尔值、字典和列表值

一个小型的KV库

常用命令:

rosparam set:设置参数
rosparam get:获取参数
rosparam list:查看当前服务器上的参数

1.5 catkin_make生成的build&devel文件夹

build:存放编译的缓存文件
devel:存放编译完成的文件

对应devel文件,需要将其setup.bash到.bashrc文件中,也就是设置环境变量,让系统能够找到该工作空间。当然,更新了.bashrc文件后,需要执行一次 source ~/.bashrc 命令,或者bash 一下终端窗口,目的是让系统重新读取一次 .bashrc 文件。

2 Docker

关键:docker的安装,自行百度ubuntu 20.04+docker+install
注意点:

  1. 工作空间的数据关联,
  2. 查询容器的id
  3. 进入目标容器
  4. 退出目标容器操作
  5. 编译前环境变量的设置
2.1 Docker
  • docker基于容器技术的轻量级虚拟化解决方案
  • docker是容器引擎,把Linux的cgroup、namespace等容器底层技术进行封装抽象,为用户提供了创建和管理容器的便捷界面(包含命令行和API)
  • Docker是一个开源项目,诞生于2013年初,基于Google公式推出的Go语言是实现
2.2 Docker可以做什么
  • 隔离系统环境(docker类似虚拟机,但比虚拟机更加轻量级,一个系统可以装上千个docker,但是不能装上千个虚拟机;docker占用资源相对很低,虚拟机占用资源相对很高)

  • 极简的安装和部署方式

  • 让复杂系统安装配置成为历史

2.3 Docker优点

传统程序分发:

  1. 源码分发:需要用户自己编译,解决依赖问题
  2. 解决依赖时,对系统又侵入性,可能解决了这个依赖,其他的程序又不能运行,python2&python3等case案例
  3. 可执行文件分发:多平台多次编译,跨平台受限

docker分发:
要求用户安装docker即可,环境,依赖均独立,不影响系统原有库

2.4 Docker概念
  1. Docker Images(类似镜像)

Docker images 是Docker container 最基本的模板。Image通过容器使系统和应用易于安装,Docker image是用来运行的容器。http://hub.docker.com/找到许多images(多种操作系统和软件已经被安装好的docker)

  1. Docker container(以类做近似对比的话,image是class,container是image类的一个实例)

Docker容器(docker container)是一个image,在运行docker image上读取和写入。Docker是一个联合的文件系统作为容器后台,容器任何变化,都将保存在一个基本的image新的层上。我们安装应用程序的层就是容器。每个主机上运行的容器都是独立的,因此,提供了一个安全的应用平台。

  1. Docker Registry

Docker registry 是为Docker images提供的库。它提供了公共和私有库。公共docker库被叫做Docker Hub。这里我们能够上传push和pull自己的images。

2.5 使用Docker

终端运行:

sudo docker pull ros:noetic

Sudo docker images  //显示对应版本的大小等等信息则表示安装本地成功
cd ~/catkin_ws
sudo docker run -itd -v$(pwd):/data ros:noetic
// -itd  表示一直可以在后台运行
// -v  表示将数据集和虚拟机的文件系统关联起来
// pwd  表示当前目录
// /data  表示的是虚拟机目录

//查看当前的docker运行的镜像,获取container的ID
Sudo docker ps -a 
//进入docker镜像,编译程序
Sudo docker exec -it container的ID /bin/bash
// exec  表示使用container执行一行命令
// -it  表示执行命令时,需要获取一个terminal
// /bin/bash表示执行的命令

//进入了一个docker目录下  
// /data/src  指的是原工作空间数据

//然后,docker目录下,新建一个同名的工作空间  mkdir catkin_ws
//把原工作空间的内容拷贝到新建的工作空间中    
cp –r /data/src ./catkin_ws
//进入工作空间中   
cd ./catkin_ws
//在编译之前需要配置环境变量
echo 'opt/ros/noetic/setup.bash' >> /root/.bashrc

//可以通过指令 cat /root/.bashrc  查看环境变量是否添加成功
//这时候,使用指令   
source /root/.bashrc
//开始编译,   
catkin_make

//如果想要退出docker目录,使用指令    
exit

把自己封装的Docker镜像(image)打包导出操作

//还是在最原始的工作空间(不是docker上)下,首先查看刚才container的ID
Sudo docker ps –a

//查看了id

Sudo docker commit container的ID myimage(自定义镜像名字)

Sudo docker images   查看自己打包的镜像(myimage)

//这时候,可以使用该镜像进行安装,并可以使用其中的所有功能程序了

记录了一些基础的知识,更详细的ROS讲解推荐B站赵虚左老师的视频。

你可能感兴趣的:(无人驾驶入门,架构,自动驾驶,学习,笔记)