Rviz
一个用于ROS的三维可视化平台,核心功能是显示数据
在这个平台上,我们可以通过设置左侧的参数,来从interface中获取数据,通过点击左下角的Add来添加可视化项目。
Rqt
另一个ROS的可视化平台, 使用rqt打开,可以在plugins下自定义添加interface的请求者与接收者来调试程序
urdf
ROS中的建模方法叫做URDF,全称是统一机器人描述格式,不仅可以清晰描述机器人自身的模型,还可以描述机器人的外部环境。URDF模型文件使用的是XML格式。
在这个文件内,我们可以去创建我们自己的机器人模型
使用urdf_to_graphviz mbot_base.urdf # 在模型文件夹下运行, 我们可以将模型转为PDF,从而观察模型结构,而无需使用rviz打开
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