首先在工作空间下创建一个包,如果没有工作空间,则使用
mkdir -p ~/ros2_workspace/src
进入到src
目录,并执行以下命令创建一个新的包。假设你要创建一个名为my_package
的包:
cd ~/ros2_workspace/src
ros2 pkg create --build-type ament_python capture_img
这个命令将会创建一个名为capture_img
的包,它的类型是 Python 的构建类型(ament_python
)。
进入在src路径下生成的capture_img文件夹,编写我们采集图片的节点
import cv2
import rclpy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
def main():
rclpy.init()
# 创建 ROS 2 节点
node = rclpy.create_node('capture_image')
# 创建发布者,发布图像消息到 '/processed_image' 话题
publisher = node.create_publisher(Image, '/capture_image', 10)
cap = cv2.VideoCapture(0)
while cap.isOpened():
codec = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
cap.set(cv2.CAP_PROP_FOURCC, codec)
cap.set(cv2.CAP_PROP_FPS, 30)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 300)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 380)
ret, frame = cap.read()
if not ret:
break
# 在这里进行图像处理
# 比如,你可以在这里添加你的图像处理代码
# 创建 CvBridge 对象
bridge = CvBridge()
# 将 OpenCV 格式的图像转换为 ROS 消息格式
img_msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")
# 发布图像消息到 ROS 2 话题
publisher.publish(img_msg)
# 显示图像
cv2.imshow('YOLO', frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
# 退出 ROS 2 节点
rclpy.shutdown()
if __name__ == '__main__':
main()
将文件命名为capture.py,同时在同一个路径下生成一个空的__init__.py
接下来编写我们的launch文件
在/src/capture_img路径下新建一个launch文件夹,编写capture_img.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='capture_img', # 替换为你的包名
executable='capture_img', # 替换为你的节点文件名
name='capture_img_node', # 节点名称
output='screen', # 输出方式为屏幕
)
])
但是现在如果直接编译的话install文件架里面可能会找不到launch文件,此时还需要修改setup.py
from setuptools import setup
from glob import glob
import os
package_name = 'capture_img'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name,'launch'), glob('launch/*.launch.py')),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='qing',
maintainer_email='qing@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'capture_img = capture_img.capture:main',
],
},
)
修改后即可
colcon build
运行launch文件
source install/setup.bash
ros2 launch capture_img capture_img.launch.py