Ros2入门

1.Ros2节点是什么

ROS2中每一个节点也是只负责一个单独的模块化的功能(比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等)

2.节点之间如何交互?

上面举了一个激光雷达的例子,一个节点负责获取激光雷达的扫描数据,一个节点负责处理激光雷达数据,比如去除噪点。

那节点与节点之间就必须要通信了,那他们之间该如何通信呢?ROS2早已为你准备好了一共四种通信方式:

  • 话题-topics

  • 服务-services

  • 动作-Action

  • 参数-parameters

3. 如何启动一个节点?

使用指令:

ros2 run <package_name> <executable_name>

 

指令意义:启动 包下的 中的节点。

使用样例:

ros2 run turtlesim turtlesim_node

4. 通过命令行界面查看节点信息

4.1 ROS2命令行

ROS2CLI,就是和ROS2相关的命令行操作。什么是命令行界面呢?这里小鱼再讲解一个概念,CLICommand-Line Interface)和GUIGraphical User Interface

  • GUI(Graphical User Interface)就是平常我们说的图形用户界面,大家用的Windows是就是可视化的,我们可以通过鼠标点击按钮等图形化交互完成任务。

  • CLI(Command-Line Interface)就是命令行界面了,我们所用的终端,黑框框就是命令行界面,没有图形化。

很久之前电脑还是没有图形化界面的,所有的交互都是通过命令行实现,就学习机器人而言,命令行操作相对于图形化优势更加明显。

ROS2为我们提供了一系列指令,通过这些指令,可以实现对ROS2相关模块信息的获取设置等操作。

4.2 节点相关的CLI

运行节点(常用)

ros2 run <package_name> <executable_name>

查看节点列表(常用)

ros2 node list

查看节点信息(常用)

ros2 node info <node_name>

重映射节点名称

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

运行节点时设置参数

ros2 run example_parameters_rclcpp parameters_basic --ros-args -p rcl_log_level:=10
2.ROS2工作空间

运行一个节点的时候使用的是

ros2 run 包名字 可执行文件名字

那你有没有想过,我们想找到一个节点(可执行文件),就必须要先知道它在哪个包,那问题就来了,想要找到某个包,该去哪里找?

答案就是:工作空间

 工作空间是包含若干个功能包的目录,一开始把工作空间理解成一个文件夹就行了。这个文件夹包含下有src。所以一般新建一个工作空间的操作就像下面一样

mkdir -p dev_ws/src

2.功能包是什么

功能包可以理解为存放节点的地方,ROS2功能包根据编译方式的不同分为三种类型。

  • ament_python,适用于python程序

  • cmake,适用于C++

  • ament_cmake,适用于C++程序,是cmake的增强版

 3.功能包获取的两种方式

3.1 安装获取

安装一般使用

sudo apt install ros-<version>-package_nameCopy to clipboardErrorCopied

安装获取会自动放置到系统目录,不用再次手动source

此处<version>的查看方式:

输入指令:

printenv ROS_DISTRO

3.2 手动编译获取

手动编译相对麻烦一些,需要下载源码然后进行编译生成相关文件。

(什么时候需要手动编译呢?一般我们能安装的功能包都是作者编译好程序将可执行文件上传到仓库中,然后我们才能够通过apt进行安装,如果作者还没来得及测试上传,或者忘记了测试上传,就会找不到对应的包,这时候就需要手动编译安装了。

另外一种就是我们需要对包的源码进行修改,这个时候也需要自己编译修改。)

手动编译之后,需要手动source工作空间的install目录。

 4.与功能包相关的指令 ros2 pkg

create         Create a new ROS2 package
executables     Output a list of package specific executables
list           Output a list of available packages
prefix         Output the prefix path of a package
xml                 Output the XML of the package manifest or a specific tag

1.  创建功能包

ros2 pkg create <package-name>  --build-type  {cmake,ament_cmake,ament_python}  --dependencies <依赖名字>

2. 列出可执行文件

列出所有

ros2 pkg executables

列出turtlesim功能包的所有可执行文件

ros2 pkg executables turtlesim

3. 列出所有的包

ros2 pkg list

4. 输出某个包所在路径的前缀

ros2 pkg prefix  <package-name>

比如小乌龟

ros2 pkg prefix turtlesim

5. 列出包的清单描述文件

每一个功能包都有一个标配的manifest.xml文件,用于记录这个包的名字,构建工具,编译信息,拥有者,干啥用的等信息。

通过这个信息,就可以自动为该功能包安装依赖,构建时确定编译顺序等

查看小乌龟模拟器功能包的信息。

ros2 pkg xml turtlesim

附部分命令

 关于查看节点的命令,列出节点,及查看节点详细信息。

ros2 node list

ros2 node info <节点名称>

 关于话题的命令:

ros2 topic list  #查看话题列表

ros2 topic echo# 查看话题内容

ros2 topic info# 查看话题详情

ros2 topic pub  #发布指令

ros2 topic hz   #查看话题发布周期

 ros2 service list  #查看服务列表

ros2 service info# 查看服务详情

ros2 service type# 查看服务的类型

ros2 service find   #查找特定类型的服务

ros2 service call  #通过终端发送服务请求

 ros2 action list  #查看动作列表

ros2 action info# 查看动作详情

ros2 action send_goal # 发送动作请求

 关于参数的指令:

ros2 param list  #查看参数列表

ros2 param info# 查看某节点的参数详情

ros2 param set# 参数设置

ros2 param get# 参数设置

ros2 param dump# 参数设置

 节点间关系没直观呈现,rqt_graph 图形化工具刚好可以弥补这一缺陷。

 终端命令行输入:可以启动图形化工具,直观显示节点、话题、参数关系。

rqt_graph

 Python语言提供了rclpy来操作ROS2的节点话题服务,而C++则使用rclcpp提供API操作ROS2的节点话题和服务等。

 当找不到头文件时

可手动添加路径(此次为两个路径找不到)

E.g.…… g++ first_ros2_node.cpp -I /opt/ros/foxy/include/rclcpp/ -I /opt/ros/foxy/include/rcl/

 参考:https://d2lros2foxy.fishros.com/#/humble/chapt2/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB