机器人控制系统 ROS2 学习笔记

第1章 环境搭建

(一)ROS2 的安装和配置

(二)ROS2快速体验

  • 构建 C++ 源文件、构建 Python 源文件;
  • 5个步骤:创建功能包、编辑源文件、修改配置文件、编译、执行;

(三)集成开发环境搭建

  • 利用 VSCode 开发、插件和环境配置;
  • 如何在一个功能包下创建多个源文件,只需要修改配置文件;
  • 安装终端:Terminator;

(四)ROS2体系框架

  • 创建工作空间:

    mkdir -p [工作空间名]/src	# 创建文件夹
    cd [工作空间名]/		# 进入文件夹
    colcon build 	# 构建工作空间
    
  • 一个工作空间的结构:
    在这里插入图片描述

  • 资源初始化与资源释放:
    在这里插入图片描述

  • 配置文件

    C++功能包的构建信息主要包含在 package.xmlCMakeLists.txt 中;

    Python功能包的构建信息则主要包含在 package.xmlsetup.py 中。

  • 操作命令

    ROS2的文件系统核心是功能包,我们可以通过编译指令colcon和ROS2内置的工具指令ros2来实现功能包的创建、编译、查找与执行等相关操作。

    1. 创建功能包

      新建功能包语法如下:

      ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称
      

      格式解释:

      • --build-type:是指功能包的构建类型,有cmake、ament_cmake、ament_python三种类型可选;不填默认为 ament_cmake;
      • --dependencies:所依赖的功能包列表;
      • --node-name:可执行程序的名称,会自动生成对应的源文件并生成配置文件。
    2. 编译
      编译功能包语法如下:

      colcon build
      

      colcon build --packages-select [功能包列表]
      

      前者会构建工作空间下的所有功能包,后者可以构建指定功能包。

    3. 执行
      执行命令语法如下:

      . install/setup.bash	# 刷新setup文件
      ros2 run 功能包 可执行程序 参数
      
    4. 查找
      ros2 pkg命令下包含了多个查询功能包相关信息的参数。

      ros2 pkg executables [包名]	# 输出所有功能包或指定功能包下的可执行程序。
      ros2 pkg list	# 列出所有功能包
      ros2 pkg prefix 包名	# 列出功能包路径
      ros2 pkg xml	# 输出功能包的package.xml内容
      

(五)ROS2核心模块

  • 通信相关

    应用场景、功能包的应用(二进制命令安装、源码安装、自实现)、分布式;

  • 工具相关

    • 终端命令与rqt

      rqt是一个图形化工具,功能与命令行工具类似;

    • lunch文件

      批量地启动多个ROS2节点,是构建大型项目时启动多节点的常用方式;

    • TF坐标变换

      实现机器人不同部位(或不同机器人)之间的相对位置的转换;

    • 可视化

      图形化显示机器人模型;

第2章 通信机制的核心

在这里插入图片描述

(一)通信机制简介

  1. 节点

    通信对象的构建依赖于节点;系统由多个协同工作的节点组成。

  2. 话题

    Topic是一个纽带,具有相同话题的节点关联到一起,这是节点之间通信的前提。尽管节点是用不同语言实现的,具有相同话题就可以实现数据交互。

  3. 通信模型

    在这里插入图片描述

  4. 接口

    接口,即传输的数据的载体。通信时使用的数据载体需要使用接口文件定义。常用的接口文件有三种:msg文件、srv文件与action文件。每种文件都可以按照一定格式定义特定数据类型的“变量”。

    • msg文件是用于定义话题通信中数据载体的接口文件;
    • srv文件是用于定义服务通信中数据载体的接口文件;
    • action文件使用用于定义动作通信中数据载体的接口文件;
    • 参数通信的数据无需定义接口文件,参数通信时数据会被封装为参数对象,参数客户端和服务端操作的都是参数对象。

    变量类型:不管是何种接口文件,在文件中每行声明的数据都由字段类型和字段名称组成;

(二)话题通信的实现

创建新的工作空间:ws01_plumbging,在工作空间下创建基础的接口功能包base_interfaces_demo

