ROS2 嵌入式开发 学习笔记(一)

ROS2学习笔记(一)

文章目录

  • ROS2学习笔记(一)
      • 基础学习路线
      • 一、工作空间
      • 二、功能包
      • 三、节点
        • 节点命令行常用操作
        • 案例一:Hello World节点(面向过程)
        • 案例二:Hello World节点(面向对象)
        • 案例三:物体识别节点
        • 案例四:机器视觉识别节点
      • 四、话题
        • 话题命令行的常用操作
        • 案例一:Hello World话题通信
        • 案例二:机器视觉识别
        • 案例三:机器视觉识别优化

链接直达:

鱼香 ROS http://d2lros2foxy.fishros.com/#/

创客制造 https://www.ncnynl.com/archives/201801/2250.html

古月居 www.guyuehome.com

基础学习路线

ROS2 嵌入式开发 学习笔记(一)_第1张图片

ros2基础命令

ros2 run demo_nodes_py listener #倾听者
ros2 run demo_nodes_cpp talker #说话者

ros2 run turtlesim turtlesim_node #启动海龟模拟器
ros2 run turtlesim turtle_teleop_key #启动海龟遥控器

rqt #RQT可视化

一、工作空间

工作空间是一个存放项目开发相关文件的文件夹,也是开发过程中存放所有资料的大本营.

我的工作空间命名为ros2_ws

# 1.使用如下命令创建一个工作空间,并且下载教程的代码:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
git clone https://gitee.com/guyuehome/ros2_21_tutorials.git
# 2.自动安装依赖
sudo apt install -y python3-pip
sudo pip3 install rosdepc
sudo rosdepc init
rosdepc update
cd ..
rosdepc install -i --from-path src --rosdistro humble -y
# 3.编译工作空间
sudo apt install python3-colcon-ros
cd ~/ros2_ws/
colcon build
# 4.设置环境变量
#source install/local_setup.sh # 仅在当前终端生效
echo " source ~/ros2_ws/install/local_setup.sh" >> ~/.bashrc # 所有终端均生效

ROS2 嵌入式开发 学习笔记(一)_第2张图片

ROS2 嵌入式开发 学习笔记(一)_第3张图片
ROS2 嵌入式开发 学习笔记(一)_第4张图片

编译成功后,就可以在工作空间中看到自动生产的build、log、install文件夹了

二、功能包

创建功能包 命令格式:

ros2 pkg create --build-type  

ros2命令中:

· pkg:表示功能包相关的功能;

· create:表示创建功能包;

· build-type:表示新创建的功能包是C++还是Python的,如果使用C++或者C,那这里就跟ament_cmake,如果使用Python,就跟ament_python;

· package_name:新建功能包的名字。

在创建好的功能包中,我们可以继续完成代码的编写,之后需要编译和配置环境变量,才能正常运行.

比如在终端中分别创建C++和Python版本的功能包:

# 1.创建功能包
mkdir -p ~/dev_yxn/src && cd ~/dev_yxn/src # 新建工作空间
ros2 pkg create --build-type ament_cmake learning_pkg_c               # C++
ros2 pkg create --build-type ament_python learning_pkg_python         # Python
# 2.编译功能包
cd ~/dev_ws
colcon build   # 编译工作空间所有功能包
# 4.设置环境变量
echo " source ~/dev_yxn/install/local_setup.sh" >> ~/.bashrc
# 5.查看功能包
ros2 pkg list
ros2 pkg list | grep "learning"

ROS2 嵌入式开发 学习笔记(一)_第5张图片

ROS2 嵌入式开发 学习笔记(一)_第6张图片

ROS2 嵌入式开发 学习笔记(一)_第7张图片

三、节点

创建节点流程

· 编程接口初始化

· 创建节点并初始化

· 实现节点功能

· 销毁节点并关闭接口

节点命令行常用操作

ros2 node list               # 查看节点列表
ros2 node info <node_name>   # 查看节点信息

案例一:Hello World节点(面向过程)

# 这是前面git clone下来的源码
ros2 run learning_node node_helloworld # 运行node_helloworld节点
# 查看源代码解析
vim ~/ros2_ws/srcros2_21_tutorials/learning_node/learning_node/node_helloworld.py 

ROS2 嵌入式开发 学习笔记(一)_第8张图片

制作node_helloworld_YXN节点

cd ~/ros2_ws/src/ros2_21_tutorials/learning_node/learning_node/
# 1.复制古月居老师文件
cp node_helloworld.py node_helloworld_YXN.py
# 2.编辑下面两个文件内容 
vim node_helloworld_YXN.py 
vim ../setup.py
# 3.重新编译
cd  ~/ros2_ws/
colcon build
# 4.运行
ros2 run learning_node node_helloworld_YXN 

ROS2 嵌入式开发 学习笔记(一)_第9张图片

ROS2 嵌入式开发 学习笔记(一)_第10张图片

ROS2 嵌入式开发 学习笔记(一)_第11张图片

案例二:Hello World节点(面向对象)

# 运行查看效果
ros2 run learning_node node_helloworld_class
# 查看源代码解析
vim ~/ros2_ws/src/ros2_21_tutorials/learning_node/learning_node/node_helloworld_class.py

ROS2 嵌入式开发 学习笔记(一)_第12张图片

案例三:物体识别节点

# 1. 安装opencv库
sudo apt install python3-opencv
# 2. 运行 
ros2 run learning_node node_object  #注意:如果修改了图片路径后需要重新编译
# 3. 源码解析如下
vim ~/ros2_ws/src/ros2_21_tutorials/learning_node/learning_node/node_object.py
#!/usr/bin/env python3 
# -*- coding: utf-8 -*-

