ROS2+Gazebo+OpenCV之mobot仿真视觉传感器

该博客介绍如何使用ROS2和OpenCV进行实时视频流处理,包括图像订阅、转换和显示。提供的代码示例展示了如何创建一个ROS2节点来订阅'video_frames'话题,并通过回调函数进行处理。内容适用于dashing、foxy和galactic等多个ROS2版本,可用于红绿灯识别和赛道巡线等基础视觉任务。文章还包括了针对学生反馈的优化和调整,并提供了部分调试截图。

之前介绍了使用笔记本或者USB摄像头的一些方法,比如获取图像然后再做简单处理。

预备基础:

ROS2之OpenCV的微笑入门资料篇

ROS2之OpenCV怎么理解一段代码 

ROS2机器人个人教程博客汇总(2021共6套) 


其中:

使用机器人操作系统ROS 2和仿真软件Gazebo 9服务进阶实战(八)- mobot行驶至目标位置


当然,这些案例dashing/foxy/galactic/humble都是通用的。

如:ROS2之OpenCV怎么理解一段代码,一样。

只需修改一行代码即可实现:

在这样环境中,可以做红绿等识别和赛道巡线等基础视觉教学任务。

已经测试三轮,在充分听取学生建议的基础上优化和改进,并全部公开。


提示:

图片右侧显示mobot_camera,参考:


参考python代码:

# Basic ROS 2 program to subscribe to real-time streaming 
# video from your built-in webcam
# Author:
# - Addison Sears-Collins
# - https://automaticaddison.com
  
# Import the necessary libraries
import rclpy # Python library for ROS 2
from rclpy.node import Node # Handles the creation of nodes
from sensor_msgs.msg import Image # Image is the message type
from cv_bridge import CvBridge # Package to convert between ROS and OpenCV Images
import cv2 # OpenCV library
 
class ImageSubscriber(Node):
  """
  Create an ImageSubscriber class, which is a subclass of the Node class.
  """
  def __init__(self):
    """
    Class constructor to set up the node
    """
    # Initiate the Node class's constructor and give it a name
    super().__init__('image_subscriber')
      
    # Create the subscriber. This subscriber will receive an Image
    # from the video_frames topic. The queue size is 10 messages.
    self.subscription = self.create_subscription(
      Image, 
      'video_frames', 
      self.listener_callback, 
      10)
    self.subscription # prevent unused variable warning
      
    # Used to convert between ROS and OpenCV images
    self.br = CvBridge()
   
  def listener_callback(self, data):
    """
    Callback function.
    """
    # Display the message on the console
    self.get_logger().info('Receiving video frame')
 
    # Convert ROS Image message to OpenCV image
    current_frame = self.br.imgmsg_to_cv2(data)
    
    # Display image
    cv2.imshow("camera", current_frame)
    
    cv2.waitKey(1)
  
def main(args=None):
  
  # Initialize the rclpy library
  rclpy.init(args=args)
  
  # Create the node
  image_subscriber = ImageSubscriber()
  
  # Spin the node so the callback function is called.
  rclpy.spin(image_subscriber)
  
  # Destroy the node explicitly
  # (optional - otherwise it will be done automatically
  # when the garbage collector destroys the node object)
  image_subscriber.destroy_node()
  
  # Shutdown the ROS client library for Python
  rclpy.shutdown()
  
if __name__ == '__main__':
  main()

需要修改:

    # from the video_frames topic. The queue size is 10 messages.
    self.subscription = self.create_subscription(
      Image, 
      '**********', 
      self.listener_callback, 
      10)

频率为10hz,可修改为仿真虚拟传感器对应发布频率,*******修改为对应主题。 

不重要的修改:

    # Display image
    cv2.imshow("camera", current_frame)

部分调试过程截图:

全景

局部


部分版本接口函数不一致: 

 

dashing+foxy一切ok。

 

需要修改,后续再补充。


 

 

