鱼香 ROS http://d2lros2foxy.fishros.com/#/
创客制造 https://www.ncnynl.com/archives/201801/2250.html
古月居 www.guyuehome.com
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
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 node list # 查看节点列表
ros2 node info <node_name> # 查看节点信息
# 这是前面git clone下来的源码
ros2 run learning_node node_helloworld # 运行node_helloworld节点
# 查看源代码解析
vim ~/ros2_ws/srcros2_21_tutorials/learning_node/learning_node/node_helloworld.py
制作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 run learning_node node_helloworld_class
# 查看源代码解析
vim ~/ros2_ws/src/ros2_21_tutorials/learning_node/learning_node/node_helloworld_class.py
# 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 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> # 发布话题消息
# 查看订阅者和发布者源码解析
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 run learning_topic topic_webcam_pub # 发布者
ros2 run learning_topic topic_webcam_sub # 订阅者
发布者源码:
订阅者源码:
提高软件复用率,上面仅仅是视觉识别的节点可以复用,现在让相机驱动节点也可以复用
# 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