Lazy loaded image
🤖ROS 理论与实践
ROS 官网教程01-基础概念和操作
Words 4919Read Time 13 min
2024-9-9
2024-9-9
type
date
slug
category
icon
password

一、安装和配置ROS环境

1.1 安装 ROS

ROS安装选择介绍了不同ROS安装版本
序号
名称
发布时间
支持时间
操作系统支持
1
ROS Melodic Morenia
发布于2018年5月
LTS长期支持到2023年5月
建议在Ubuntu 18.04上安装
2
ROS Noetic Ninjemys
发布于2020年5月
最新的LTS长期支持到2025年5月
建议在Ubuntu 20.04上安装
可以通过如下命令查看系统版本,当前版本为 20.04,根据建议,安装了 ROS Noetic
Ubuntu 不同版本代号
  • Ubuntu 12.04 (LTS)代号为precise。
  • Ubuntu 14.04 (LTS)代号为trusty。
  • Ubuntu 15.04 代号为vivid。
  • Ubuntu 15.10 代号为wily。狡猾的
  • Ubuntu 16.04 (LTS)代号为xenial。好客的
  • Ubuntu 18.04 代号bionic 仿生的
  • Ubuntu 20.04 代号focal
ROS安装方法参考在 Ubuntu 上安装 ROS Noetic

