目录
- 前言
- 1 配置环境
- 2 介绍turtlesim和rqt
- 3 了解ROS 2节点(node)
- 4 了解ROS 2主题(topics)
- 5 了解ROS 2服务 (service)
- 6 了解ROS 2参数 (parameters)
- 7 了解ROS 2动作(action)
- 8 使用rqt_console
- 9 创建启动文件(launch)
- 10 记录和播放数据
- 11 专栏地址
前言
学习ros2 和ros1 很像,从入门教程开始,包括命令行工具和客户端库,本篇先讲命令行工具,下一篇客户端库
参考官方文档https://index.ros.org/doc/ros2/Tutorials/
这篇文章很长,可以通过专栏查看 https://blog.csdn.net/weixin_36628778/category_9849744.html
或者通过下面的传送门过去
- 配置环境
- 介绍turtlesim和rqt
- 了解ROS 2节点(node)
- 了解ROS 2主题(topics)
- 了解ROS 2服务 (service)
- 了解ROS 2参数 (parameters)
- 了解ROS 2动作(action)
- 使用rqt_console
- 创建启动文件(launch)
- 记录和播放数据
1 配置环境
① 背景
ROS 2依赖于使用shell环境组合工作空间的概念。“工作区”是一个ROS术语,表示您在系统中使用ROS 2开发的位置。核心ROS 2工作区称为底层。后续的本地工作区称为覆盖。在使用ROS 2开发时,通常会同时激活多个工作区。
工作去通过setup.bash 进行设置和切换,跟ros1 一样的操作 只是自己的工作空间路径变了,不是devel变成install了
② 前提
确保已经安装了ros2,如果没有参考我的博客:https://blog.csdn.net/weixin_36628778/article/details/105170234
③ 任务
Ⅰsource setup 文件
可以每次使用的时候source setup.bash
source /opt/ros/<distro>/setup.bash
比如现在用的ROS2 是dashing
source /opt/ros/dashing/setup.bash
Ⅱ 在shell启动文件中加命令
如果嫌上面每次开一个终端,都要输入命令比较麻烦的话,可以吧上面的命令加到启动脚本里,shell 的是.bashrc
,zsh 是.zshrc
echo "source /opt/ros/<distro>/setup.bash" >> ~/.bashrc
我们需要设置
- bash
echo "source /opt/ros/dashing/setup.bash" >> ~/.bashrc
- zsh
echo "source /opt/ros/dashing/setup.zsh" >> ~/.zshrc
Ⅲ 检测环境变量
跟ROS1 的操作一样的
printenv | grep ROS
这个样子
Ⅳ ROS_DOMAIN_ID
变量
这个是多机通讯的变量,相当于交换机的vlanid ,当你局域网想区分出多个ROS集群的时候,每个ROS2集群之间不想相互干扰,需要设置这个ID 选择一个整数
对于eProsima Fast RTPS上的默认RMW,从ROS 2 Eloquent开始,此整数必须介于0-232之间,才能成功启动ROS 2守护守护进程。
如果通讯不了的话,可以通过这个网站来排查:https://index.ros.org/doc/ros2/Troubleshooting/
命令:
export ROS_DOMAIN_ID=<your_domain_id>
或者添加到启动脚本
echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bashrc
④ 总结
使用之前必须要配置使用的环境,两种方式,一是每次打开shell,搞一次,二是把命令写道启动文件中.bashrc
中,墙裂推荐第二种
2 介绍turtlesim和rqt
① 背景
Turtlesim (小乌龟是第一步)就像是 hello world
一样
rqt 是命令行的GUI工具,可以点点点的
② 前提
- 安装了ROS2
- 配置好了环境
- dshing 之后的版本才有小乌龟
③ 任务
Ⅰ turtlesim
安装turtlesim
命令:
sudo apt update
sudo apt install ros-dashing-turtlesim
检查下
ros2 pkg executables turtlesim
这样就对了
启动turtlesim
命令:
ros2 run turtlesim turtlesim_node
启动了节点==/turtlesim==
通过键盘控制小乌龟
重新开个终端,启动键盘控制节点:
ros2 run turtlesim turtle_teleop_key
控制
这个小乌龟有心跳监测,你释放键盘一会之后就会停
Ⅱ rqt
安装rqt
sudo apt update
sudo apt install ros-dashing-rqt-*
使用rqt
命令:
rqt
这个空白的
点击 Plugins > Services > Service Caller
设置/spawm
可以增加乌龟通过rqt,添加重复的会报错
修改路径画笔的颜色
通过server /turtle1/set_pen
重定向
可以把topic 重定向到另一个topic上去
命令:
ros2 run turtlesim turtle_teleop_key turtle1/cmd_vel:=turtle2/cmd_vel
④ 总结
小乌龟和rqt是必须要了解的
3 了解ROS 2节点(node)
① 背景
- ROS graph是由ROS 2元素同时处理数据的网络。 如果要全部映射可执行文件并将其可视化,则它包含所有可执行文件及其之间的连接。,后面会有可视化的图帮助理解
- ROS中的每个节点都应负责单个模块,(例如,一个节点用于控制轮式电机,一个节点用于控制激光测距仪等)。 每个节点都可以通过主题,服务,操作或参数向其他节点发送和接收数据。 完整的机器人系统由许多协同工作的节点组成。 在ROS 2中,单个可执行文件(C ++程序,Python程序等)可以包含一个或多个节点。
② 前提
- 装ros2
- 配置环境
- 装小乌龟
③ 任务
Ⅰros2 run
ros2 run
可以启动一个已知环境的包里的可执行文件
命令:
ros2 run <package_name> <executable_name>
例如:
启动小乌龟
ros2 run turtlesim turtlesim_node
如果你知道文件在哪,也可以这么操作,一般不推荐
Ⅱ ros2 node list
展示当前所有的node
Ⅲ ros2 node info
显示这个node 的详细信息
Ⅳ 重新映射节点
通过重新映射,您可以将默认的节点属性(例如节点名称,主题名称,服务名称等)重新分配给自定义值。在上一个教程中,您使用了重新映射turtle_teleop_key来更改要控制的默认乌龟。
命令:
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
他们只是node 不一样,但是订阅的topic 是一样的,我们可以同时控制他们
节点之间的可是化关系
④ 总结
通过小乌龟,学习节点真开心
4 了解ROS 2主题(topics)
① 背景
ROS 2将复杂的系统分解为许多模块化 节点(node)。 主题(topic)是ROS图的重要元素,它充当节点(node)交换消息的总线。 节点(node)可以将数据发布到任意数量的主题(topic),并同时具有对任意数量的主题(topic)的订阅。 主题(topic)是数据在节点(node)之间以及因此在系统的不同部分之间移动的重要方式之一。
说面了就是通过topic来通讯,通过node 来发现互相
② 前提
- 装ros2
- 配置环境
- 装小乌龟
③ 任务
Ⅰ 准备
启动小乌龟
命令:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
Ⅱ rqt_graph
这个是个可是化的工具,命令:
rqt_graph
不像ros1 还要rosrun
这个是个自检工具
Ⅲ ros2 topic 命令
ros2 topic list
ros2 topic list
列出所有topic
ros2 topic list -t
列出topic 顺便带上了消息类型,这个好
下面是帮助文档,
usage: ros2 topic list [-h] [--spin-time SPIN_TIME] [-t] [-c]
[--include-hidden-topics]
Output a list of available topics
optional arguments:
-h, --help show this help message and exit
--spin-time SPIN_TIME
Spin time in seconds to wait for discovery (only
applies when not using an already running daemon)
-t, --show-types Additionally show the topic type
-c, --count-topics Only display the number of topics discovered
--include-hidden-topics
Consider hidden topics as well
发现两个隐藏的,rqt_graph 去掉hide的勾选也能看到
ros2 topic echo
可以查看对应topic上 publish 的数据
命令:
ros2 topic echo <topic_name>
小乌龟的例子:
ros2 topic echo /turtle1/cmd_vel
这样会直观点
ros2 topic info
看topic的详细信息,命令:ros2 topic info /turtle1/cmd_vel
ros2 msg show (下个版本 ros2 interface show)
用 ros2 topic list -t
看到了cmd_vel
的消息类型 是 geometry_msgs/msg/Twis
t这个
-
我们可以用 ros2 msg show geometry_msgs/msg/Twist
-
也可以通过
ros2 topic echo /turtle1/cmd_vel
来看
-
可以通过rqt来看
-
也可以去官网查http://docs.ros.org/api/geometry_msgs/html/msg/Twist.html
-
ide 配置好之后可以跳到头文件去看也行
-
去msg文件看也行
方法有点多
ros2 topic pub
可以通过命令行去发送消息
ros2 topic pub <topic_name> <msg_type> '<args>'
我们通过命令下发去控制小乌龟
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}}'
选项 --rate 1
或者不加 是以1HZ的速度publish,--once
是只发一次
ros2 topic hz
实时统计topic的消息频率
ros2 topic hz topic_name
④ 总结
这个和ros1 区别不大
5 了解ROS 2服务 (service)
① 背景
service
也是通讯的一种方式,req/respone
的方式,是触发式的,topic
是订阅式的
② 前提
- 装ros2
- 配置环境
- 装小乌龟
③ 任务
Ⅰ准备
启动小乌龟
命令:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
Ⅱ ros2 service 命令
ros2 service list
列出服务
命令提示
usage: ros2 service list [-h] [--spin-time SPIN_TIME] [-t] [-c]
Output a list of available services
optional arguments:
-h, --help show this help message and exit
--spin-time SPIN_TIME
Spin time in seconds to wait for discovery (only
applies when not using an already running daemon)
-t, --show-types Additionally show the service type
-c, --count-services Only display the number of services discovered
可以通过命令和rqt去看
ros2 srv show (下个版本是 ros2 service type)
就是看看srv的消息的几种方法,
- 执行命令行
ros2 srv show turtlesim/srv/SetPen
- rqt 查看
- 文件查看
ros2 service find (dashing 不支持 )
根据类型找服务
ros2 service find <type_name>
例如
ros2 service find std_srvs/srv/Empty
返回
/clear
/reset
ros2 service call
调用服务,命令行模式
ros2 service call <service_name> <service_type> <arguments>
我们调用/clear 和 /spawn
ros2 service call /clear std_srvs/srv/Empty
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: 'bigggg'}"
④ 总结
如果是不是连续的通讯,可以使用service
和action
更好一点
6 了解ROS 2参数 (parameters)
① 背景
参数 (parameters) 就是每个节点的配置值,配置文件格式是yaml,可以是integers, floats, booleans, strings and lists
,每个节点(node)都维护自己的参数(parameters)。所有参数(parameters)都是可动态重新配置的,并且是基于ROS 2服务(services)构建的。
② 前提
- 装ros2
- 配置环境
- 装小乌龟
③ 任务
Ⅰ准备
启动小乌龟
命令:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
Ⅱ ros2 param 命令
ros2 param list
显示参数列表
usage: ros2 param list [-h] [--spin-time SPIN_TIME] [--include-hidden-nodes]
[--param-prefixes PARAM_PREFIXES [PARAM_PREFIXES ...]]
[node_name]
Output a list of available parameters
positional arguments:
node_name Name of the ROS node
optional arguments:
-h, --help show this help message and exit
--spin-time SPIN_TIME
Spin time in seconds to wait for discovery (only
applies when not using an already running daemon)
--include-hidden-nodes
Consider hidden nodes as well
--param-prefixes PARAM_PREFIXES [PARAM_PREFIXES ...]
Only list parameters with the provided prefixes
命令
ros2 param list
ros2 param get
获取指定参数的值
命令:ros2 param get <node_name> <parameter_name>
例子:ros2 param get /turtlesim background_g
ros2 param set
设置指定参数的值
命令:ros2 param set <node_name> <parameter_name> <value>
例子:ros2 param set /turtlesim background_r 150
出bug了,设置颜色没变,值是变了的
ros2 param dump (dashing 没有这个命令)
命令
ros2 param dump <node_name>
保存当前/turtlesim 的配置,命令:
ros2 param dump /turtlesim
终端返回
Saving to: ./turtlesim.yaml
加载配置文件 (目前在dashing版本没成功过。。。)
命令:
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
例子:
ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
④ 总结
节点的参数可以get 和set ,其他的命令我换个版本再试试
7 了解ROS 2动作(action)
① 背景
动作是ROS 2中用于长时间运行任务的通信类型之一。它们由三部分组成:目标,结果和反馈。
动作基于主题和服务。它们的功能与服务相似,但动作是可抢占的(您可以在执行时将其取消)。与返回单个响应的服务相反,它们还提供稳定的反馈。
操作使用类似于发布者-订阅者模型(在主题教程中进行描述)的客户端-服务器模型。“动作客户端”节点将目标发送到“动作服务器”节点,该节点确认目标并返回反馈和结果流。
意思就是topic是没有反馈的,action是有反馈的长连接
② 前提
- 装ros2
- 配置环境
- 装小乌龟
③ 任务
Ⅰ准备
启动小乌龟
命令:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
Ⅱ 使用actions
键盘控制节点这个地方就是action,使用f键周围的来控制小乌龟到指定方向,F键取消作用
演示:
是通过这个action 发送的
actions 命令
ros2 action list
列出 action
ros2 action info
看详细信息
ros action show(ros2 interface show–eloquent 这个版本有)
详细信息
ros2 action send_goal
命令行发送action ros2 action send_goal <action_name> <action_type> <values>
例子:
- 没有feedback
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {'theta: 1.57'}
- 有 feedbaxk
④ 总结
动作就像服务,可让您执行长时间运行的任务,提供定期反馈并可以取消。
机器人系统可能会使用动作进行导航。一个行动目标可以告诉机器人去某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),一旦到达目的地,便发送最终结果消息。
Turtlesim有一个动作服务器,动作客户端可以将目标发送给旋转的乌龟。在本教程中,您对动作进行了自省/turtle1/rotate_absolute,以更好地了解什么是动作以及它们如何工作。
8 使用rqt_console
① 背景
rqt_console是用于检查ROS 2中的日志消息的GUI工具。通常,日志消息显示在终端中。使用rqt_console,您可以随着时间的推移收集这些消息,以更有条理的方式仔细查看它们,过滤它们,保存它们,甚至重新加载保存的文件以在不同的时间进行自我检查。
节点使用日志以各种方式输出有关事件和状态的消息。为了用户的利益,它们的内容通常是信息性的。日志消息的意图由节点的作者定义,尽管内容可以在运行时编写。
② 前提
- 装ros2
- 配置环境
- 装小乌龟
③ 任务
Ⅰ准备
启动 rqt_console
ros2 run rqt_console rqt_console
看看操作
Ⅱ 日志等级
主要有下面几种
Fatal
Error
Warn
Info
Debug
大概这么分把
- Fatal 消息指示系统将终止以尝试保护自身不受损害。
- Error 消息表示重大问题,不一定会损坏系统,但会阻止其正常运行。
- Warn 消息表示意外的活动或不理想的结果可能代表着更深层次的问题,但不会直接损害功能。
- Info 消息指示事件和状态更新,可作为视觉验证系统是否按预期运行。
- Debug 消息详细说明了系统执行的整个分步过程。
设置默认的logger 等级
ros2 run turtlesim turtlesim_node --ros-args --log-level WARN
④ 总结
rqt_console 一个看日志的gui工具
9 创建启动文件(launch)
① 背景
这个launch 是.py 文件,和ros1 差别很大
到目前为止,在教程中,您一直在为运行的每个新节点打开新终端。当您创建越来越多的节点同时运行的更复杂的系统时,打开终端并重新输入配置详细信息将变得乏味。
启动文件允许您同时启动和配置许多包含ROS 2节点的可执行文件。
使用ros2 launch
命令运行一个启动文件将立即启动整个系统-所有节点及其配置。
② 前提
- rqt_graph 和turtlesim 包
- 文本编辑器
- 环境
③ 任务
Ⅰ 准备
创建 文件夹
mkdir launch
创建 urtlesim_mimic_launch.py
启动文件
touch launch/turtlesim_mimic_launch.py
Ⅱ 写py文件
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
node_namespace='turtlesim1',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_executable='mimic',
node_name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
mimic的/input/pose主题已重新映射到/turtlesim1/turtle1/pose,主题也已映射/output/cmd_vel到/turtlesim2/turtle1/cmd_vel。这意味着mimic将订阅/turtlesim1/sim的姿势主题,并将其重新发布以供/turtlesim2/sim速度指令主题订阅。换句话说,turtlesim2将模仿turtlesim1的动作。
代码以后在讲
Ⅲ 启动
正常来说 通过找包里的 文件来启动,
ros2 launch <package_name> <launch_file_name>
我们也可以通过绝对路径启动
cd launch
ros2 launch turtlesim_mimic_launch.py
rqt_graph 看系统
和之前多终端启动的差别
④ 总结
启动文件简化了具有许多节点和特定配置详细信息的复杂系统的运行。您可以使用Python创建启动文件,然后使用命令运行它们。ros2 launch
10 记录和播放数据
① 背景
ros2 bag是用于记录系统中有关主题发布的数据的命令行工具。它累积在任何数量的主题上传递的数据,并将其保存在数据库中。然后,您可以重播数据以重现测试和实验的结果。录制主题也是共享您的作品并允许其他人重新创建作品的一种好方法。
② 前提
- 安装ros2 bag
sudo apt-get install ros-<distro>-ros2bag ros-<distro>-rosbag2*
- 环境
- 小乌龟
③ 任务
Ⅰ准备
运行 小乌龟
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
创建路径
mkdir bag_files
Ⅱ 选择一个topic
我们选择/turtle1/cmd_vel
Ⅲ ros2 bag 记录
命令:
ros2 bag record <topic_name>
多个主题
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
例子
cd cd bag_files
ros2 bag record /turtle1/cmd_vel
Ⅳ ros2 bag info
ros2 bag info <bag_file_name>
Ⅴ ros2 bag play
命令
ros2 bag play rosbag2_2020_04_02-19_19_47
④ 总结
bag 重要的很
11 专栏地址
有点长,可以去专栏 看分开的
https://blog.csdn.net/weixin_36628778/category_9849744.html