Contents

ROS2 核心概念

基本和ROS1是一样的

ROS2 核心概念

workspace

需要注意这个

- ws/
    - src/
    - install/
    - build/
    - log

src中的代码被编译,中间文件在build,生成的文件在install

开源的代码就是clone到src中,一般这些代码会有自己的依赖项,这些不同项目的代码就是一个个功能包package

有python包可以帮助安装依赖:rosdepc(鱼香开发的),注意这不是ros2内部命令而是python的,所以风格和ros2不一样

sudo apt install python3-rosdep2
sudo rosdepc init && rosdepc update
rosdepc install -i --from-path src --rosdistro humble -y # 自动搜索src下的安装包

依赖项dependency安装好后才开始编译

ros2引入了新的编译工具colcon,而ros1是catkin

sudo apt install python3-colcon-ros

然后在ws根目录执行编译

colcon build

如果报错:

ModuleNotFoundError: No module named 'em'

指的是python的empy包

pip install empy==3.3.2 #版本问题
python -m pip install lark-parser

还要将当前的工作空间告知系统,配置环境变量

$ source install/local_setup.sh # 仅在当前终端生效
$ echo " source ~/<ws>/install/local_setup.sh" >> ~/.bashrc # 所有终端均生效

package

除了从别处下载功能包之外,也还可以自己创建

$ cd src/ # 需要切到src,但是src也不是可以自定义名字,colcon是默认在这里找的
$ ros2 pkg create --build-type <build-type> <package_name>

因为ros2可以支持c++和python,因此要选择是哪种build-type,如果使用C++或者C,那这里就跟ament_cmake,如果使用Python,就跟ament_python

package.xml 描述该功能包,所以一个package应该是由这个文件来确定的,并不完全受到文件夹分布的影响

  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

这些就是它的依赖项

C++的还有一个CMakeList.txt,Python则没有(Python是解释语言)

Python对应的是setup.cfg setup.py文件

node

每个节点都是一个独立运行的可执行文件,是一个具体的任务进程

支持不同语言,不同平台,不同主机

名称要唯一

package文件夹中有源码,对于python版本,需要指明节点程序的入口,这是在setup.py文件中的

entry_points={
        'console_scripts': [
         'node_helloworld       = learning_node.node_helloworld:main',
         'node_helloworld_class = learning_node.node_helloworld_class:main',
         'node_object            = learning_node.node_object:main',
         'node_object_webcam     = learning_node.node_object_webcam:main',
        ],
    },

这实际是指明了该功能包下四个节点和它们对应的程序入口

colcon build会依照这个,会将源文件复制到install中的一个文件夹,再生成一些带有描述性质的可执行python代码

/ws
	install/
		<packageName>/
			lib/
				<packageName> # 生成代码
				<python> # 源码

每次修改代码就需要重新编译,否则就还是执行池子里的旧版

如果编程时用的相对路径,它还能正确找到吗?

topic

节点之间的通信,两种方式,一种是topic,一种是service

topic遵循发布/订阅模型,采用.msg的消息结构

发布/订阅模型

可以多对多通信,只是需要注意优先级

编程时的思路是:

  • 编程接口初始化
  • 创建节点并初始化
  • 创建发布者对象
  • 创建并填充话题消息
  • 发布话题消息
  • 销毁节点并关闭接口

一般都会有一个定时器对象,以及相应的callback函数,这样才能持续工作

service