前言
学习ROS2的路,并不能通过学习ROS1代替,因为ROS2的“内核”不同于ROS1,必须认认真真从头开始重新学习。
Ubuntu版本:20.04
ROS版本:Foxy
学习笔记回顾
- ROS2学习笔记(一)获取文档
- ubuntu20.04 安装ROS2和ROS1共存
- ROS2学习笔记(二)从turtlesim学习ROS2节点
- ROS2学习笔记(三)从turtlesim学习ROS2主题
- ROS2学习笔记(四)从turtlesim学习ROS2服务
- ROS2学习笔记(五)从turtlesim学习ROS2参数
- ROS2学习笔记(六)从turtlesim学习ROS2动作
- ROS2学习笔记(七)从turtlesim学习ROS2的工具
- ROS2学习笔记(八)从turtlesim学习ROS2的启动文件
- ROS2学习笔记(九)从turtlesim学习ROS2的bag录制
1.ROS2工作空间
ROS2工作空间就是我们在做开发的项目空间,所有功能包的源码、配置和编译都在工作空间下完成。
我们可能会同时开发多个项目,那就需要我们创建多个工作空间,所以工作空间也是存在优先级问题的,比如在不同的工作空间中创建相同名称的功能包,这时ROS2就需要根据优先级选择该启动的功能包。ROS默认是启动上层的工作空间(overlay),上层工作空间中的功能包会覆盖(override)下层的工作空间(underlay)中同名的功能包。
2.配置ROS2环境
在根目录下的.bashrc
文件中加入下面的命令:
$ source /opt/ros/foxy/setup.bash
3.创建新的目录
创建新的目录能有效的区分工作空间,文件夹名称可以自由定义,我们可以创建为dev_ws
:
$ mkdir -p ~/dev_ws/src
$ cd ~/dev_ws/src
src
文件夹就是用来存放功能包的位置。
4.下载例程代码
首先确保终端已经进入了dev_ws/src
文件夹下。使用如下命令下载例程代码:
$ git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
执行完成后,此时的ros_tutorials
已经克隆到我们的工作空间中,可以在dev_ws/src
文件夹下看到ros_tutorials
功能包。功能包内一共有四个文件夹,分别为:
roscpp_tutorials rospy_tutorials ros_tutorials turtlesim
5.编译工作空间
下载colcon
编译器:
$ sudo apt install python3-colcon-common-extensions
接下来就可以编译代码了,需要先移步至dev_ws
工作空间根目录下:
$ cd ~/dev_ws/
$ colcon build
----
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]
构建完成后可以在/dev_ws
根目录下看到四个文件夹:
build install log src
其中install
文件夹是未来运行所有节点启动文件和脚本的位置。
colcon是ROS2的编译工具,相当于ROS1的catkin一样。
colcon build 后面还可以加上一些参数:
- –packages-up-to :编译指定的功能包,而不是整个工作空间
- –symlink-install :节省每次重建python脚本的时间
- –event-handlers console_direct+ :在终端中显示编译过程中的详细日志
6.设置dev_ws的环境变量
$ cd ~/dev_ws
$ . install/local_setup.sh
install
文件夹中有两个很相似的文件:
local_setup.sh
仅会设置当前工作空间中功能包的相关环境变量setup.sh
会设置该工作空间以及其他底层工作空间的环境变量
运行功能包:
$ ros2 run turtlesim turtlesim_node
此时我们怎么知道我们是运行的dev_ws
下的功能包还是默认路径下的功能包呢。通过修改代码方便我们查看。
7.修改dev_ws下的功能包代码
找到~/dev_ws/src/ros_tutorials/turtlesim/src/turtle_frame.cpp
文件并且找到52行中的代码,修改成如下代码:
setWindowTitle("MyTurtleSim");
修改之后在dev_ws
目录下重新编译,并且重新运行,模拟器的名称已经改为MyTurtleSim
:
可见,当前运行的就是dev_ws
工作空间下的功能包,如果我们重新打开一个终端,不source dev_ws的环境变量,重新运行功能包,效果就不一样了:
$ ros2 run turtlesim turtlesim_node
具体运行哪里的功能包,取决于我们的环境变量如何设置。
总结
大家需要熟悉工作空间的创建和编译,同时要理解工作空间层次的概念(主要是环境变量的作用)。
Reference:
https://docs.ros.org/en/foxy/Tutorials/Workspace/Creating-A-Workspace.html
结语
本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接