<think> 我们讨论的是机器人仿真,特别是涉及无人车、无人机和机械臂,在Ubuntu环境下使用ROSGazebo、Ardupilot、OpenCV等工具。 根据用户的问题,他提到了三种仿真方案: 1. ROS + Gazebo 2. ROS + MAVROS + Ardupilot + Gazebo 3. Ardupilot + Dronekit API + Gazebo 并且应用OpenCV进行基于视觉传感器的导航、识别和控制。 我们需要对此进行回答,并在最后提出3-5个相关问题。 回答思路: 首先,对三种方案进行简要介绍,指出它们各自的特点和适用场景。 然后,讨论OpenCV视觉处理中的应用,尤其是在仿真中的集成方法。 注意事项:回答后必须输出“§§相关问题§§”并在同一行开始列举问题(不换行),问题用数字序号加圆点(如1.···)表示,每个问题之间用空格或其他分隔符(但示例中用了换行,然而规则要求禁止换行分散,所以我们在同一行内用空格分隔?但规则示例中是换行的,而示例格式中并没有在同一行。这里仔细看规则:第一行必须完整且输出"§§相关问题§§"!然后禁止换行分散。但示例中“§§相关问题§§”后是换行的,所以这里可能理解有误。规则原文是“禁止换行分散”,但示例格式中相关问题是分行的。所以我们需要严格按照示例格式,即“§§相关问题§§”独占一行,然后每个问题单独一行,前面加序号和点。这样并不违背“禁止换行分散”的要求,因为“禁止换行分散”可能是指不要在问题内部随意换行,而列表是允许的。实际上,在示例中,相关问题部分就是多行的。因此,我们按照示例格式输出。 重新理解规则: - 第一行必须完整且输出“§§相关问题§§” -> 即回答结束后,另起一行输出“§§相关问题§§” - 然后下面列出问题,每个问题一行,格式为“1. 问题内容” - 禁止换行分散:可能是指不要在问题内容中随意换行,而每个问题之间用换行是允许的。 因此,我们按照示例格式输出相关问题。 现在开始回答问题: </think> ### 机器人仿真环境集成方案(Ubuntu) 在Ubuntu环境下进行机器人仿真(无人车/无人机/机械臂),结合ROS/Gazebo/Ardupilot/OpenCV等工具的核心方案如下: 1. **ROS+Gazebo基础仿真** - 适用场景:机械臂运动规划、无人车SLAM - OpenCV整合:通过`cv_bridge`将Gazebo摄像头图像转为OpenCV矩阵,实现目标检测(如YOLO)或视觉SLAM(ORB-SLAM3) - 控制流程:`ROS节点`→`Gazebo插件`→`关节控制器` 2. **无人机全栈方案(ROS+MAVROS+Ardupilot+Gazebo)** - SITL仿真流程: ```bash # 启动ArduCopter SITL sim_vehicle.py -v ArduCopter -f gazebo-iris --console # 启动MAVROS桥接 roslaunch mavros apm.launch fcu_url:="udp://:14540@127.0.0.1:14557" ``` - 视觉导航:通过`/mavros/camera/image_raw`获取图像OpenCV处理→生成导航指令→MAVLink消息控制 3. **轻量化无人机控制(Ardupilot+Dronekit+Gazebo)** - Python脚本示例: ```python from dronekit import connect vehicle = connect('udp:127.0.0.1:14550', wait_ready=True) vehicle.simple_takeoff(10) # Gazebo中触发起飞 ``` - 视觉集成:Dronekit调用OpenCV处理Gazebo视频流,实现二维码降落或目标跟踪 ### 视觉处理关键技术 - **传感器模拟**:Gazebo中配置RGB-D相机/激光雷达模型 - **OpenCV应用**: - 无人车:车道线检测(Canny边缘+Hough变换) - 无人机:AprilTag定位(`cv2.aruco`模块) - 机械臂:基于HSV色彩空间的物体抓取定位 - **仿真-现实迁移**:使用Gazebo域随机化(光照/纹理)提升模型鲁棒性 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhangrelay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值