机器谱 发表于 2023-3-30 10:41:40

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

本帖最后由 机器谱 于 2023-3-30 10:41 编辑

1. 功能描述
       机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。
       本文将结合机器视觉基础,基于开源的轮腿机器人平台,进行形状识别(识别圆形)、颜色检测(红绿蓝)、颜色追踪的应用开发。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg1cvKoAYoh4-OqAUw7QM4ywY!450x450.png.webp
2. 功能实现
操作系统:Ubuntu18.04系统,基于Debian GNU/Linux,支持x86、amd64(即x64)、ARM和ppc架构。
软件:OpenCV、ROS melodic
2.1 形状识别—识别圆形
主要用到的器材:摄像头、红色和绿色两种圆形图(见下图)

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgs8zKoAYo8M678gEwjwU4jQE.png.webp
实现思路:利用摄像头采集图片信息识别圆形,在界面上显示出圆的圆心坐标。

操作步骤:
(1)如果您的机器人还没有配置好环境变量,那需要先把资料附件里的visual_experiment_ws文件夹拷贝到系统里,然后执行:
① 在visual_experiment_ws文件夹中的src文件夹同级别目录下,编译工作空间,并配置环境变量;
② 打开终端(Ctrl+Alt+T),输入roslaunch astra_camera astra.launch(见下图),等待程序的运行。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg5MzKoAYoqqXOKDDlBThm.png.webp
(2)如果您的机器人已经配置好了环境变量,或(1)中的操作已经完成,则执行:
① 打开第二个终端(Ctrl+Shift+T)输入命令:roslaunch shape_detection shape_detection_experiment.launch,等待界面的启动;

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgkM3KoAYomvWD0QIw0gY4eg!800x800.png.webp
② 放置待识别的圆形图(请把物品放置在摄像头可以采集到的区域),就可以在界面上看到识别结果。下图是分别识别出红色圆形、绿色圆形轮廓,并显示识别出圆心的中心坐标x、y的值。

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

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

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgjM7KoAYolMOt-Acw1gc4gwQ!400x400.png.webphttps://28846868.s21i.faiusr.com/4/ABUIABAEGAAgo87KoAYogJro4QEwjwc4ngI!700x700.png.webp
实现思路:当把物品放置在摄像头前时,在界面上显示识别颜色的结果。

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

RGB和HSV的区别:
①. RGB模型
三维坐标:

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg-87KoAYo3IjqkgYwyAE4yAE.png.webp
RGB:三原色(Red, Green, Blue)
原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。
用RGB来理解色彩、深浅、明暗变化:
色彩变化:三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线
深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离
明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮

②. HSV模型
倒锥形模型:

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgxs-KoAYorMPK4Qcw3AE4sAE.png.webp
这个模型就是按色彩、深浅、明暗来描述的。
H是色彩
S是深浅, S = 0时,只有灰度
V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg9M-KoAYo3qq-8wMw3AE41AE.png.webp
③. RGB与HSV的联系
从上面的直观的理解,把RGB三维坐标的中轴线立起来,并扁化,就能形成HSV的锥形模型了。
但V与强度无直接关系,因为它只选取了RGB的一个最大分量。而RGB则能反映光照强度(或灰度)的变化。
v = max(r, g, b)

由RGB到HSV的转换:

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgp9DKoAYokszevgMwuwQ44gE.png.webp
④. HSV色彩范围

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgydDKoAYoh561hAUwwwU4pAI.png.webp
操作步骤:
(1)先把资料附件里的visual_experiment_ws文件夹拷贝到系统里,然后执行:
① 在visual_experiment_ws文件夹中的src文件夹同级别目录下,编译工作空间,并配置环境变量;
② 打开终端(Ctrl+Alt+T),输入roslaunch astra_camera astra.launch(见下图),等待程序的运行。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAggNHKoAYoiPey_AIw4wM4Rw.png.webp
③ 打开第二个终端(Ctrl+Shift+T)输入命令:roslaunch color_detection color_detectioning.launch,等待程序的运行。

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

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg5tHKoAYopuznsQcw1QI4qwM.png.webp
⑤ 试着去放置红色、绿色物品,分别识别出的结果如下面两幅图。当摄像头识别到红色物品后,在界面显示结果(the color is red);当摄像头识别到绿色物品后,在界面显示结果(the color is green)。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgltLKoAYoloKbwwMwpgM4wgI.png.webphttps://28846868.s21i.faiusr.com/4/ABUIABAEGAAgqNLKoAYoxLLy8AYw9gM4-gI!450x450.png.webp
2.3 颜色追踪
主要用到的器材:本实验中需要用到的器材见下图,用红色的灭火器作为被追踪的物体。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg29LKoAYo4p3w1gUwgQM41gI.png.webp
实现思路:摄像头采集到红色物品后,通过串口通信来发布消息,轮腿订阅消息后进行相应的运动。

操作步骤:
①首先参考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 <ros.h>

#include <std_msgs/String.h>

#include <Arduino.h>

#include <stdio.h>

#include <string.h>

#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<std_msgs::String> 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 = {0,0};

       int Data_one = 0;

       int Data_two = 0;

       int numbers_left=0 ,numbers_right=0;

       char num_left = {};

       char num_right = {};

       String x_data="";

       String y_data="";

       String z_data="";

       String new_string = "";                                                                              

       SpacePosition = receive_string.indexOf('-');

       x_data = receive_string.substring(0,SpacePosition);

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

       new_string = receive_string.substring(SpacePosition+1);

       SpacePosition = new_string.indexOf('+');

       y_data = new_string.substring(0,SpacePosition);

       z_data = new_string.substring(SpacePosition+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 命令即可,见下图。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgwNTKoAYooOr-igIwnAU4YA.png.webp
④ 打开第二个终端(shift+ctrl+T),输入roslaunch color_tracking camera_calibration.launch 命令,见下图。

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgjtXKoAYopNq-4wIwjgg4nwE!700x700.png.webp
⑤ 移动灭火器,观察轮腿跟随灭火器运动的效果。
注意1:请把灭火器放置在摄像头可采集到的区域内;
注意2:受硬件的影响,移动灭火器的速度建议稍微慢点,如可以先把灭火器移动到一个位置,观察轮腿追踪的效果。
我在可以在rviz界面里看到摄像头采集到红色目标的中心坐标及面积,供追踪使用(见下图);同时可以观察到轮腿进行追踪红色的灭火器,直到运动到靠近灭火器的地方。

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

3. 资料下载
资料内容:轮腿机器人-机器视觉-例程源代码

资料下载地址:https://www.robotway.com/h-col-196.html

想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com



页: [1]
查看完整版本: 小黑仿生轮腿机器人(二)-机器视觉