ROS2学习——动手写几个节点

ROS2 节点使用

学习小鱼的ros2教程的,原文链接如下

https://blog.youkuaiyun.com/qq_27865227/article/details/131363638

  学习过ros的应该都比较熟悉节点通信的方式。用节点进行通信的过程中,ros1会有一个master来管理所有的节点,所以我们都需要用roscore来启动一个master才能够正常的进行节点之间的通信。ros2则去掉了这个master,直接进行多节点之间的通信。

在这里插入图片描述

  和ros一样,ros2也有四种(或者说三种)通信的方式,最常用的topic,然后是service,以及和service很类似的action,最后是parameter。官方绘制了一个非常形象的图,这里我也放出来供我们理解。

在这里插入图片描述

  然后启动节点的方式和ros一样,不过命令发生了变化,现在的CLI(命令行界面)的命令基本都变成了ros2开头的,以下是一些例子

# 启动节点
ros2 run turtlesim turtlesim_node
# 查看节点列表
ros2 node list
# 重映射节点名称
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

  这里用ros2启动是使用到了功能包的概念,顺便也认识一下工作空间的概念。和ros1一样,工作空间中有很多的功能包,功能包根据编译方式的不同可以分为三种类型。以下是一些和功能包相关的命令

  • ament_python 适用于python程序
  • cmake 适用于c++程序
  • ament_cmake,适用于c++,是cmake的增强版本
# 创建功能包
ros2 pkg create xxx
# 列出功能包的可执行程序
ros2 pkg executables xxx
# 列出所有的功能包
ros2 pkg list

  ros2不再使用catkin_make来编译功能包了,而是使用colcon,接下来我们就好好学习以下colcon。首先colcon是功能包构建工具,简单来说就是用来编译代码的。需要先提前安装(一般安装ros2后自带有)

# 注意如果适用colcon build在编译中遇到Setuptools DeprecationWarning: setup.py install is deprecated.这个警告,可以通过更新setuptools解决。
sudo apt install python-colcon-common-extensions

  使用colcon build编译过后会得到以下文件:build install log以及源码本身src。

build 目录存储的是中间文件。对于每个包,将创建一个子文件夹,在其中调用例如CMake install 目录是每个软件包将安装到的位置。默认情况下,每个包都将安装到单独的子目录中。 log 目录包含有关每个colcon调用的各种日志信息。 其实大家可以也会注意到,那就是这不就是一个源码通过cmake安装的过程嘛!我们先用build进行cmake .. ,然后make执行编译,最后再通过make install将可执行文件安装到install中。这么看来build和log目录本质上其实没有太大的作用。接下来我们看一些常用的功能包编译命令。
# 编译指定功能包
colcon build --packages-select YOUR_PKG_NAME
# 不编译测试单元
colcon build --packages-select YOUR_PKG_NAME -DBUILD_TESTING=0
# 运行编译的包的测试
colcon test
# (重要)允许通过更改src下的部分文件来改变install,这样python文件就可以不用重新build了
colcon build --symlink-install 

编写自己的节点

  接下来我们就主要来看怎么编写自己的ros2节点了,首先介绍c++的,然后是python版本的。我们先通过build-type来创建功能包,可选ament_python,ament_cmake 和cmake

mkdir -p test_ws/src
cd test_ws/src
ros2 pkg create emample_cpp --build-type ament_cmake --dependencies rclcpp
└── src
    └── example_cpp
        ├── CMakeLists.txt
        ├── include
        │   └── example_cpp
        ├── package.xml
        └── src

  dependencies则是指定依赖项,接下来我们编写源码

#include "rclcpp/rclcpp.hpp"
int main(int argc, char **argv)
{
	rclcpp::init(argv, argv);
	auto node = std::make_shared<rclcpp::Node>("node_01");
	RCLCPP_INFO(node->get_logger(), "node_01 start success");
	rclcpp::spin(node);
	rclcpp::shutdown();
	return 0;

  节点完成之后,我们还需要去修改编译相关的功能

# add the bottom of CmakeListx.txt
add_executable(node01 src/node_01.cpp)
ament_target_dependencies(node01 rclcpp)
# install
install(TARGETS
	node01
	DESTINATION lib/${PROJECT_NAME}
	)

  python版本,我们也来创建一下

ros2 pkg create example_py --build-type ament_python --dependencies rclpy
.
├── example_py
│   └── __init__.py
├── package.xml
├── resource
│   └── example_py
├── setup.cfg
├── setup.py
└── test
    ├── test_copyright.py
    ├── test_flake8.py
    └── test_pep257.py

  在example_py 低下的example_py中创建pythono文件:

import rclpy
from rclpy.node import Node

def main(args=None)
	rclpy.init(args=args)
	node=Node("node_02")
	node.get_logger().info("hello, I'm node_02")
	rclpy.spin(node)
	rclpy.shutdown()

  python要修改的就不是cmake了,而是setup.py


  实际编译时,我们新建一个build目录来存储编译文件,然后使用cmake ..,代表到上级目录去寻找CMakeLists.txt,然后运行make,此时就能够在build目录发现相应的节点了

  理解了其作用后,我们深入学习一下CMakeLists.txt文件,然后简化一下这个文件的书写。像之前的一大片的命令,可以简化问这样的:

cmake_minimum_required(VERSION 3.22)
project(first_node)

find_package(rclcpp REQUIRED)
add_executable(first_node first_ros2_node.cpp)
target_link_libraries(first_node rclcpp::rclcpp)

  然后也是一样的cmake ..和make。那么为什么可以这样缩减指令呢?其实就是find_package的重要作用,find_package查找的环境变量主要包含以下部分:

	entry_points={
	'console_scripts': [
		"node_02 = example_py.node_02:main"
		],
	)

  主要就是要声明ros2的节点让colcon检测到。至此,我们就完成了节点的创建。当然,这个方式是创建节点最基础的方式,还有一些其他的方式,我们之后再来学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白云千载尽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值