1.3ROS基础操作
节点基操
节点是通信的基本单位,节点可以变成:发布者、订阅者、服务端、客户端、动作、参数。
创建节点
创建节点前可以先创建一个目录
mkdir -p ~/workspace/src
如何在ROS2中创建一个功能包呢?我们可以使用这个指令:
ros2 pkg create --build-type <build-type> <package_name>
ros2命令中:
- pkg:表示功能包相关的功能;
- create:表示创建功能包;
- build-type:表示新创建的功能包是C++还是Python的,如果使用C++或者C,那这里就跟ament_cmake,如果使用Python,就跟ament_python;
- package_name:新建功能包的名字。
# 创建Python功能包
ros2 pkg create --build-type ament_python learning_node
# 创建C++功能包
ros2 pkg create --build-type ament_cmake learning_node
只需执行其中一个命令即可,如果你会Python,就执行创建Python节点的命令。命令创建一个名为learning_node
文件夹。
这里我推荐大家创建节点名的时候,使用有辨识性的名字。例如:ros2 pkg create --build-type ament_python learning_node
。
注意:对于节点同名,ROS 2在编译时的处理方式不是使用第一个节点或最后一个节点,而是会报错。
编写代码
接着在learning_node
文件夹我们就可以准备编写代码了,此时你的路径应该是:
~/workspace
|_src
|_learning_node/
|_learning_node
|_ __init__.py
|_package.xml
|_setup.py
|_setup.cfg
|_test/
|_resource/
此时你就可以编写代码了,在__init__.py
同级下创建一个.py
文件。
符合文件命名规则前提下,你想叫什么都可以,但是最好有一定的含义。
如果你的功能是打印Hello World
,那么你就可以叫node_helloworld.py
。
python的函数通常是需要调用的,例如abc()
函数,你需要在代码中输入abc()
,才会调用这个函数。和C++有且仅有一个main
函数不同,那么如何确定哪个函数是入口?更进一步思考:不同的指令对应不同的函数。
因此有了setup.py
最下方的入口点定义。编写完成后记得修改setup.py
最下方的入口点。
详细内容参可以参考现成的仓库:
拉取git仓库,可免去自己从0开始手敲代码。如果你喜欢自己从0开始抄写代码,也可以跳过本部分。
git安装:sudo apt install git
拉取命令:git clone https://gitee.com/guyuehome/ros2_21_tutorials.git
这个命令会把仓库克隆到本地。执行后,你应该能在当前文件夹下看到名为ros2_21_tutorials
的文件夹,内含多个子文件夹。每个子文件夹对应一个功能包。因为ros2是模块化的,不同的功能被拆解为不同的功能包后期更好维护。
注意:如果你之前在src
里创建了一些Python节点之后,又把ros2_21_tutorials
文件夹也放置在src
里,那么你需要检查你的创建的节点名,是否与ros2_21_tutorials
内已有节点重名。
编译
# 安装colcon(此步全局仅在第一次执行时需要执行,如果失败会导致colcon build 命令不可用)
sudo apt install python3-colcon-ros
# 进入工作空间
cd ~/workspace
# 编译工作空间所有功能包
# 不论其是直接在src下,还是在src下的子文件夹下
colcon build
# 当你只有一个包更改,不希望全编译,仅编译learning_node
colcon build --packages-select learning_node
colcon build
命令会将所有功能包,编译成可执行文件。
编译成功后,就可以在工作空间中看到自动生产的build、log、install文件夹了。
- src,代码空间,未来编写的代码、脚本,都需要人为的放置到这里;
- build,编译空间,保存编译过程中产生的中间文件;
- install,安装空间,放置编译得到的可执行文件和脚本;
- log,日志空间,编译和运行过程中,保存各种警告、错误、信息等日志。
我们把编译后,含有build、log、install、src
文件夹的workspace
称为工作空间。
如果是Python这样无需编译的,会将代码直接拷贝到install
文件夹下。
编译过程可能出现的报错:
-
节点重名:对与节点同名,ros的处理方式不是使用第一个节点或最后一个节点,而是会报错。应该删除多余节点。确保你
src
文件夹下,所有的xml
文件中,节点的名称是唯一的。 -
语法错误:如果代码语法错误,则会编译失败,需要手动解决。
-
缺少依赖包:如果你严格跟随参考资料且为新系统,首先检查你是否安装过程网络异常。如果是曾用系统,检查是否含有多个python环境。
# 删除缓存
rm -rf build/ install/ log/
# 修改环境变量PATH的值,把系统默认的环境提到最前
export PATH="/usr/bin:$PATH"
# PYTHON_EXECUTABLE 是一个CMake变量,用于指定构建过程中应该使用哪个Python解释器
export PYTHON_EXECUTABLE=/usr/bin/python3 && colcon build --cmake-args -DPYTHON_EXECUTABLE=/usr/bin/python3
在不更换工作空间的情况下,以下命令仅在第一次执行时需要执行。如果你的工作空间路径不是~/workspace
,请将~/workspace
替换为你的工作空间路径。
# 立刻执行脚本
source ~/workspace/install/setup.sh
# 之后每次开启终端执行执 行脚本
echo "source ~/workspace/install/setup.sh" >> ~/.bashrc
运行
运行脚本 : ros2 run learning_node node_helloworld
查看正在运行的node : ros2 node list