创建话题通信的功能包:py01_topic

  • 使用话题通信实现原生消息的传输;

第3章 通信机制的补充

第4章 launch与rosbag2

在这里插入图片描述

(一)启动文件launch简介

节点是程序的基本构成单元,一个系统的功能模块由多个节点组成,启动某个功能模块需要依次启动这些节点。而launch模块用于实现节点的批量启动。

作用:简化节点的配置与启动,提高程序的启动效率。

(四)录制回放工具rosbag2

在ROS2中实现数据的留存(保存在磁盘中,序列化的过程)及读取,提供了专门的工具:rosbag2。

它是一个用于录制和回放话题的一个工具集,工具的集合。

作用:实现数据的复用,方便调试、测试。

第5章 ROS2工具之坐标变换

在机器人系统中,会经常性的使用到“相对位置关系”这一概念,比如:

机器人自身不同部件的相对位置关系,机器人与出发点的相对位置关系,传感器与障碍物的相对位置关系,机器人组队中不同机器人之间的相对位置关系等等。

ros2中使用坐标变换使用相对位置。

在这里插入图片描述

(一)坐标变换简介

tf(TransForm Frame)是指坐标变换,它允许用户随时间跟踪多个坐标系。

在时间缓冲的树结构中维护坐标帧之间的关系,并让用户在任何所需的时间点在任意两个坐标帧之间变换点、向量等。

作用:在ROS中用于实现不同坐标系之间的点或向量的转换。

第6章 ROS2工具之可视化

在这里插入图片描述

(一)可视化简介

在前面人机交互的过程中,开发者在终端启动程序来下发数据,程序运行过程中通过命令行的工具来获取机器人发布的数据。这种方式不够直观。

ROS2提供了rviz2这个图形化用户接口,通过这个接口调用者可以用“可视化”的方式与机器人交互。

rviz 即 ROS Visualization Tool,ROS2的三维可视化工具。目的是以三维方式显示ROS消息,并将数据进行可视化表达。如显示机器人模型、激光雷达数据、三维点云数据、从相机获取图像值等。

机器人建模由 URDF 实现。

URDF 即 Unified Robot Description Format,统一(标准化)机器人描述格式。能够以XML文件的方式描述机器人的部分结构。

(二)rviz2的基本使用

  • 启动

    rviz2
    
  • 左侧插件

(三)rviz2集成URDF

准备工作:

  1. 安装所需功能包;
  2. 新建功能包;
  3. 功能包下新建 urdf、rviz、launch、meshes目录以备用,其中 urdf 目录下再新建子目录 urdf 与 xacro。

正式工作:

  1. 编写 URDF 文件;

    • URDF语法;
  2. 编写 launch 文件:加载urdf文件并在rviz2中显示机器人模型;

    核心:

    1. 启动robot_state_publisher节点,该节点要以参数的方式加载urdf文件内容;
    2. 启动rviz2节点;

    优化:

    1. 添加 joint_state_publisher 节点(当机器人有非固定关节时,必须包含该节点);

    2. 设置 rviz2 的默认配置文件;

      可以打开之前设置好插件的rviz2;

    3. 动态传入 urdf 文件,把 urdf 文件封装为参数;

      动态传参启动任意 urdf 文件:
      ros2 launch cpp06_urdf display.launch.py model:=`ros2 pkg prefix --share cpp06_urdf`/urdf/urdf/xxx.urdf
      
  3. 编辑配置文件;

    • package.xml:在 package.xml 中需要手动添加一些执行时依赖;
    • CMakeLists.txt:在功能包下,新建了若干目录,需要为这些目录配置安装路径;
  4. 编译;

  5. 执行 launch 文件并在 rviz2 加载机器人模型。

    工作空间下:
    colcon build --packages-select cpp06_urdf
    . install/setup.bash
    ros2 launch cpp06_urdf display.launch.py
    

(四)URDF语法

(1) <robot>
<robot name="mycar">

</robot>

属性

  • name:主文件必须具有名称属性;被包含文件如果指定名称属性,需要和主文件一致;

子标签

其他标签都是其子级标签。

(2) <link>

在这里插入图片描述

属性

  • name(必填):为连杆命名。