1.2 管理环境

  • 环境变量管理用途
    • ROS依赖于使用shell环境组合空间的概念,这使得针对不同版本的ROS或不同的软件包集开发变得更加容易。
  • 环境变量设置文件来源
      1. 用软件包管理器安装的ROS软件包已经提供了setup.*sh文件
      1. 在rosbuild workspaces中使用类似rosws的工具生成(rosbuild工具不再维护不推荐)
      1. 编译或安装catkin软件包时自动生成(catkin现在是组织代码的推荐方式,它使用更标准的CMake约定,并具有更大的灵活性)
  • 设置环境变量
    • 通过Ubuntu上的apt工具来安装ROS的,那么你将会在/opt/ros//目录中看到setup.*sh文件,以执行下面的source命令:
      在每次打开终端时你都需要先运行上面这条后才能访问ROS相关的命令,为了避免这一繁琐过程,你可以事先在.bashrc文件中添加这条命令。
  • 测试是否正确配置了环境

    1.3 创建 ROS 空间

    • Catkin适用性
      • 操作方法只适用于ROS Groovy及更新版本
      • 对于ROS Fuerte及早期版本,请选择rosbuild。
    • 创建和构建一个 catkin 工作空间创建完,catkin_ws 目录结构如下(build子文件夹有删减)
      • src目录下创建一个CMakeLists.txt的链接。
      • source devel/setup.bash可将当前工作空间设置在环境最顶层
      • 要保证工作区被安装脚本正确覆盖,需确定ROS_PACKAGE_PATH环境变量包含你当前的工作空间目录:

    至此,环境已搭建好。

    二、ROS文件系统导览

    2.1 文件系统概念

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

    2.2 文件系统工具

    程序代码散落在许多ROS包中。使用Linux内置命令行工具(如ls和cd)来进行查找和导航可能非常繁琐,因此ROS提供了专门的命令工具来简化这些操作1
    • rospack = ros + pack(age) - rospack允许你获取软件包的有关信息。
      • 查找是否存在该报,存在返回地址 rospack find roscpp
    • roscd = ros + cd - 允许你直接切换目录(cd)到某个软件包或者软件包集当中
      • 切换到软件包 roscd roscpp
      • roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包
      • 切换到软件包子目录roscd roscpp/cmake
      • 存储ROS日志文件的目录 roscd log,但若未执行任何 ROS 程序,系统会报错该目录不存在
    • rosls = ros + ls - 直接按软件包的名称执行 ls 命令(而不必输入绝对路径)
      • 查看roscpp_tutorials组成 rosls roscpp_tutorials

    三、创建ROS软件包

    3.1 创建 catkin 软件包

    3.2 查看软件包依赖关系

    beginner_tutorials 的一级依赖运行为catkin_create_pkg命令时作为参数的依赖包,同样可以在 package.xml 文件中查看

    3.3 catkin 软件包组成

    • 这个包必须有一个符合catkin规范的package.xml文件
    • 这个包必须有一个catkin版本的CMakeLists.txt文件
    • 每个包必须有自己的目录
    最简单的软件包看起来就像这样:
    package.xml的组成部分
    • 描述标签
    • 维护者标签
    • 许可证标签
    • 依赖项标签
    notion image
    最终 package.xml

    四、构建ROS软件包

    4.1 catkin_make 构建软件包

    CMake工作流程
    工作空间有多个软件包时,则需要每个 package 都需使用 cmake 编译
    而多个 catkin 项目放在工作空间,可以通过 catkin_make 一起构建
    若catkin项目没有放在工作空间的 catkin/src 目录下,比如 my_src 下,可以这样使用 catkin_make:
    对于catkin_make的高级用法,请参考catkin/commands/catkin_make

    4.2 开始构建你的软件包

    五、理解 ROS 节点

    节点:ROS软件包中的一个可执行文件。节点组成通过话题、服务和动作与其他节点之间沟通2
    注:节点是ROS中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:
    例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任 务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)
    notion image
    Understanding nodes — ROS 2 Documentation: Foxy documentation
    :beetle:注意: 当打开一个新的终端时,环境将会重置,~/.bashrc文件将会生效。如果你在运行rosnode等命令时出现一些问题,那么可能需要将一些环境设置文件添加到~/.bashrc或手动source一下。

    5.1 使用 roscore 和 rosnode

    1. roscore 运行所有 ROS 程序前首先要运行的命令
    1. 打开一个新终端,查看正在运行的节点 rosnode list
    1. 查看节点信息 rosnode info /rosout

    5.2 使用 rosrun 调出另一个节点

    在 ubuntu 中,可以使用 Ctrl+Shift+C可以关掉节点。

    六、理解 ROS 话题和消息

    6.1 引例 - 通过键盘控制乌龟移动

    1. 运行 roscore,若上一节未退出,则即可,重复输入启动命令,会报错
    1. 打开 turtlesim 包下的 turtlesim_node 节点,rosrun turtlesim turtlesim_node
    1. 通过键盘控制 turtle,rosrun turtlesim turtle_teleop_key, 按键盘上方向键,可以控制乌龟移动
    :warning: 注意:请选中turtle_teleop_key的终端窗口(是中断窗口而非图形界面窗口)以确保按键输入能够被捕获。
    1. rosrun rqt_graph rqt_graph ,使用rqt_graph来显示当前运行的节点和话题。
    notion image
    以上,建立了两个节点,而turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来相互通信的。turtle_teleop_key在话题上发布键盘按下的消息,turtlesim订阅该话题以接收消息。

    6.2 话题和话题消息类型

    命令
    使用

    6.3 发布话题消息和频率

    命令
    使用

    6.4 显示话题数据(数字和图形)

    关于话题上发布的数据,可以通过下面两种方式查看:
    经过 6-1 到 6-3 到此步骤后,更新 6-1 第四步骤画出的节点图,如下:
    notion image
    显示 /turtle1/pose/y 和 /turtle1/pose/x
    ROS/Tutorials/UnderstandingTopics/rqt_plot.png
    ROS/Tutorials/UnderstandingTopics/rqt_plot.png
    显示 /turtle1/pose/theta
    ROS/Tutorials/UnderstandingTopics/rqt_plot2.png
    ROS/Tutorials/UnderstandingTopics/rqt_plot2.png

    七、理解 ROS 服务和参数

    7.1 调用服务(输入服务参数)

    服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)
    list命令显示turtlesim节点提供了9个服务:resetclearspawnkillturtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relativeturtlesim/get_loggersturtlesim/set_logger_level。同时还有两个与rosout节点有关的服务:/rosout/get_loggers/rosout/set_logger_level
    示例: /clear 服务
    示例: /spawn 服务

    7.2 参数(设置、获取、保存和加载)

    设置和获得参数
    现在我们修改背景颜色的红色通道值:
    上述指令修改了参数的值,现在我们==需要调用clear服务使得参数的修改能生效==:
    保存和加载参数
    在这里,我们将所有的参数写入params.yaml文件:
    你甚至可以将yaml文件重载入新的命名空间,例如copy_turtle

    八、使用 roslaunch

    1. 切换工作目录,并创建 launch 文件夹
      1. ⚠️注意:存放launch文件的目录不一定非要命名为launch,事实上都不用非得放在目录中,roslaunch命令会自动查找经过的包并检测可用的启动文件。然而,这种推荐的标准做法被认为是“最佳实践”。
    1. 创建 turtlemimic.launch 文件
        • 行 3 - 行 9:创建两个分组,以 namespace标签区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个分组中都有相同的名为sim的turtlesim节点。这样可以让我们同时启动两个turtlesim模拟器,而不会产生命名冲突。
        • 行 11 - 行 14:在这里我们启动模仿节点,话题的输入和输出分别重命名为turtlesim1turtlesim2,这样就可以让turtlesim2模仿turtlesim1了。
    1. roslaunch 启动
      1. notion image
    1. 节点图查看Launch 操作
      1. notion image

    九、创建ROS消息和服务

    9.1 创建 msg

    为了确保msg文件能被转换为C++、Python和其他语言的源代码,还需要如下操作:
    1. 打开 package.xml,添加如下两行
      1. 打开 CMakeLists.txt 文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了
        1. 打开 CMakeLists.txt 文件中,作如下修改,确保导出消息的运行时依赖关系

          9.2 使用 rosmsg

          创建消息后,可以通过 rosmsg show 命令看看 ROS 能否识别它
          • beginner_tutorials -- 定义消息的软件包
          • Num -- 消息的名称 Num
          如果不记得msg在哪个包中,也可以省略包名称。尝试:
          你会看到:

          9.3 创建 srv

          从另一个包复制现有的srv定义,而不是手动创建新的srv。
          为了确保msg文件能被转换为C++、Python和其他语言的源代码,还需要如下操作:
          1、2 项操作和[创建 msg](#创建 msg)处一致
          添加所需的服务依赖项

          9.4 使用 rossrv

          创建服务后,可以通过 rossrv show 命令看看 ROS 能否识别它
          • beginner_tutorials -- 定义消息的软件包
          • AddTwoInts -- 服务的名称 AddTwoInts
          如果不记得srv在哪个包中,也可以省略包名称。尝试:
          你会看到:

          10.5 msg 和 srv 的一般步骤

          如果没做过上面的教程,请先修改下CMakeLists.txt
          取消注释,然后添加任意你的消息用到的包含.msg文件的软件包(本例中为std_msgs),如下所示:
          现在我们已经创建了一些新消息,所以需要重新make一下软件包:
          msg目录中的任何.msg文件都将生成所有支持语言的代码。
          • C++消息的头文件将生成在~/catkin_ws/devel/include/beginner_tutorials/
          • Python脚本将创建在~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg
          • Lisp文件则出现在~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/
          类似地,srv目录中的任何.srv文件都将生成支持语言的代码。对于C++,头文件将生成在消息的头文件的同一目录中。对于Python和Lisp,会在msg目录旁边的srv目录中。
          消息格式的完整规范在消息描述语言中。
          如果你正在构建使用新消息的C++节点,则还需要声明节点和消息之间的依赖关系,参见catkin消息和服务构建文档
           

          参考资料

          1. http://wiki.ros.org/rosbash  2. [What is a ROS Node? - The Robotics Back-End (roboticsbackend.com)](https://roboticsbackend.com/what-is-a-ros-node/#:~:text=A ROS node%2C according to,%2C services%2C actions%2C etc.) 
          上一篇
          原理篇02-再说Cortex-M处理器对OS支持特性
          下一篇
          ROS 官网教程02-发布者订阅者-服务和客户端

          Comments
          Loading...