"""
@作者: 古月居(www.guyuehome.com)
@说明: ROS2节点示例-通过颜色识别检测图片中出现的苹果
"""

import rclpy                            # ROS2 Python接口库
from rclpy.node import Node             # ROS2 节点类

import cv2                              # OpenCV图像处理库
import numpy as np                      # Python数值计算库

lower_red = np.array([0, 90, 128])     # 红色的HSV阈值下限
upper_red = np.array([180, 255, 255])  # 红色的HSV阈值上限

def object_detect(image):
    hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)   # 图像从BGR颜色模型转换为HSV模型
    mask_red = cv2.inRange(hsv_img, lower_red, upper_red)   # 图像二值化

    contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测

    for cnt in contours:              # 去除一些轮廓面积太小的噪声
        if cnt.shape[0] < 150:
            continue
            
        (x, y, w, h) = cv2.boundingRect(cnt)  # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高
        cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)  # 将苹果的轮廓勾勒出来
        cv2.circle(image, (int(x+w/2), int(y+h/2)), 5, (0, 255, 0), -1) # 将苹果的图像中心点画出来
	    
    cv2.imshow("object", image)    # 使用OpenCV显示处理后的图像效果
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def main(args=None):        # ROS2节点主入口main函数
    rclpy.init(args=args)     # ROS2 Python接口初始化
    node = Node("node_object")     # 创建ROS2节点对象并进行初始化
    node.get_logger().info("ROS2节点示例:检测图片中的苹果")

    image = cv2.imread('/home/yxn4065/ros2_ws/src/ros2_21_tutorials/learning_node/learning_node/apple.jpg')  # 读取图像
    object_detect(image)  # 苹果检测
    rclpy.spin(node)  # 循环等待ROS2退出
    node.destroy_node()  # 销毁节点对象
    rclpy.shutdown()  # 关闭ROS2 Python接口

运行结果如下:

ROS2 嵌入式开发 学习笔记(一)_第13张图片

案例四:机器视觉识别节点

ros2 run learning_node node_object_webcam #注意设置摄像头
# 源码解析如下:
#!/usr/bin/env python3 
# -*- coding: utf-8 -*-

"""
@作者: 古月居(www.guyuehome.com)
@说明: ROS2节点示例-通过摄像头识别检测图片中出现的苹果
"""

import rclpy                            # ROS2 Python接口库
from rclpy.node import Node             # ROS2 节点类

import cv2                              # OpenCV图像处理库
import numpy as np                      # Python数值计算库

lower_red = np.array([0, 90, 128])     # 红色的HSV阈值下限
upper_red = np.array([180, 255, 255])  # 红色的HSV阈值上限

def object_detect(image):
    hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)   # 图像从BGR颜色模型转换为HSV模型
    mask_red = cv2.inRange(hsv_img, lower_red, upper_red)  # 图像二值化

    contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测

    for cnt in contours:    # 去除一些轮廓面积太小的噪声
        if cnt.shape[0] < 150:
            continue
            
        (x, y, w, h) = cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高
        cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)  # 将苹果的轮廓勾勒出来
        cv2.circle(image, (int(x+w/2), int(y+h/2)), 5, (0, 255, 0), -1)    # 将苹果的图像中心点画出来
	    
    cv2.imshow("object", image)   # 使用OpenCV显示处理后的图像效果
    cv2.waitKey(50)

def main(args=None):       # ROS2节点主入口main函数
    rclpy.init(args=args)     # ROS2 Python接口初始化
    node = Node("node_object_webcam")          # 创建ROS2节点对象并进行初始化
    node.get_logger().info("ROS2节点示例:检测图像中的苹果")

    cap = cv2.VideoCapture(0)

    
    while rclpy.ok():
        ret, image = cap.read()          # 读取一帧图像
         
        if ret == True:
            object_detect(image)          # 苹果检测
        
    node.destroy_node()                  # 销毁节点对象
    rclpy.shutdown()                     # 关闭ROS2 Python接口

四、话题

话题命令行的常用操作

ros2 topic list              # 查看话题列表

ros2 topic info <topic_name>  # 查看话题信息

ros2 topic hz <topic_name>   # 查看话题发布频率

ros2 topic bw <topic_name>   # 查看话题传输带宽

ros2 topic echo <topic_name>  # 查看话题数据

ros2 topic pub <topic_name> <msg_type> <msg_data>  # 发布话题消息

案例一:Hello World话题通信

# 查看订阅者和发布者源码解析
cd ~/ros2_ws/src/ros2_21_tutorials/learning_topic/learning_topic/
vim topic_webcam_pub.py
vim topic_webcam_sub.py
# 运行发布者
ros2 run learning_topic topic_helloworld_pub
# 运行订阅者
ros2 run learning_topic topic_helloworld_sub

ROS2 嵌入式开发 学习笔记(一)_第14张图片

ROS2 嵌入式开发 学习笔记(一)_第15张图片

案例二:机器视觉识别

ros2 run learning_topic topic_webcam_pub # 发布者
ros2 run learning_topic topic_webcam_sub # 订阅者

发布者源码:

ROS2 嵌入式开发 学习笔记(一)_第16张图片

订阅者源码:

ROS2 嵌入式开发 学习笔记(一)_第17张图片

案例三:机器视觉识别优化

提高软件复用率,上面仅仅是视觉识别的节点可以复用,现在让相机驱动节点也可以复用

# 1.安装ROS中的相机驱动节点
sudo apt install ros-humble-usb-cam
# 2.使用ROS中的相机驱动节点,发布标准的图像话题
ros2 run usb_cam usb_cam_node_exe
ros2 run learning_topic topic_webcam_sub

你可能感兴趣的:(学习笔记,嵌入式开发,python,c++,嵌入式硬件,人工智能)