小黑仿生轮腿机器人(二)-机器视觉

1. 功能描述

      机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。

      本文将结合机器视觉基础,基于开源的轮腿机器人平台,进行形状识别(识别圆形)、颜色检测(红绿蓝)、颜色追踪的应用开发。

小黑仿生轮腿机器人(二)-机器视觉_第1张图片

2. 功能实现

操作系统:Ubuntu18.04系统,基于Debian GNU/Linux,支持x86、amd64(即x64)、ARM和ppc架构。

软件:OpenCV、ROS melodic

2.1 形状识别—识别圆形

主要用到的器材摄像头、红色和绿色两种圆形图(见下图)

小黑仿生轮腿机器人(二)-机器视觉_第2张图片

实现思路:利用摄像头采集图片信息识别圆形,在界面上显示出圆的圆心坐标。

操作步骤:

(1)如果您的机器人还没有配置好环境变量,那需要先把资料附件里的visual_experiment_ws文件夹拷贝到系统里,然后执行:

① 在visual_experiment_ws文件夹中的src文件夹同级别目录下,编译工作空间,并配置环境变量;

② 打开终端(Ctrl+Alt+T),输入roslaunch astra_camera astra.launch(见下图),等待程序的运行。

(2)如果您的机器人已经配置好了环境变量,或(1)中的操作已经完成,则执行:

① 打开第二个终端(Ctrl+Shift+T)输入命令:roslaunch shape_detection shape_detection_experiment.launch,等待界面的启动;

② 放置待识别的圆形图(请把物品放置在摄像头可以采集到的区域),就可以在界面上看到识别结果。下图是分别识别出红色圆形、绿色圆形轮廓,并显示识别出圆心的中心坐标x、y的值。

小黑仿生轮腿机器人(二)-机器视觉_第3张图片

       这个功能的python例程源码在visual_experiment_ws\src\shape_detection\scripts文件夹里, 文件名是shape_detection_victory.py,该程序的关键点是:先采集图像信息,再对图像信息进行处理,把识别信息显示在界面上,大家有兴趣可以阅读参考。

2.2 颜色检测(红绿蓝)

主要用到的器材:摄像头、红绿蓝三种物品(见下图)

小黑仿生轮腿机器人(二)-机器视觉_第4张图片

 实现思路:当把物品放置在摄像头前时,在界面上显示识别颜色的结果。

颜色识别算法的核心原理:

RGB和HSV彩色模型:

     数字图像处理通常采用RGB(红、绿、蓝)和HSV(色调、饱和度、亮度)两种彩色模型,RGB虽然表示比较至直观,但R、G、B数值和色彩三属性并没有直接关系,模型通道并不能很好的反映出物体具体的颜色信息,而HSV模型更符合我们描述和解释颜色的方式,使用HSV的彩色描述会更加直观。

RGB和HSV的区别:

①. RGB模型

三维坐标:

小黑仿生轮腿机器人(二)-机器视觉_第5张图片

RGB:三原色(Red, Green, Blue)

原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。

用RGB来理解色彩、深浅、明暗变化:

色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线

深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离

明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮

②. HSV模型

倒锥形模型:

小黑仿生轮腿机器人(二)-机器视觉_第6张图片

这个模型就是按色彩、深浅、明暗来描述的。

H是色彩

S是深浅, S = 0时,只有灰度

V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。

小黑仿生轮腿机器人(二)-机器视觉_第7张图片

③. RGB与HSV的联系

从上面的直观的理解,把RGB三维坐标的中轴线立起来,并扁化,就能形成HSV的锥形模型了。

但V与强度无直接关系,因为它只选取了RGB的一个最大分量。而RGB则能反映光照强度(或灰度)的变化。

v = max(r, g, b)

由RGB到HSV的转换:

小黑仿生轮腿机器人(二)-机器视觉_第8张图片

 ④. HSV色彩范围

小黑仿生轮腿机器人(二)-机器视觉_第9张图片

 操作步骤:

(1)先把资料附件里的visual_experiment_ws文件夹拷贝到系统里,然后执行:

① 在visual_experiment_ws文件夹中的src文件夹同级别目录下,编译工作空间,并配置环境变量;

② 打开终端(Ctrl+Alt+T),输入roslaunch astra_camera astra.launch(见下图),等待程序的运行。

③ 打开第二个终端(Ctrl+Shift+T)输入命令:roslaunch color_detection color_detectioning.launch,等待程序的运行。

小黑仿生轮腿机器人(二)-机器视觉_第10张图片

④ 界面启动后,放置物品(请把物品放置在摄像头可以采集到的区域),然后开始识别并在界面上显示识别结果。下面以蓝色物品为例,当摄像头识别到蓝色物品后,在界面显示结果(the color is blue)。

小黑仿生轮腿机器人(二)-机器视觉_第11张图片

⑤ 试着去放置红色、绿色物品,分别识别出的结果如下面两幅图。当摄像头识别到红色物品后,在界面显示结果(the color is red);当摄像头识别到绿色物品后,在界面显示结果(the color is green)。

小黑仿生轮腿机器人(二)-机器视觉_第12张图片

小黑仿生轮腿机器人(二)-机器视觉_第13张图片

 2.3 颜色追踪

