ROS2 工具

699 阅读4分钟

Rviz

一个用于ROS的三维可视化平台,核心功能是显示数据

image.png

image.png

在这个平台上,我们可以通过设置左侧的参数,来从interface中获取数据,通过点击左下角的Add来添加可视化项目。

image.png

Rqt

另一个ROS的可视化平台, 使用rqt打开,可以在plugins下自定义添加interface的请求者与接收者来调试程序

image.png

urdf

ROS中的建模方法叫做URDF,全称是统一机器人描述格式,不仅可以清晰描述机器人自身的模型,还可以描述机器人的外部环境。URDF模型文件使用的是XML格式。

在这个文件内,我们可以去创建我们自己的机器人模型

image.png

使用urdf_to_graphviz mbot_base.urdf # 在模型文件夹下运行, 我们可以将模型转为PDF,从而观察模型结构,而无需使用rviz打开

image.png

Gazebo

一个用于ROS的仿真平台,核心功能是创造数据,我们没有机器人或者传感器,它可以帮我们做一个虚拟的;

TODO

launch

到目前为止,每当我们运行一个ROS节点,都需要打开一个新的终端运行一个命令ros2 run。机器人系统中节点很多,我们可以通过编写Launch来一次性启动多个节点。Launch启动文件,它是ROS系统中多节点启动与配置的一种脚本。

ros2 run: command Line
ros2 launch: base.sh

使用python语言编写ROS2 launch文件,最主要的是把每个节点、文件、脚本等抽象成一个action,用统一的接口来启动,主要结构是:

def generate_launch_description():
    return LaunchDescription([
        action_1,
        action_2,
        ...
        action_n
    ])

我们在之前创建的pkg_helloworld_py功能包的路径下,新建一个launch文件夹,然后在launch文件夹内新建single_node_launch.py(推荐以*_launch.py来结尾)文件 文件基本内容

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    # 相当于 ros2 run pkg_helloworld_py helloworld
    node = Node(
        package='pkg_helloworld_py',
        executable='helloworld',
    )

    return LaunchDescription([node])

除了编写launch,我们还需要在setup.py下编写

# 1、导入相关的头文件
import os
from glob import glob

# 2、在data_files的列表中,加上launch路径以及路径下的launch.py文件
data_files=[......
     (os.path.join('share',package_name,'launch'),glob(os.path.join('launch','*launch.py'))),
],

便于编译时找到对应的文件

资源重映射

实际上使用中,我们可能发现别人给我们的topic可能不符合我们的命名规范,故在重映射中,我们可以实现将topic等资源重命名

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    publisher_node = Node(
        package='pkg_topic',
        executable='publisher_demo',
        output='screen',
        remappings=[("/topic_demo", "/topic_update")]  #!!!!!!
    )

    return LaunchDescription([
        publisher_node  
    ])

launch套launch

# 表示该功能包文件夹下的launch文件下的launch文件名字也就是示例中 /single_node_launch.py
launch = IncludeLaunchDescription(PythonLaunchDescriptionSource(
    [os.path.join(get_package_share_directory(...), 'launch'), '/single_node_launch.py'])
)
return LaunchDescription([launch])

launch参数

from launch import LaunchDescription                   # launch文件的描述类
from launch.actions import DeclareLaunchArgument       # 声明launch文件内使用的Argument类
from launch.substitutions import LaunchConfiguration, TextSubstitution

from launch_ros.actions import Node                    # 节点启动的描述类


def generate_launch_description():                     # 自动生成launch文件的函数
   background_r_launch_arg = DeclareLaunchArgument(
      'background_r', default_value=TextSubstitution(text='0')     # 创建一个Launch文件内参数(arg)background_r
   )
   background_g_launch_arg = DeclareLaunchArgument(
      'background_g', default_value=TextSubstitution(text='84')    # 创建一个Launch文件内参数(arg)background_g
   )
   background_b_launch_arg = DeclareLaunchArgument(
      'background_b', default_value=TextSubstitution(text='122')   # 创建一个Launch文件内参数(arg)background_b
   )

   return LaunchDescription([                                      # 返回launch文件的描述信息
      background_r_launch_arg,                                     # 调用以上创建的参数(arg)
      background_g_launch_arg,
      background_b_launch_arg,
      Node(                                                        # 配置一个节点的启动
         package='turtlesim',
         executable='turtlesim_node',                              # 节点所在的功能包
         name='sim',                                               # 对节点重新命名
         parameters=[{                                             # ROS参数列表
            'background_r': LaunchConfiguration('background_r'),   # 创建参数background_r
            'background_g': LaunchConfiguration('background_g'),   # 创建参数background_g
            'background_b': LaunchConfiguration('background_b'),   # 创建参数background_b
         }]
      ),
   ])

launch文件中出现的argument和parameter,虽都译为“参数”,但含义不同: -argument:仅限launch文件内部 使用,方便在launch中调用某些数值; -parameter:ROS系统的参数,方便在节点间使用某些数值。

小结

定义节点使用Node(...)
描述launch使用LaunchDescription(...)
launch套launch使用IncludeLaunchDescription(...)
添加命名空间GroupAction(...)

TF

TF用于描述机器人所在位置,从而使得机器人明白自己现在所处的位置。TF使用三维坐标系来确定自己的位置,常用的坐标系有机器人中心点的基坐标系base link,雷达位置的雷达坐标系laser link,里程计坐标系odom,而里程计有误差和漂移,又有绝对位置地图坐标系map

这边适合去使用相关机器人的书籍来学习

TODO