ROS2 服务

ROS2 中的服务就类似于 RPC 调用,每个节点提供服务,其它节点可以调用服务并获取返回值

服务查看

  1. 查看节点提供的服务

    1
    
    ros2 node info /turtlesim
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    Service Servers:
       /clear: std_srvs/srv/Empty
       /kill: turtlesim/srv/Kill
       /reset: std_srvs/srv/Empty
       /spawn: turtlesim/srv/Spawn
       /turtle1/set_pen: turtlesim/srv/SetPen
       /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
       /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
       /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
       /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
       /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
       /turtlesim/get_type_description: type_description_interfaces/srv/GetTypeDescription
       /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
       /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
       /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  2. 服务和话题一样,包括服务名和服务参数定义,可以查看服务的详细定义

ROS2 话题

ROS2 中节点通过发布和订阅话题来传递信息,一个节点可以作为发布者发布信息,也可以同时作为订阅者订阅其它节点发布的话题。

话题由主题和消息类型组成:

  • 主题是一个字符串
  • 消息类型是传输数据的格式

话题查看

  1. 启动小海龟节点

ROS2 节点

ROS2 中的节点是一个通过 ROS2 和其它节点通信的实体。

Python 实现节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: utf-8 -*-

import rclpy
from rclpy.node import Node


def main():
    # 环境初始化
    rclpy.init()

    # 创建一个新节点
    node = Node("python_node")

    # 调度节点运行
    rclpy.spin(node)

    # 环境去初始化
    rclpy.shutdown()


if __name__ == '__main__':
    main()

C++ 实现节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include "rclcpp/node.hpp"
#include "rclcpp/executors.hpp"

int main(int argc, char* argv[]) {
    rclcpp::init(argc, argv);

    auto node = std::make_shared<rclcpp::Node>("cpp_node");

    RCLCPP_INFO(node->get_logger(), "Hello, C++ Node");

    rclcpp::spin(node);

    rclcpp::shutdown();

    return 0;
}

节点包管理

一个机器人程序一般会有很多节点,ROS2 使用功能包管理节点,功能包的优点:

WSL2 安装 ROS2

WSL2 使用的系统是 Ubuntu 24.04 ,所以安装的 ROS2 版本对应为 jazzy

UTF8 环境设置

1
2
3
sudo apt update && sudo apt install locales
sudo locale-gen zh_CN zh_CN.UTF-8
sudo update-locale LC_ALL=zh_CN.UTF-8 LANG=zh_CN.UTF-8

激活软件仓库

1
2
sudo apt install software-properties-common
sudo add-apt-repository universe

使用国内源

1
2
3
4
# 安装证书
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://mirrors.ustc.edu.cn/ros2/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/ros2.sources > /dev/null

安装 ROS2 开发工具

1
sudo apt update && sudo apt install ros-dev-tools

安装 ROS2

1
sudo apt update && sudo apt upgrade && sudo apt install ros-jazzy-desktop

运行例子

  1. 发布者
    1
    2
    
    source /opt/ros/jazzy/setup.bash
    ros2 run demo_nodes_cpp talker
    发布者打印的消息
    1
    2
    3
    
    [INFO] [1766678416.648218277] [talker]: Publishing: 'Hello World: 1'
    [INFO] [1766678417.642466793] [talker]: Publishing: 'Hello World: 2'
    [INFO] [1766678418.638927732] [talker]: Publishing: 'Hello World: 3'
  1. 订阅者
    1
    2
    
    source /opt/ros/jazzy/setup.bash
    ros2 run demo_nodes_py listener
    订阅者打印的日志
    1
    2
    3
    
    [INFO] [1766678417.643847384] [listener]: I heard: [Hello World: 1]
    [INFO] [1766678418.640908725] [listener]: I heard: [Hello World: 2]
    [INFO] [1766678419.637684973] [listener]: I heard: [Hello World: 3]

Windows Terminal 标签

添加一个新的 Windows Terminal 标签,方便快速打开 ROS2 环境,命令行如下:

SQL 基础

查询

查询步骤:

  1. 选择要查询的库 USE db
  2. 使用 SELECT 语句

基本语句:

  • SELECT 查询的列
  • FROM 查询的表
  • WHERE 筛选条件
  • ORDER BY 排序条件
1
2
USE sql_store;
SELECT customer_id, first_name FROM customers WHERE customer_id = 1 ORDER BY first_name;
customer_idfirst_name
1Babara

SELECT 子句

选择查询的列, * 表示查询所有列