ROS机械臂——ROS结合OpenCV案例(含资源)

纲要

在这里插入图片描述

摄像头驱动

在这里插入图片描述

图像属性

在这里插入图片描述

图像压缩

在这里插入图片描述### Realsense摄像头
在这里插入图片描述

点云展示

在这里插入图片描述### 点云图像属性
在这里插入图片描述## 摄像头标定
在这里插入图片描述

摄像头标定流程

在这里插入图片描述

如何使用标定文件

在这里插入图片描述

OpenCV

在这里插入图片描述

ROS与OpenCV的集成框架

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b0ff143b710543839325d19c7a3c04c5.png

ROS+OpenCV 图像绘制(cpp)

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

static const std::string OPENCV_WINDOW = "image_window";
 
class ImageConverter{
     ros::NodeHandle nh;
     image_transport::ImageTransport it;
     image_transport::Subscriber image_sub;
     image_transport::Publisher image_pub;

     public:
       ImageConverter()
       :it(nh){
             //订阅图像输入流 、发布图像输出流(话题名称,处理队列的大小为1,回调函数的名称,回调函数所处的类)
             image_sub = it.subscribe("/usb_cam/image_raw",1,&ImageConverter::imageCb,this);
             image_pub = it.advertise("cv_bridge_image",1);

             cv::namedWindow(OPENCV_WINDOW);
       }

    ~ImageConverter(){
           cv::destroyWindow(OPENCV_WINDOW);
    }

      void imageCb(const sensor_msgs::ImageConstPtr& msg){
          //msg为图像信息在ROS中的地址
           cv_bridge::CvImagePtr cv_ptr;

           try{
            //创建一个图像数据的拷贝
            //toCvCopy复制数据并返回复制数据地址指针cv_bridge::CvImagePtr
            //将ROS图像消息转换为了CvImage以在OpenCV中使用
            //sensor_msgs::image_encodings::BGR8是”bgr8”字符串常量。
               cv_ptr = cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
           }
           catch (cv_bridge::Exception& e){
                ROS_ERROR("cv_bridge exception: %s",e.what());
                return;
           }
       
       //在opencv窗口画红圈
       if(cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
            cv::circle(cv_ptr->image,cv::Point(50,50) , 10 , CV_RGB(255,0,0));

       //生成opencv窗口
       cv::imshow(OPENCV_WINDOW,cv_ptr->image);
       cv::waitKey(3);

       //将opencv生成的话题信息,转换为Image图像信息,通过iamge_pub发布出去,可以通过rqt_image_view订阅话题,查看opencv生成的红圈
       image_pub.publish(cv_ptr->toImageMsg());    
    }
};

int main(int argc,char ** argv){
     ros::init(argc,argv,"image_converter");
     ImageConverter ic;
     ros::spin();
     return 0;

}

ROS+OpenCV 图像绘制(python)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image

class image_converter:
    def __init__(self):    
        # 创建cv_bridge,声明图像的发布者和订阅者
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

    def callback(self,data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print e

        # 在opencv的显示窗口中绘制一个圆,作为标记
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 显示Opencv格式的图像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

        # 再将opencv格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print e

if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()
    except KeyboardInterrupt:
        print "Shutting down cv_bridge_test node."
        cv2.destroyAllWindows()

ROS+OpenCV物体识别

在这里插入图片描述

源码

get2DLocation():获取桌面以及桌面物体的坐标
在这里插入图片描述
设置红色、绿色通道,通过像素点灰度值判断出黑色桌子的具体位置,将黑色像素点具体位置的二进制数值设置为255,非黑设置为0,计算出桌子中心点,最后将非0点画上方框
在这里插入图片描述找红点、画蓝框
在这里插入图片描述
识别绿色圆柱(contours:轮廓)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析

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

结果

在这里插入图片描述

小结

在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS (Robot Operating System) 是一个广泛使用的机器人操作系统,它为机械臂控制和视觉系统提供了强大的框架。在ROS中,你可以将机械臂与摄像头组合使用,以便于执行物体识别、定位、导航等任务。具体组装流程可能包括以下几个步骤: 1. **硬件连接**: - 将机械臂连接到ROS节点:通常,机械臂制造商会提供接口(如SDK或API)用于与ROS通信,确保正确安装驱动程序和控制器。 - 安装摄像头:选择适合机械臂操作范围和分辨率的相机,并将其固定在合适的位置,比如机械臂末端。 2. **软件配置**: - **ROS包管理**:安装必要的ROS包,如`camera_calibration`, `image_transport`, `message_filters`等,用于图像处理和同步。 - **节点编写**:编写节点来接收和处理来自摄像头的数据,如实时视频流和深度图像。 - **节点通信**:使用ROS话题(Topic)或服务(Service)让机械臂动作和摄像头数据能够相互通信。 3. **传感器融合**: - 如果需要,可以通过ROS的`sensor_msgs`包来整合摄像头和机械臂的传感器信息,例如位置、姿态和摄像头的RGBD图像。 4. **算法应用**: - **视觉SLAM**:使用摄像头进行环境感知,结合机械臂运动规划,实现自主导航或物体定位。 - **目标检测与识别**:使用机器学习库(如OpenCV, TensorFlow)对摄像头抓取的图像进行物体识别,然后指导机械臂操作。 5. **测试与调试**: - 在模拟器中或真实环境中进行测试,确保机械臂和摄像头的行为符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值