Skip to main content

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

info

注意:对于节点同名,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最下方的入口点。

详细内容参可以参考现成的仓库:

info

拉取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