极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2120|回复: 0

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

[复制链接]
发表于 2023-3-30 10:41:40 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-3-30 10:41 编辑

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


2. 功能实现

操作系统:Ubuntu18.04系统,基于Debian GNU/Linux,支持x86、amd64(即x64)、ARM和ppc架构。
软件:OpenCV、ROS melodic
2.1 形状识别—识别圆形
主要用到的器材:摄像头、红色和绿色两种圆形图(见下图)


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

操作步骤:
(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的值。


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

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


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

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

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


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

②. HSV模型
倒锥形模型:


这个模型就是按色彩、深浅、明暗来描述的。
H是色彩
S是深浅, S = 0时,只有灰度
V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。


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

由RGB到HSV的转换:


④. HSV色彩范围


操作步骤:
(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,等待程序的运行。


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


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


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


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

操作步骤:
①首先参考2.2中的步骤,实现颜色检测功能。
②打开资料中的
visual_experiment_ws\src\color_tracking\arduino_program\Color_Tracking_Arduino_Program文件夹,下载程序Color_Tracking_Arduino_Program.ino至轮腿机器人的mega2560主控板。
  1. /*------------------------------------------------------------------------------------

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

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

  4.            https://opensource.org/licenses/MIT

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

  6.   ------------------------------*/

  7. /*

  8. * 颜色追踪下位机程序

  9. */


  10. #include <ros.h>

  11. #include <std_msgs/String.h>

  12. #include <Arduino.h>

  13. #include <stdio.h>

  14. #include <string.h>

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

  16. #define mySerial Serial1

  17. #define SerialBaudrate 57600

  18. #define RGB_LED_NU MBERS 3

  19. #define Bus_servo_Angle_inits 1500

  20. #define ActionDelayTimes 1500

  21. //

  22. #define wheel_speed_forward 0.07    //car forward speed

  23. #define wheel_speed_back -0.07      //car back speed

  24. #define wheel_speed_stop 0.0        //car stop speed

  25. #define wheel_speed_left 0.07       //car turnleft speed

  26. #define wheel_speed_right -0.07     //car turnright speed

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

  28. #define wheel_speed_right_translation 0.07 //speed of car right translation


  29. String receive_string="hello";

  30. ros::NodeHandle   nh;

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

  32.    receive_string=toggle_msg.data;

  33. }


  34. ros::Subscriber<std_msgs::String> sub("hahaha", &messageCb );

  35. //std_msgs::String str_msg;

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

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



  38. void setup()

  39. {

  40.   delay(1100);

  41.   Serial.begin(SerialBaudrate);

  42.   mySerial.begin(CTL_BAUDRATE);

  43.   init_Servo();  

  44.   nh.initNode();

  45.   nh.subscribe(sub);

  46. }


  47. void loop()

  48. {

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

  50.   {

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

  52.      break;

  53.      }

  54.   }

  55.     else{

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

  57.        int Data_one = 0;

  58.        int Data_two = 0;

  59.        int numbers_left=0 ,numbers_right=0;

  60.        char num_left[32] = {};

  61.        char num_right[32] = {};

  62.        String x_data="";

  63.        String y_data="";

  64.        String z_data="";

  65.        String new_string = "";                                                                              

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

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

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

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

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

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

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


  73.       Data_one = x_data.toInt();

  74.       Data_two = y_data.toInt();

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

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

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

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

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

  80.       else {Car_Move(STOP);}

  81.      

  82.       receive_string = "";

  83.       x_data="";

  84.       y_data="";

  85.       z_data="";

  86.       new_string="";

  87.     }  

  88.   nh.spinOnce();

  89.   delay(100);

  90. }
复制代码

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


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


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


      这个功能的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




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 16:03 , Processed in 0.045560 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表