ROS2学习笔记汇总目录-CSDN博客

一、使用RCLCPP编写节点

1.1 创建工作空间和功能包

cd d2lros2/chapt2/
mkdir -p chapt2_ws/src/

         创建example_cpp功能包,使用ament-cmake作为编译类型,并为其添加rclcpp依赖。

cd chapt2_ws/src
ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp

这条命令的含义和参数。

  • pkg create 是创建包的意思。
  • –build-type 用来指定该包的编译类型,一共有三个可选项ament_python、ament_cmake、cmake。
  • –dependencies 指的是这个功能包的依赖,这里小鱼给了一个ros2的C++客户端接口rclcpp。

 使用tree可以查看文件夹里所有文件

sudo apt install tree
tree

1.2 创建节点

(1) 在example_cpp/src下创建一个node_01.cpp文件:

cd example_cpp/src/
sudo nano node_01.cpp

(2) 编写代码:

#include "rclcpp/rclcpp.hpp"


int main(int argc, char **argv)
{
    /* 初始化rclcpp  */
    rclcpp::init(argc, argv);
    /*产生一个node_01的节点*/
    auto node = std::make_shared<rclcpp::Node>("node_01");
    // 打印一句自我介绍
    RCLCPP_INFO(node->get_logger(), "node_01节点已经启动.");
    /* 运行节点,并检测退出信号 Ctrl+C*/
    rclcpp::spin(node);
    /* 停止运行 */
    rclcpp::shutdown();
    return 0;
}

(3) 修改CmakeLists:

cd example_cpp
sudo nano CmakeLists.txt
node_01.cpp中输入上面的内容后,还需要修改一下CMakeLists.txt。将其添加为可执行文件,并使用install指令将其安装到install目录。

(4) 在CmakeLists.txt最后一行加入下面两行代码。

add_executable(node_01 src/node_01.cpp)
ament_target_dependencies(node_01 rclcpp)

(5) 在CmakeLists.txt最后一行加入下面代码。

add_executable(node_01 src/node_01.cpp)
ament_target_dependencies(node_01 rclcpp)

install(TARGETS
  node_01
  DESTINATION lib/${PROJECT_NAME}
)

(6) 编译运行节点:在chapt2_ws下依次输入下面的命令。

colcon build
source install/setup.bash
ros2 run example_cpp node_01

(7)测试:运行node_01节点,并查看。

ros2 node list

 学习:【ROS2机器人入门到实战】使用RCLCPP编写节点-CSDN博客

 二、使用RCLCPP编写节点

2.1 创建Python功能包

        创建一个名字叫叫做example_py的python版本的功能包。

cd chapt2/chapt2_ws/src/
ros2 pkg creat example_py --build-type ament_python --dependencies rclpy

         使用tree查看目录结构。

tree

2.2  编写程序

(1)编写ROS2节点的一般步骤:

1. 导入库文件
2. 初始化客户端库
3. 新建节点
4. spin循环节点
5. 关闭客户端库

(2)在example_py/example_py下创建node_02.py接着开始编写代码。

cd example_py/example_py
sudo nano node_02.py

         输入下面的代码,注释不用写。

import rclpy
from rclpy.node import Node

def main(args=None):
    """
    ros2运行该节点的入口函数
    编写ROS2节点的一般步骤
    1. 导入库文件
    2. 初始化客户端库
    3. 新建节点对象
    4. spin循环节点
    5. 关闭客户端库
    """
    rclpy.init(args=args) # 初始化rclpy
    node = Node("node_02")  # 新建一个节点
    node.get_logger().info("大家好,我是node_02.")
    rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
    rclpy.shutdown() # 关闭rclpy

(3)修改setup.py。

sudo nano setup.py
    entry_points={
        'console_scripts': [
            "node_02 = example_py.node_02:main"
        ],
    },
)

setup.py这段配置是声明一个ROS2的节点,声明后使用colcon build才能检测到,从而将其添加到install目录下。

2.3 编译运行节点

(1)编译节点:

cd chapt2/chapt2_ws/
colcon build
source install/setup.bash

(2)执行节点: 

ros2 run example_py node_02

(3)测试:新开窗口窗口节点。

ros2 node list

 学习:【ROS2机器人入门到实战】使用RCLPY编写节点_ros2 节点-CSDN博客

三、使用面向对象(OOP)方式编写ROS2节点

3.1 使用C++编写节点(OOP)方式

(1)在/chapt2/chapt2_ws/src/example_cpp/src下新建node_03.cpp:

cd chapt2/chapt2_ws/src/example_cpp/src
sudo nano node_03.cpp

        输入下面的代码。


#include "rclcpp/rclcpp.hpp"

/*
    创建一个类节点,名字叫做Node03,继承自Node.
*/
class Node03 : public rclcpp::Node
{

public:
    // 构造函数,有一个参数为节点名称
    Node03(std::string name) : Node(name)
    {
        // 打印一句
        RCLCPP_INFO(this->get_logger(), "大家好,我是%s.",name.c_str());
    }

private:
   
};

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    /*产生一个node_03的节点*/
    auto node = std::make_shared<Node03>("node_03");
    /* 运行节点,并检测退出信号*/
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

(2) 修改CMakeLists.txt,添加下方代码。

cd .. #返回上一级example_cpp/目录
sudo nano CMakeLists.txt
add_executable(node_03 src/node_03.cpp)
ament_target_dependencies(node_03 rclcpp)

install(TARGETS
  node_03
  DESTINATION lib/${PROJECT_NAME}
)

(3)编译及测试:

        返回上上级chapt2_ws/目录:

cd .. && cd .. 

        单独编译功能包example_cpp

colcon build --packages-select example_cpp
source install/setup.bash

        测试:

ros2 run example_cpp node_03

 3.2 使用Python编写节点(OOP)方式

(1)在/chapt2/chapt2_ws/src/example_py/example_py下新建node_04.py:

cd src/example_py/example_py/
sudo nano node_04.py

         输入下面的代码。

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node


class Node04(Node):
    """
    创建一个Node04节点,并在初始化时输出一个话
    """
    def __init__(self,name):
        super().__init__(name)
        self.get_logger().info("大家好,我是%s!" % name)


def main(args=None):
    rclpy.init(args=args) # 初始化rclpy
    node = Node04("node_04")  # 新建一个节点
    rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
    rclpy.shutdown() # 关闭rclpy

 (2)修改setup.py。

cd ..
sudo nano setup.py

        进行修改:

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

 注意格式和结尾的,符号,console_scripts是个数组。

(3)编译和测试

          返回上上级chapt2_ws/目录:

cd .. && cd .. 

         单独编译功能包example_cpp

colcon build --packages-select example_py
source install/setup.bash

         测试:

ros2 run example_py node_04

学习:【ROS2机器人入门到实战】使用面向对象方式编写ROS2节点_ros2面向对象编程-CSDN博客

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