子标签

  1. <visual>(可选):用于描述link的可视化属性,可以设置link的形状(立方体、球体、圆柱等)
  • name(可选):指定link名称,此名称会映射为同名坐标系,还可以通过引用该值定位定位link。
  • <geometry>(必填):用于设置link的形状,比如:立方体、球体或圆柱。
    • <box>:立方体标签,通过size属性设置立方体的边长,原点为其几何中心。
    • <cylinder>:圆柱标签,通过radius属性设置圆柱半径,通过length属性设置圆柱高度,原点为其几何中心。
    • <sphere>:球体标签,通过radius属性设置球体半径,原点为其几何中心。
    • <mesh>:通过属性filename引用“皮肤”文件,为link设置外观,该文件必须是本地文件。使用 package://<packagename>/<path> 为文件名添加前缀。
  • <origin>(可选):用于设置link的相对偏移量以及旋转角度,如未指定则使用默认值(无偏移且无旋转)。
    • xyz:表示x、y、z三个维度上的偏移量(以米为单位),不同数值之间使用空格分隔,如未指定则使用默认值(三个维度无偏移)。
    • rpy:表示翻滚、俯仰与偏航的角度(以弧度为单位),不同数值之间使用空格分隔,如未指定则使用默认值(三个维度无旋转)。
  • <material>(可选):视觉元素的材质。也可以在根标签robot中定义material标签,然后,可以在link中按名称进行引用。
    • name(必填):为material指定名称,可以通过该值进行引用。
    • <color>(可选):rgba 材质的颜色,由代表red/green/blue/alpha 的四个数字组成,每个数字的范围为 [0,1]。
    • <texture>(可选):材质的纹理,可以由属性filename设置。
  1. <collision>(可选):link的碰撞属性。

可以与link的视觉属性一致,也可以不同,比如:我们会通常使用更简单的碰撞模型来减少计算时间,或者设置的值大于link的视觉属性,以尽量避免碰撞。另外,同一链接可以存在多个<collision>标签实例,多个几何图形组合表示link的碰撞属性。

  • name(可选):为collision设置名称。
  • <geometry>(必须):请参考visual标签的geometry使用规则。
  • <origin>(可选):请参考visual标签的origin使用规则。
  1. <inertial>(可选):用于设置link的质量、质心位置和中心惯性特性。如果未指定,则默认为质量为0、惯性为0。
  • <origin>(可选):该位姿(平移、旋转)描述了链接的质心框架 C 相对于链接框架 L 的位置和方向。
    • xyz:表示从 Lo(链接框架原点)到 Co(链接的质心)的位置向量为 x L̂x + y L̂y + z L̂z,其中 L̂x、L̂y、L̂z 是链接框架 L 的正交单位向量。
    • rpy:将 C 的单位向量 Ĉx、Ĉy、Ĉz 相对于链接框架 L 的方向表示为以弧度为单位的欧拉旋转序列 (r p y)。注意:Ĉx、Ĉy、Ĉz 不需要与连杆的惯性主轴对齐。
  • <mass>(必填):通过其value属性设置link的质量。
  • <inertia>(必填):对于固定在质心坐标系 C 中的单位向量 Ĉx、Ĉy、Ĉz,该连杆的惯性矩 ixx、iyy、izz 以及关于 Co(连杆的质心)的惯性 ixy、ixz、iyz 的乘积。

实战

生成不同形状的机器人部件;

(3) <joint>

在这里插入图片描述

属性

  • name(必填):为关节命名,名称需要唯一。
  • type(必填):设置关节类型,可用类型如下:
    • continuous:旋转关节,可以绕单轴无限旋转。
    • revolute:旋转关节,类似于 continues,但是有旋转角度限制。
    • prismatic:滑动关节,沿某一轴线移动的关节,有位置极限。
    • planer:平面关节,允许在平面正交方向上平移或旋转。
    • floating:浮动关节,允许进行平移、旋转运动。
    • fixed:固定关节,不允许运动的特殊关节。