主要用到的器材:本实验中需要用到的器材见下图,用红色的灭火器作为被追踪的物体。

小黑仿生轮腿机器人(二)-机器视觉_第14张图片

 实现思路:摄像头采集到红色物品后,通过串口通信来发布消息,轮腿订阅消息后进行相应的运动。

操作步骤:

①首先参考2.2中的步骤,实现颜色检测功能。

②打开资料中的

visual_experiment_ws\src\color_tracking\arduino_program\Color_Tracking_Arduino_Program文件夹,下载程序Color_Tracking_Arduino_Program.ino至轮腿机器人的mega2560主控板。

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-03-01 https://www.robotway.com/

  ------------------------------*/

/*

* 颜色追踪下位机程序

*/


#include 

#include 

#include 

#include 

#include 

#define CTL_BAUDRATE 115200 //总线舵机波特率

#define mySerial Serial1

#define SerialBaudrate 57600

#define RGB_LED_NU MBERS 3

#define Bus_servo_Angle_inits 1500

#define ActionDelayTimes 1500

//

#define wheel_speed_forward 0.07    //car forward speed

#define wheel_speed_back -0.07      //car back speed

#define wheel_speed_stop 0.0        //car stop speed

#define wheel_speed_left 0.07       //car turnleft speed

#define wheel_speed_right -0.07     //car turnright speed

#define wheel_speed_left_translation -0.07   //speed of car left translation

#define wheel_speed_right_translation 0.07 //speed of car right translation


String receive_string="hello";

ros::NodeHandle   nh;

void messageCb( const std_msgs::String &toggle_msg){

   receive_string=toggle_msg.data;

}


ros::Subscriber sub("hahaha", &messageCb );

//std_msgs::String str_msg;

//ros::Publisher chatter("chatter", &str_msg);

enum{FORWARD=1,BACK,LEFT,RIGHT,LEFT_TRANSLATION,RIGHT_TRANSLATION,STOP}; //the movement state of the car



void setup()

{

  delay(1100);

  Serial.begin(SerialBaudrate);

  mySerial.begin(CTL_BAUDRATE);

  init_Servo();  

  nh.initNode();

  nh.subscribe(sub);

}


void loop()

{

  if( (receive_string.length())<5 && (receive_string.length())>15 )

  {

     for(int i=0;i<1;i++){

     break;

     }

  }

    else{

       int SpacePosition[2] = {0,0};

       int Data_one = 0;

       int Data_two = 0;

       int numbers_left=0 ,numbers_right=0;

       char num_left[32] = {};

       char num_right[32] = {};

       String x_data="";

       String y_data="";

       String z_data="";

       String new_string = "";                                                                               

       SpacePosition[0] = receive_string.indexOf('-');

       x_data = receive_string.substring(0,SpacePosition[0]);

       //if(x_data.length()>=4){break;}

       new_string = receive_string.substring(SpacePosition[0]+1);

       SpacePosition[1] = new_string.indexOf('+');

       y_data = new_string.substring(0,SpacePosition[1]);

       z_data = new_string.substring(SpacePosition[1]+1);


      Data_one = x_data.toInt();

      Data_two = y_data.toInt();

      //if( (Data_one<=120) && (z_data =="state") ){Car_Move(LEFT_TRANSLATION);}

      if( (Data_one<=280) && (Data_one>=20)){Car_Move(LEFT_TRANSLATION);}

      else if ( (Data_one>=360) && (Data_one<=600) ){Car_Move(RIGHT_TRANSLATION);}

      else if( z_data == "forward" ){Car_Move(FORWARD);}

      else if( z_data == "back" ){Car_Move(BACK );}

      else {Car_Move(STOP);}

     

      receive_string = "";

      x_data="";

      y_data="";

      z_data="";

      new_string="";

    }  

  nh.spinOnce();

  delay(100);

}

③ 打开终端(Alt+ctrl+T),输入roslaunch astra_camera astra.launch 命令即可,见下图。

④ 打开第二个终端(shift+ctrl+T),输入roslaunch color_tracking camera_calibration.launch 命令,见下图。

小黑仿生轮腿机器人(二)-机器视觉_第15张图片

⑤ 移动灭火器,观察轮腿跟随灭火器运动的效果。

注意1:请把灭火器放置在摄像头可采集到的区域内;

注意2:受硬件的影响,移动灭火器的速度建议稍微慢点,如可以先把灭火器移动到一个位置,观察轮腿追踪的效果。

我在可以在rviz界面里看到摄像头采集到红色目标的中心坐标及面积,供追踪使用(见下图);同时可以观察到轮腿进行追踪红色的灭火器,直到运动到靠近灭火器的地方。

小黑仿生轮腿机器人(二)-机器视觉_第16张图片

     这个功能的python例程源码在visual_experiment_ws\src\color_tracking\scripts文件夹里, 文件名是ros_arduino_translation_test.py,该程序的关键点是:识别红色区域并在界面上显示识别后的坐标及面积。大家有兴趣可以阅读参考。

3. 资料内容

轮腿机器人-机器视觉-例程源代码

资料内容详见:小黑仿生轮腿机器人(机器视觉)

你可能感兴趣的:(机器人,人工智能)