Ros2学习2

ros2

action

当需要实时反馈指令效果时,ROS需要应用级的通信机制--动作(action)

action也并不是一个全新的机制,而是由底层的三个话题和服务组成:

  • 一个任务目标(Goal,服务)
  • 一个执行结果(Result,服务)
  • 周期数据反馈(Feedback,话题)

action是可抢占式的,由于需要执行一段时间,比如执行过程中你不想跑了,那可以随时发送取消指令,动作终止,如果执行过程中发送一个新的action目标,则会直接中断上一个目标开始执行最新的任务目标。

action是一个客户端/服务器的通信模型,客户端发送一个任务目标,服务器端根据收到的目标执行并周期反馈状态,执行完成后反馈一个执行结果。

利用按键 G|B|V|C|D|E|R|T 都是围绕“F”的,可以向客户端发送action的任务目标,海龟仿真器后台运行的服务器端接收到之后就会开始执行,执行完成后反馈给客户端类似下边的结果:

action是抢占式的,后一个action的执行直接中断了前一个action的执行。

查看节点信息

海龟仿真器节点有哪些action:

ros2 node info /turtlesim

可以看到所有仿真器中的订阅者、发布者、服务、动作服务器和客户端。

查看action列表

ros2 action list

查看action的数据类型 ros2 action list -t

查看action的信息

ros2 action info /turtle1/rotate_absolute

可以看到提供该action的服务器和客户端的数量

查看action数据类型

查看action更详细的数据结构

ros2 interface show turtlesim/action/RotateAbsolute.action

  • 第一段是描述客户端发送的请求目标
  • 第二段描述的是的反馈结果
  • 第三段描述的是action执行过程中的周期反馈

命令行发送action目标

发送goal的格式 ros2 action send_goal <action_name> <action_type> <values>

利用YAML格式描述数据

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"

利用feedback参数 终端会不断周期刷新反馈信息.


##rqt_console 运行ros2节点时,节点日志信息会在终端中显示出来. ros2还提供了一个专门用于管理日志信息的可视化工具 rqt_console

ros2 run rqt_console rqt_console

日志的基本由高到低:

  • Fatal:致命级,描述系统为了自我保护即将终止的消息
  • Error:错误级,描述非致命但是会阻碍程序运行的消息
  • Warn:警告级,描述不损坏功能运行但是预期之外的行为的消息
  • Info:信息级,描述系统正常运行时事件和状态消息
  • Debug:调试级,描述系统一步一步运行的详细消息

ROS2中默认开启的日志级别是Info,会自动显示info级别以上的所有日志,包括Info、Warn、Error、Fatal。

可以修改允许发布的日志级别

比如只想显示Warn级别以上:

ros2 run turtlesim turtlesim_node --ros-args --log-level WARN


launch

launch启动文件,可以通过一个类似脚本的文件,一起启动多个节点.



from launch import LaunchDescription
from launch_ros.actions import Node      # 引用模块

def generate_launch_description():       # 在LaunchDescription中描述三个节点的启动
    return LaunchDescription([
        Node(
            package='turtlesim',
            namespace='turtlesim1',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            namespace='turtlesim2',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            executable='mimic',
            name='mimic',
            remappings=[
                ('/input/pose', '/turtlesim1/turtle1/pose'),
                ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
            ]
        )
    ])

#mimic节点通过订阅turtle1的位置,转换成对turtle2的速度指令发布出去,最后应该可以达到让turtle2模仿turtle1完成同样的运动。

启动launch文件

ros2 launch <package_name> <launch_file_name>

ros2 launch turtlesim_mimic_launch.py

可以利用rqt_graph观测

但是mac下的工具有bug,没有信号连接线

launch中在ros2_eloquent版本中有改动:

namespace --> node_namespace executable --> node_executable


ros2bag

ros2 bag是一个命令行工具,可以实现对ROS2系统中话题数据的录制和回放,选定的数据会被打包放到一个数据库文件中,未来使用该工具即可按照时间轴回放所有话题数据。

确认是否安装: sudo apt-get install ros-<distro>-ros2bag ros-<distro>-rosbag2*

ros2 bag录制话题数据

ros2 bag录制话题数据的命令是: ros2 bag recode <topic_name>

数据会保存在当前终端所在的路径下,最好先cd到创建的目录下,再运行record

录制数据的日志提示

利用ctrl+C停止录制,已经录制好的数据会保存在rosbag2_year_month_day-hour_minute_second命名的文件中。

录制多个话题

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

-o 参数是用来设置数据库文件名的,此时文件名叫subset.多个话题名通过空格隔开.

可以使用-a参数来录制所有话题的数据.

查看数据库文件

可以使用命令查看数据库文件的信息: ros2 nag info <bag_info_name>

ros2 bag回放数据

回放数据的命令: ros2 bag play subset


updatedupdated2021-02-182021-02-18