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

ROS2学习笔记(一)


链接直达:

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

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

古月居 www.guyuehome.com

基础学习路线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UH1ycSl8-1667219976468)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\000.png)]

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 # 所有终端均生效

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

二、功能包

创建功能包 命令格式:

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:新建功能包的名字。

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

比如在终端中分别创建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"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gT783AU5-1667219976470)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\004.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tmZ4nIaU-1667219976471)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\005.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HNwmKxaB-1667219976471)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\006.png)]

三、节点

创建节点流程

· 编程接口初始化

· 创建节点并初始化

· 实现节点功能

· 销毁节点并关闭接口

节点命令行常用操作
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 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hr3mkVqE-1667219976471)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\007.png)]

制作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 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8583oW7A-1667219976472)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\008_0.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnPtEIFl-1667219976472)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\008.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvpHv4Yn-1667219976472)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\009.png)]

案例二:Hello World节点(面向对象)
# 运行查看效果
ros2 run learning_node node_helloworld_class
# 查看源代码解析
vim ~/ros2_ws/src/ros2_21_tutorials/learning_node/learning_node/node_helloworld_class.py

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yf0bBmH8-1667219976472)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\010.png)]

案例三:物体识别节点
# 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接口

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzNCqYEV-1667219976473)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\011.png)]

案例四:机器视觉识别节点
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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0LpKoEG-1667219976473)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\015.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7L839ot4-1667219976473)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\014.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vWemd8xt-1667219976473)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\013.png)]

案例二:机器视觉识别
ros2 run learning_topic topic_webcam_pub # 发布者
ros2 run learning_topic topic_webcam_sub # 订阅者

发布者源码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oai1Ld0u-1667219976474)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\016.png)]

订阅者源码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hppstjsQ-1667219976474)(E:\滇西科技师范学院大三\嵌入式开发ROS\学习笔记\017.png)]

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

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

# 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嵌入式ROS开发工程师面试试题包括以下几点: 1. 请简要介绍一下嵌入式系统和ROS嵌入式系统是一种嵌入在其他设备中,用于控制和执行特定功能的计算机系统。ROS(机器人操作系统)是一个开源的机器人软件框架,用于编写机器人应用程序。它提供了一系列工具、库和软件包,方便开发人员在嵌入式系统上构建机器人控制应用。 2. 请描述一下你在嵌入式系统开发方面的经验。 回答这个问题时,可以提到自己之前从事过嵌入式系统开发项目,包括硬件和软件方面的经验,例如使用C/C++编程语言开发嵌入式系统,熟悉常用的嵌入式开发工具和环境,以及具备硬件接口和外设驱动的开发经验等。 3. 请简要介绍一下ROS中常用的通信机制。 ROS中常用的通信机制包括话题(Topic)、服务(Service)和动作(Action)。话题是一种发布者-订阅者模式,用于在ROS节点之间传递消息。服务是一种请求-响应模式,用于在ROS节点之间进行函数调用。动作是一种高级机制,用于支持异步、可重试的行为。 4. 请简要描述一下ROS节点和ROS话题。 ROS节点是ROS中运行的一个独立的进程,可以有多个节点同时运行。每个节点都可以发布消息到话题,也可以订阅其他节点发布的消息。话题是一种通过发布者-订阅者关系连接了多个节点的通信机制。 5. 请简要解释ROS的launch文件是什么以及它的作用是什么。 ROS的launch文件是一个XML格式的文件,用于启动和组织ROS节点。通过launch文件,可以同时启动多个节点,设置节点的参数和命名空间,以及定义节点之间的关系,简化了系统启动和配置的过程。 以上是对嵌入式ROS开发工程师面试试题的回答,总结了嵌入式系统、ROS通信机制、ROS节点和话题、以及launch文件的基本概念和作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Python-AI Xenon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值