子标签

  • <parent>(必填):指定父级link。
    • link(必填):父级link的名字,是这个link在机器人结构树中的名字。
  • <child>(必填):指定子级link。
    • link(必填):子级link的名字,是这个link在机器人结构树中的名字。
  • <origin>(可选):这是从父link到子link的转换,关节位于子link的原点(中心)
    • xyz:各轴线上的偏移量。
    • rpy:各轴线上的偏移弧度。
  • <axis>(可选):如不设置,默认值为(1,0,0)。
    • xyz:用于设置围绕哪个关节轴运动。
  • <calibration>(可选):关节的参考位置,用于校准关节的绝对位置。
    • rising(可选):当关节向正方向移动时,该参考位置将触发上升沿。
    • falling(可选):当关节向正方向移动时,该参考位置将触发下降沿。
  • <dynamics>(可选):指定接头物理特性的元素。这些值用于指定关节的建模属性,对仿真较为有用。
    • damping(可选):关节的物理阻尼值,默认为0。
    • friction(可选):关节的物理静摩擦值,默认为0。
  • <limit>(关节类型是revolute或prismatic时为必须的):
    • lower(可选):指定关节下限的属性(旋转关节以弧度为单位,棱柱关节以米为单位)。如果关节是连续的,则省略。
    • upper(可选):指定关节上限的属性(旋转关节以弧度为单位,棱柱关节以米为单位)。如果关节是连续的,则省略。
    • effort(必填):指定关节可受力的最大值。
    • velocity(必填):用于设置最大关节速度(旋转关节以弧度每秒 [rad/s] 为单位,棱柱关节以米每秒 [m/s] 为单位)。
  • <mimic>(可选):此标签用于指定定义的关节模仿另一个现有关节。该关节的值可以计算为value = multiplier * other_joint_value + offset
    • joint(必填):指定要模拟的关节的名称。
    • multiplier(可选):指定上述公式中的乘法因子。
    • offset(可选):指定要在上述公式中添加的偏移量,默认为 0(旋转关节的单位是弧度,棱柱关节的单位是米)。
  • <safety_controller>(可选):安全控制器。
    • soft_lower_limit(可选):指定安全控制器开始限制关节位置的下关节边界,此限制需要大于joint下限。
    • soft_upper_limit(可选):指定安全控制器开始限制关节位置的关节上边界的属性,此限制需要小于joint上限。
    • k_position(可选):指定位置和速度限制之间的关系。
    • k_velocity(必填):指定力和速度限制之间的关系。

实战

创建机器人模型,底盘为长方体,在长方体前面添加一个摄像头。摄像头可以沿着Z轴360度旋转;

将半沉入地下的模型移上去;

<!-- 
 需求:创建机器人模型,底盘为长方体,在长方体前面添加一个摄像头。摄像头可以沿着Z轴360度旋转。

 实现:
	0. 设置初始化link:basefootprint
    1. 创建底盘link
    2. 创建摄像头link
    3. 通过joint关联底盘和摄像头
-->
<robot name="myCar">S
    <!-- 抽取颜色 -->
    <material name="yellow">
        <color rgba="0.8 0.8 0 0.8"/>
    </material>
    <material name="red">
        <color rgba="0.9 0 0 0.8"/>
    </material>

    <!-- 0. 设置初始化link:basefootprint -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <sphere radius="0.01"/>
                <material name="yellow"/>
            </geometry>
        </visual>
    </link>

    <!-- 1. 创建底盘link -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.5 0.3 0.1"/>
            </geometry>
            <origin xyz="0 0 0.0" rpy="0.0 0.0 0.0"/>
            <material name="yellow"/>
        </visual>
    </link>

    <!-- 初始化link通过关节连接base_link,设置关节的偏移量,让baselink上移 -->
    <joint name="base_link2base_footprint" type="fixed">
        <parent link="base_footprint"/>
        <child link="base_link"/>
        <origin xyz="0 0 0.05"/>
    </joint>

    <!-- 2. 创建摄像头link -->
    <link name="camera">
        <visual>
            <geometry>
                <box size="0.02 0.05 0.05"/>
            </geometry>
            <material name="red"/>
        </visual>
    </link>
	
    <!-- 3. 通过joint关联底盘和摄像头 -->
    <joint name="camera2base_link
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值