要么每次使用ros的时候source一下文件,要么将source 文件添加道shell启动脚本
获取设置文件
# Replace ".bash" with your shell if you're not using bash
# Possible values are: setup.bash, setup.sh, setup.zsh
source /opt/ros/humble/setup.bash
将获取设置文件命令添加到shell启动脚本
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
检查环境变量
printenv | grep -i ROS
turtlesim
和rqt
安装ros2的turtlesim包
sudo apt update
sudo apt install ros-humble-turtlesim
检查软件包是否已安装
ros2 pkg executables turtlesim
start turtlesim
启动turtlesim
ros2 run turtlesim turtlesim_node
启动了turtlesim软件包下的可执行程序turtlesim_node节点
使用turtlesim
ros2 run turtlesim turtle_teleop_key
启动turtlesim软件包下的可执行文件turtle_teleop_key,可以使用方向键控制海龟的运动
使用list命令查看节点、话题、服务和行动
ros2 node list
ros2 topic list
ros2 service list
ros2 action list
安装rqt
sudo apt update
sudo apt install ~nros-humble-rqt*
运行rqt:
rqt
使用rqt
第一次运行 rqt 之后,窗口将是空白的。要从顶部的菜单栏中选择 Plugins > Services > Service Caller.
Rqt 找到所有插件本身可能需要一些时间。如果单击 Plugins,但没有看到 Services 或任何其他选项,则应该关闭 rqt,在终端中输入命令 rqt —— force-Discovery。
Remapping
上面产生了两只龟,但是还是只能控制默认创建的那只龟,需要remapping才能控制第二只龟
在新终端中,source一下,然后运行:
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
运行turtlesim软件包下的turtle_teleop_key (海龟 远程操控 按键)可执行文件,传入参数
--ros-args
--remap
(重新映射) 将turtle1/cmd_vel:=turtle2/cmd_vel (将turtle1节点的服务_速度命令映射为turtle2节点的服务_速度命令)
现在可以控制两只龟了(需要在各自的终端中)
关闭乌龟仿真器
在turtlesim_node终端中输入Ctrl + C,同时在teleop(远程控制)终端中输入q
ros2 graph: ros2元素同步处理数据的网络
Nodes: ROS 中的每个节点应该负责一个单独用途的模块。每个节点都可以通过topics, services, actions, or parameters向其他节点发送和接受数据。
一个完整的机器人由多个节点协同工作,在ROS2中,单个可执行文件(C++程序、Python程序等)可以包含一个或多个节点。
ros2 run:命令ros2 run从软件包中运行一个可执行文件
ros2 run <package_name> <executable_name>
ros2 node list: 显示ros2节点列表
ros2 node list
\teleop_turtle
为啥呢?重启后显示两个节点了。?··?Remapping 重映射
重映射可以将默认节点属性(如节点名称、主题名称、服务名称等)重新分配给自定义值。
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
将__node映射为my_turtle
ros2 节点信息
已经知道了节点名称,通过下面的方式访问节点的信息
ros2 node info <node_name>
Ros2节点信息返回与该节点交互的订阅者、发布者、服务和操作(ROS 图形连接)的列表。
使用rqt_graph可视化节点和话题
运行rat_graph
rqt_graph
将鼠标悬停在中间的话题上,会高亮显示
该图描述了/turtlesim 节点和/teleop_turtle节点如何在一个主题上彼此通信。teleop_turtle 节点正在向/turtle1/cmd _ vel 主题发布数据(用于移动 Turtle 的按键) ,/turtlesim 节点订阅该主题以接收数据。
ros2 topic list #返回系统中当前活动的所有主题列表
ros2 topic list -t #返回相同的主题列表,主题类型附加在中括号中(主题的message类型)
这些属性,特别是类型,是节点在移动到主题上时如何知道它们所谈论的信息相同的。
如果想知道 rqt _ graph 中所有这些主题的位置,您可以取消选中 Hide 下面的所有框
需要看某个主题的发布 数据:
ros2 topic echo <topic_name>
起初,这个命令不会返回任何数据,这是因为它在等待/teleop _ turtle 节点发布一些内容。
在rqt_graph中取消Debug框
/_ ros2cli _ 26646是我们刚才运行的 echo 创建的节点(数字可能不同)。现在可以看到发布者(/teleop_turtle)正在往/turtle1/cmd _ vel 主题上发布数据,并且同时有两个订阅者(/_ ros2cli _ 26646和/turtlesim)订阅了该主题。
查看topic的详细信息
ros2 topic info <topic_name>
这个命令可以看到topic的发布者和订阅者个数。
节点使用messages在topics上发送数据。发布服务器(publishers)和订阅服务器(subscribers)必须发送和接收相同类型的消息才能进行通信。
使用ros2 topic list -t
查看主题类型,知道每个主题使用的message类型(方括号中的就是该topic的message类型。
如cmd_evl
主题的类型是
geometry_msgs/msg/Twist
含义:在包geometry_msgs
中有一个名为Twist
的msg
.
可以在这个类型上运行ros2 interface show
来了解数据类型的详细信息,特别是message所期望的数据结构。
ros2 interface show geometry_msgs/msg/Twist
返回的消息类型为:
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
float64 x
float64 y
float64 z
Vector3 angular
float64 x
float64 y
float64 z
这表明turtlesim
节点期望的message数据类型为两个向量(linear
和angular
),每个向量有三个元素。这个数据结构与使用ros2 topic echo
命令查看topic发布的数据结构相同。
知道了message的数据结构后,可以使用下面的命令直接从命令行将数据发布道topic:
ros2 topic pub <topic_name> <msg_type> ''
‘ < args >’参数是您将传递给主题的实际数据,结构就是使用ros2 interface show
查看得到的数据结构。
==注意:==这个参数需要在YAML语法中输入(就是参数的输入数据格式为YAML数据格式):
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
可选参数--once
表示发布一条消息然后退出。
海龟(通常是它要模仿的真正的机器人)需要一个稳定的指令流来持续操作。所以,为了让乌龟继续前进,可以下面的指令:
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
取消了参数--once
然后添加了--rate 1
参数(表示:发布该message的频率为1 Hz,一直发一直发)
刷新rqt_graph后,可以看到topic /turtle1/cmd_vel
多了一个订阅者/_ros2cli_30358
(这个就是上面的指令产生的一个新的节点)
最后可以对pose
运行echo
并重新检查rat_graph
ros2 topic echo /turtle1/pose
注:打印topic /turtle1/pose
发布的message
,会产生一个新的节点来订阅/turtle1/psoe
主题
可以看到/turtlesim 节点也正在发布到 pose 主题,新的 echo 节点订阅了该主题。
使用下面的命令查看节点数据发布的速率:
ros2 topic hz <topic_name>
返回某个节点向该主题发布数据的速率。
使用 ros2 topic pub --rate 1
将 turtle1/cmd_vel
的发布速率设置为稳定的1Hz
。然后查看该topic的发布数据频率将看到一个反映该速率的平均值1Hz
。(查看设置了稳定发布速率的topic的发布message速率时,得到的是该topic的平均发送速率(设置的稳定发布速率))
当有许多节点在运行,需要退出ros。不要忘记在每个终端中输入 Ctrl + C 来停止它们。
services是ros图中的另外一种通信方式。services属于call-and-response模型(topics通信方式是publisher-subscriber模型)。
topics允许节点订阅数据流并获得持续更新,但services只有在客户机特定调用时才提供数据(你问我才答,不问我不答)。
启动两个 Turtlesim 节点/turtlesim
和/teleop _ turtle
。
使用ros2 service list
返回系统中当前活动的所有service列表(所有的service_name)。
service具有描述服务的请求和响应数据结构的类型。服务类型的定义与主题类型类似,只不过服务类型有两部分: 一部分用于请求,另一部分用于响应。
查找某个service的数据类型(数据类型名字),使用如下命令:
ros2 service type <service_name>
Empty
服务类型表示:服务调用在发出请求时不发送数据,在接收响应时不接收数据。
要同时查看所有活动服务以及它们的数据类型,可以在 list
命令后面添加--show-types
选项(缩写为-t
) :
ros2 service list -t
返回所有的服务已经他们的service的数据类型(在中括号中)。
要查找特定的类型的所有服务:
ros2 service find <type_name>
同topcis一样可以从命令行call 请求 service,但是同样需要知道输入参数的数据结构。
ros2 interface show <type_name>
会返回一个用---
上下分隔开的数据结构,上面是call
的数据结构,下面是response
的数据结构。对于Empty
类型的service,它不发送或接受任何数据,它的结构是空白的。
通过命令行请求(call)服务(跟topic的发布消息相似):
ros2 service call <service_name> <service_type> <arguments>
部分是可选的,例如Empty
类型的service是没有任何参数的:ros2 service call /clear std_srvs/srv/Empty
同理,
的输入格式也要符合YAML语法
如,请求/spawn
服务来产生一只新的乌龟。
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
请求的服务会立马更新
注:topic是一种单向通信模式,service是一种双向的通信模式。
参数是节点的配置值,可以将参数视为节点设置。节点可以将参数存储为正式、浮点数、布尔值、字符创和列表。在ros2中每个节点维护自己的参数。
打开turtlesim_node
和turtle_teleop_key
两个节点。
要查看属于节点的参数列表,使用如下的命令:
ros2 param list
该命令返回当前运行的每个节点的参数。
(base) t@Tpc:~$ ros2 param list
/teleop_turtle:
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
scale_angular
scale_linear
use_sim_time
/turtlesim:
background_b
background_g
background_r
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
use_sim_time
可以看到每个节点都有use_sim_time
参数,这个参数不是turtlesim的唯一参数。
基于参数的名字,可以得知/turtlesim
节点使用BGR颜色值来决定Turtlesim窗口的背景颜色。
要显示参数的类型和当前值,使用下列命令:
ros2 param get <node_name> <parameter_name>
在运行时更改节点参数的值:
ros2 param set <node_name> <parameter_name> <value>
Set parameter successful
set
命令设置节点参数只会在当前会话中更改它们,而不是永久设置。但是可以保存设置,并在下次启动节点时重新加载它们。可以使用以下命令查看节点的所有当前参数值:
ros2 param dump <node_name>
该命令默然打印道标准输出(stdout),也可以将参数值重定向到一个文件中,以便保存。要将 节点 参数的当前值保存道.yaml
文件中:
ros2 param dump <node_name> > <name.yaml>
若想用相同的参数来重新加载节点,转储参数非常方便。
可以使用以下命令将参数从文件加载到当前运行的节点:
ros2 param load <node_name> <parameter_file>
qos_overrides
的警告。使用保存的参数在启动节点时加载参数:
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
停止正在运行的节点,这样可以尝试使用保存的参数重新加载它.
这样可以更改只读参数。
/turtlesim
和/teleop_turtle
节点。在启动teleop_turtle
节点时,终端会出现以下信息:
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
关注第二行,它对应于一个动作。(第一条指令对应于“ cmd _ vel”主题,在前面的主题教程中已经讨论过。)
注意字母键 G | B | V | C | D | E | R | T 在美国 QWERTY 键盘的 F 键周围形成一个“盒子”。每个按键在 F 周围的位置,都对应着海龟的方向。例如,E 会将海龟的方向旋转到左上角。(控制乌龟的朝向) F 键会在执行过程中取消一个目标(旋转)(在/tuetlesim_node窗口返回一个结果和反馈。
.... gole canceled
....goal comleted successfully
).... goal received before a previous goal finished. previous goal
会终止未完成的目标,转而去执行新给出的目标。使用ros2 node info
查看节点的actions.
返回这个节点的Publishers, Service Servers, Service Clients, Action Servers, Action Clients
的所有信息。
注意,/turtlesim的/turtle1/rotle1 _ Absolalaction 位于 Action Servers 之下。这意味着/turtlesim 响应并为/turtle1/rotle1 action提供反馈。(server响应和反馈)
在 /telop _ turtle 节点的Action Clients 下面的有名称为/turtle1/rotle_ absolute,这意味着它为该action发送目标。(client发送goals)
查看当前运行的所有节点的action:
ros2 action list
返回当前ROS图中的action
action也有类型,类似与topic和service,查看当前运行的所有action 列表及每个action的类型:
ros2 action list -t
返回action以及它们的类型(在方括号中)
使用如下命令查看action
的详细信息:
ros2 action info <action_name>
ros2 action info /turtle1/rotate_absolute
返回:
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
会返回该action
的action clients
数量以及名称,和action servers
的数量和名称。
从命令行或文件发送或执行action目标之前,还需要action类型的数据结构。
ros2 interface show <type_name>
运行下边的命令:
ros2 interface show turtlesim/action/RotateAbsolute
返回该action的数据类型格式:
# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
使用以下语法从命令行发送一个action目标:
ros2 action send_goal <action_name> <action_type> <value>
需要采用YAML格式,跟service和topic很相似
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
乌龟会旋转
Waiting for an action server to become available...
Sending goal:
theta: 1.57
Goal accepted with ID: 64fc8c8b4798454c96ef3c98f9d033fc
Result:
delta: 0.0
Goal finished with status: SUCCEEDED
所有的goals都有一个唯一的ID。上边的delta表示相对于其实位置的偏移(增量)
要查看此目标的反馈,要向ros2 action send_goal
命令后添加--feedback
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
在机器人导航中使用的就是actions
机器人系统很可能使用操作来导航。一个动作目标可以告诉机器人前进到一个位置。当机器人导航到目的地时,它可以一路发送更新(即反馈) ,然后在到达目的地后发送最终结果消息。
rqt_console
to view logsrqt_console
是一个用于检查日志消息的工具。rqt_console
是一个 GUI 工具,用于在 ROS2中查看日志消息。通常,日志消息显示在终端中。使用 rqt_console
,可以随着时间的推移收集这些消息,以更有组织的方式仔细地查看它们,过滤它们,保存它们,甚至重新加载保存的文件,以便在不同的时间进行查阅。启动rqt_console
和turtlesim
两个节点
ros2 run rqt_console rqt_console
Fatal # 最严重
Error
Warn
Info
Debug # 最轻微
Fatal
:致命的信息表明系统将终止以保护自己免受损害。Error
:错误消息指示不一定会损害系统的重大问题,但会阻碍系统正常运行。Warn
:警告消息表示意外活动或非理想结果,这些活动或非理想结果可能代表更深层次的问题,但不会彻底损害功能。Info
:信息消息指示事件和状态更新,用于直观验证系统是否按预期运行。Debug
:调试消息详细描述了系统执行的整个逐步过程。Info
,只会看到默认严重级别或更严重级别的log信息日志是某个节点的日志 设置log等级设置的是某个节点的log等级
可以在第一次使用Remapping运行/turtlesim
节点时设置默认的日志记录器级别。在终端机中输入以下命令:
ros2 run turtlesim turtlesim_node --ros-args --log-level WARN
ros2 run <package_name> <executable_name> --ros-args --log-level <log_level>
ros2 launch
命令运行一个launch file
文件将立即启动整个系统–所有节点及其配置。ros2 launch turtlesim multisim.launch.py
ros2 launch <package_name> <launch_file>
该命令将会运行以下启动文件:
# turtlesim/launch/multisim.launch.py
from launch import LaunchDescription
import launch_ros.actions
def generate_launch_description():
return LaunchDescription([
launch_ros.actions.Node(
namespace= "turtlesim1", package='turtlesim', executable='turtlesim_node', output='screen'),
launch_ros.actions.Node(
namespace= "turtlesim2", package='turtlesim', executable='turtlesim_node', output='screen'),
])
上面的启动文件是用 Python 编写的,但是也可以使用 XML 和 YAML 来创建启动文件。可以在ROS2 Launch Files 中看到使用 Python、 XML 和 YAML 的 ROS2启动格式的不同点。
上边那个命令将会运行两个turtlesim节点
可以像控制其他ROS2节点一样控制有lauch file启动的节点。例如,可以通过打开另外两个终端并运行以下命令,让海龟朝相反的方向行驶:
第二个终端:
ros2 topic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
第三个终端:
ros2 topic pub /turtlesim2/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"
For more tutorials on ROS 2 launch files, see the main launch file tutorial page.
ros2 bag
是一个命令行工具,用于记录系统中发布的topics数据。它累积了在任意数量的topics上传递的数据并将其保存在数据库中。然后,可以replay数据以重现测试和实验的结果。记录topic也是一个很好的方式来分享工作,并允许其他人重新创建它。
安装ros2 bag
sudo apt-get install ros-humble-ros2bag \
ros-humble-rosbag2-storage-default-plugins
将在turtlesim
系统中记录键盘输入,以便稍后进行保存和重播,首先启动turtlesim
和teleop_turtle
节点。
创建一个新的目录来存储需要保存的记录:
mkdir bag_files
cd bag_files
ros2 bag
只能从发布的 topic上记录数据。若想要查看系统topics 列表,使用下面的命令:
ros2 topic list
返回
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
在主题教程中,了解到/turtle_teleop
节点在/turtle1/cmd_vel
主题上发布命令,以使海龟在 Turtlesim 中移动。
要查看/turtle1/cmd_vel1
话题正在发布的数据,使用下面的命令:
ros2 topic echo /turtle1/cmd_vel
要记录发布到topic
的数据,使用下面的命令语法:
ros2 bag record <topic_name>
在要选择要记录的主题上运行上面的这个命令之前,打开一个新的终端并移动到之前创建的bag_files
目录,因为rosbag
文件将保存在运行它的目录中。
ros2 bag record /turtle1/cmd_vel
然后在终端中出现这些信息:
[INFO] [1659535570.441830742] [rosbag2_recorder]: Press SPACE for pausing/resuming
[INFO] [1659535570.442882095] [rosbag2_storage]: Opened database 'rosbag2_2022_08_03-22_06_10/rosbag2_2022_08_03-22_06_10_0.db3' for READ_WRITE.
[INFO] [1659535570.442943327] [rosbag2_recorder]: Listening for topics...
[WARN] [1659535570.443076627] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
[WARN] [1659535570.443093818] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
[INFO] [1659535570.443834654] [rosbag2_recorder]: Subscribed to topic '/turtle1/cmd_vel'
[WARN] [1659535570.444006076] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
[WARN] [1659535570.444032466] [ROSBAG2_TRANSPORT]: Hidden topics are not recorded. Enable them with --include-hidden-topics
[INFO] [1659535570.444048982] [rosbag2_recorder]: All requested topics are subscribed. Stopping discovery...
现在ros2 bag
正在记录在/turtle1/cmd_vel
主题上发布的数据。
按Ctrl + c
停止录制
数据将累积在一个bag文件中,该包文件的名称为:rosbag2_years_mouth_day_hours_minutes_second
可以同时记录多个主题,以及更改ros2 bag
文件的名字。
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
记录/turtle1/cmd_vel
主题和/turtle1/pose
主题,记录的文件名为subset
这个-o
选项可以为我们的bag文件选择一个唯一的名称,subset
是上面的命令更改后的文件名,
要一次记录多个topic,只需使用空格分隔每个topic即可。
然后移动乌龟,完成后按下Ctrl + c
可以向命令添加另一个选项,
-a
, 该选项记录系统上的所有主题。
可以运行以下命令查看有关recording的的详细信息:
ros2 bag info <bag_file_name>
查看subset
包,以及返回的结果:
(base) t@Tpc:~/learn/ros2/ros_learn/BLI/bag_files$ ros2 bag info subset/
Files: subset_0.db3
Bag size: 257.4 KiB
Storage id: sqlite3
Duration: 62.831s
Start: Aug 3 2022 22:37:50.325 (1659537470.325)
End: Aug 3 2022 22:38:53.157 (1659537533.157)
Messages: 3967
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 39 | Serialization Format: cdr
Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3928 | Serialization Format: cdr
要查看各个消息,必须打开数据可来检查它。(不明白)
在重播bag文件之前,在teleop终端正在运行的终端中输入Ctrl + c
. 然后确保turtlesim
窗口可见,以便可以看到bag文件真的动作。
ros2 bag play <bag_file_name>
输入命令:
ros2 bag play subset
终端会返回信息:
[INFO] [1659538446.802414765] [rosbag2_storage]: Opened database 'subset/subset_0.db3' for READ_ONLY.
[INFO] [1659538446.802492081] [rosbag2_player]: Set rate to 1
[INFO] [1659538446.805817265] [rosbag2_player]: Adding keyboard callbacks.
[INFO] [1659538446.805853441] [rosbag2_player]: Press SPACE for Pause/Resume
[INFO] [1659538446.805864392] [rosbag2_player]: Press CURSOR_RIGHT for Play Next Message
[INFO] [1659538446.805873202] [rosbag2_player]: Press CURSOR_UP for Increase Rate 10%
[INFO] [1659538446.805881393] [rosbag2_player]: Press CURSOR_DOWN for Decrease Rate 10%
[INFO] [1659538446.806084604] [rosbag2_storage]: Opened database 'subset/subset_0.db3' for READ_ONLY.
注:操作是记录的操作,但是由于起始小乌龟的方向不同,和位置不同,最终的结果整体相差了个旋转和平移。
因为subset
文件记录了/turtle1/pose
主题,所以 ros2 bag play
命令不会在运行了 turtlesim 的情况下退出,即使没有移动。**运行了ros2 bag play subset
**的终端自动退出。
这是因为只要/turtlesim
节点处于活动状态,它就会定期发布关于turtle1/pose
主题的数据。在上面的 ros2 bag info
示例结果中,/turtle1/cmd _ vel
主题的 Count
信息仅为39; 这是我们在记录时按下箭头键的次数。
注意,/turtle1/pose
的 Count
值超过3928; 当我们记录时,关于该主题的数据发布了3928次。
要了解 topic 位置数据发布的频率,可以运行以下命令:
ros2 topic hz /turtle1/pose
[1] https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools.html#