极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1655|回复: 0

机器人制作开源方案 | 桌面级全向底盘--机器视觉

[复制链接]
发表于 2023-9-13 09:28:12 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-9-13 09:28 编辑

       机器视觉是人工智能正在快速发展的一个分支,简单说来机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。

机器视觉基础主要包含形状识别、颜色检测、颜色追踪、二维码识别等。

       机器视觉系统最基本的特点就是提高生产的灵活性和自动化程度,在一些不适于人工作业的危险工作环境或者人工视觉难以满足要求的场合,常用机器视觉来替代人工视觉。同时在大批量重复性工业生产过程中,用机器视觉检测方法可以大大提高生产的效率和自动化程度。接下来我们将结合机器视觉基础,基于开源的机器人平台,进行形状识别、颜色检测、颜色追踪的应用开发。

1. 形状识别-识别圆形
实现思路
       利用摄像头采集图片信息识别圆形,在界面上显示出圆的圆心坐标。
器材准备
       摄像头、红色和绿色两种圆形图(如下图所示)。


操作步骤
① 下载文末资料中的参考程序visual_experiment_ws\src\shape_detection\scripts\shape_detection_victory.py:
  1. #!/usr/bin/env python

  2. #!-*-coding=utf-8 -*-

  3. import rospy

  4. from sensor_msgs.msg import Image

  5. import cv2

  6. import numpy as np

  7. from cv_bridge import CvBridge, CvBridgeError

  8. import sys

  9. import time

  10. lower_blue=np.array([100,43,46])

  11. upper_blue=np.array([124,255,255])

  12. #lower_blue=np.array([14,143,80])

  13. #upper_blue=np.array([23,255,200])

  14. #lower_red=np.array([0,200,55])

  15. #upper_red=np.array([10,255,130])

  16. #lower_red=np.array([0,150,55])

  17. #upper_red=np.array([10,255,130])

  18. lower_red=np.array([0,43,46])

  19. upper_red=np.array([10,255,255])

  20. lower_green=np.array([40,43,46])

  21. upper_green=np.array([77,255,255])

  22. font = cv2.FONT_HERSHEY_SIMPLEX   # 设置字体样式

  23. kernel = np.ones((5, 5), np.uint8)   # 卷积核

  24. img_pub = rospy.Publisher('webcam/image_raw', Image, queue_size=2)

  25. #cap = cv2.VideoCapture(0)

  26. def areaCal(contour):

  27.     area = 0

  28.     for i in range(len(contour)):

  29.         area += cv2.contourArea(contour[i])

  30.     return area

  31. def image_callback(msg):

  32.            bridge = CvBridge()

  33.            frame = bridge.imgmsg_to_cv2(msg, "bgr8")

  34.            #cv2.imshow("source", frame)

  35.            #ret, frame = Video.read()

  36.            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)   # 转换为灰色通道

  37.            hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)   # 转换为HSV空间

  38.            mask = cv2.inRange(hsv, lower_red, upper_red)   # 设定掩膜取值范围   [消除噪声]

  39.            #mask = cv2.inRange(hsv, lower_green, upper_green)   # 设定掩膜取值范围 [消除噪声]

  40.            opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)   # 形态学开运算 [消除噪声]

  41.            bila = cv2.bilateralFilter(mask, 10, 200, 200)   # 双边滤波消除噪声 [消除噪声]

  42.            edges = cv2.Canny(opening, 50, 100)   # 边缘识别 [消除噪声]

  43.            mask_green = cv2.inRange(hsv,lower_green,upper_green)

  44.            opening_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel)

  45.            bila_green = cv2.bilateralFilter(mask_green, 10, 200, 200)

  46.            edges_green = cv2.Canny(opening_green, 50, 100)

  47.            images,contourss,hierarchvs = cv2.findContours(edges_green,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  48.            image,contours,hierarchv = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  49.            scaling_factor = 0.5

  50.            print "area_red=",areaCal(contours),"area_green=",areaCal(contourss)

  51.            if(areaCal(contours)>50):

  52.              #circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=20, minRadius=20, maxRadius=500)

  53.              circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=20, minRadius=0, maxRadius=0)

  54.              if circles is not None:   # 如果识别出圆

  55.                #print "I found the red circle"

  56.                for circle in circles[0]:

  57.                  x_red=int(circle[0])

  58.                  y_red=int(circle[1])

  59.                  r_red=int(circle[2])

  60.                  cv2.circle(frame, (x_red, y_red), r_red, (0, 0, 255), 3)   # 标记圆

  61.                  cv2.circle(frame, (x_red, y_red), 3, (255, 255, 0), -1)   # 标记圆心

  62.                  text = 'circle' + 'x:   '+str(x_red)+' y:   '+str(y_red)

  63.                  cv2.putText(frame, text, (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0)   # 显示圆心位置

  64.            if(areaCal(contourss)>1000):

  65.              #circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=20, minRadius=20, maxRadius=500)

  66.              circles = cv2.HoughCircles(edges_green, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=20, minRadius=0, maxRadius=0)

  67.              if circles is not None:   # 如果识别出圆

  68.                #print "I found the green circle"

  69.                for circle in circles[0]:

  70.                  x_red=int(circle[0])

  71.                  y_red=int(circle[1])

  72.                  r_red=int(circle[2])

  73.                  cv2.circle(frame, (x_red, y_red), r_red, (0, 0, 255), 3)   # 标记圆

  74.                  cv2.circle(frame, (x_red, y_red), 3, (255, 255, 0), -1)   # 标记圆心

  75.                  text = 'circle' + 'x:   '+str(x_red)+' y:   '+str(y_red)

  76.                  cv2.putText(frame, text, (10, 60), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0)   # 显示圆心位置

  77.            frame = cv2.resize(frame,None,fx=scaling_factor,fy=scaling_factor,interpolation=cv2.INTER_AREA)

  78.            msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")

  79.            img_pub.publish(msg)

  80.            cv2.waitKey(3)

  81.            '''

  82.            rate = rospy.Rate(20) # 5hz

  83.            scaling_factor = 0.5

  84.            bridge = CvBridge()

  85.            count = 0

  86.            while not rospy.is_shutdown():

  87.              if (True):

  88.                count = count + 1

  89.              else:

  90.                rospy.loginfo("Capturing image failed.")

  91.              if count == 2:

  92.                count = 0

  93.                frame = cv2.resize(frame,None,fx=scaling_factor,fy=scaling_factor,interpolation=cv2.INTER_AREA)

  94.                msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")

  95.                img_pub.publish(msg)

  96.            rate.sleep()         

  97.            '''

  98. def webcamImagePub():

  99.     rospy.init_node('webcam_puber', anonymous=True)

  100. #    img_pub = rospy.Publisher('webcam/image_raw', Image, queue_size=2)

  101.     rospy.Subscriber("/image_raw", Image, image_callback)

  102.     rospy.spin()

  103. if __name__ == '__main__':

  104.     try:

  105.         webcamImagePub()

  106.     except rospy.ROSInterruptException:

  107.         pass

  108.     finally:

  109.         webcamImagePub()
复制代码
② 打开第一个终端(Ctrl+Alt+T)并输入:roslaunch astra_camera astra.launch 命令(见下图), 等待程序的运行。


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


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



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色彩范围



操作步骤
① 连接电路:请把摄像头与主机进行连接。


② 下载文末资料中的参考程序visual_experiment_ws\src\color_detection\scripts\color_test_one.py:
  1. #!/usr/bin/env python

  2. #!-*-coding=utf-8 -*-

  3. import rospy

  4. from sensor_msgs.msg import Image

  5. from cv_bridge import CvBridge, CvBridgeError

  6. import cv2

  7. import numpy as np

  8. import serial

  9. import time

  10. import sys

  11. from std_msgs.msg import UInt16

  12. from std_msgs.msg import String

  13. img_pub = rospy.Publisher('webcam/image_raw', Image, queue_size=2)

  14. lower_blue=np.array([100,43,46])

  15. upper_blue=np.array([124,255,255])

  16. lower_red=np.array([0,43,46])

  17. upper_red=np.array([10,255,255])

  18. lower_green=np.array([40,43,46])

  19. upper_green=np.array([77,255,255])

  20. font = cv2.FONT_HERSHEY_SIMPLEX

  21. kernel = np.ones((5, 5), np.uint8)

  22. def areaCal(contour):

  23.     area = 0

  24.     for i in range(len(contour)):

  25.         area += cv2.contourArea(contour[i])

  26.     return area

  27.    

  28. def image_callback(msg):

  29.   bridge = CvBridge()

  30.   img = bridge.imgmsg_to_cv2(msg, "bgr8")

  31.   #cv2.imshow("source", img)

  32.   hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

  33.   mask_red = cv2.inRange(hsv,lower_red,upper_red)

  34.   res = cv2.bitwise_and(img,img,mask=mask_red)

  35.   scaling_factor = 0.5

  36. #   cv2.imshow("res",res)

  37.   image,contours,hierarchv = cv2.findContours(mask_red,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  38. #   print   "red=",areaCal(contours)

  39.   if (areaCal(contours)>5000):

  40. #    print "red color"

  41.     text_red = 'the color is red'

  42.     cv2.putText(img, text_red, (10, 30), font, 1, (0, 0, 255), 2, cv2.LINE_AA, 0)

  43.   mask_blue= cv2.inRange(hsv, lower_blue, upper_blue)

  44.   res_yellow = cv2.bitwise_and(img,img,mask=mask_blue)

  45.   image,contours,hierarchv = cv2.findContours(mask_blue,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  46.   if(areaCal(contours)>8000):

  47.     text_blue = 'the color is blue'

  48. #    print "blue color"

  49.     cv2.putText(img, text_blue, (10, 60), font, 1, (255, 0, 0), 2, cv2.LINE_AA, 0)

  50.   mask_green=cv2.inRange(hsv, lower_green,upper_green)

  51.   res_green = cv2.bitwise_and(img,img,mask=mask_blue)

  52.   image,contours,hierarchv = cv2.findContours(mask_green,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  53.   if (areaCal(contours)>5000):

  54.     text_green = 'the color is green'

  55.     cv2.putText(img, text_green, (10, 90), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0)

  56. #    print ("green color")

  57. #   else:

  58. #     print( "NONE COLOR" )

  59.   frame = cv2.resize(img,None,fx=scaling_factor,fy=scaling_factor,interpolation=cv2.INTER_AREA)

  60.   msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")

  61.   img_pub.publish(msg)

  62.   cv2.waitKey(3)

  63. #   cv2.waitKey(1)

  64. def main():

  65.     rospy.init_node('image_listener',anonymous=True)

  66.     #image_topic = "/camera/color/image_raw"

  67.     #rospy.Subscriber("/camera/color/image_raw", Image, image_callback)

  68.     rospy.Subscriber("/image_raw", Image, image_callback)

  69.     rospy.spin()

  70. if __name__ == '__main__':

  71.     main()
复制代码
③ 打开终端(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)。


检测到红色物品


检测到绿色物品


3. 颜色追踪
实现思路
       摄像头采集到红色物品后,通过串口通信来发布消息,黑手底盘订阅消息后进行相应的运动。
器材准备
       实验中需要用到的器材如下图所示(其中用红色的灭火器来代表待追踪的物体)。


操作步骤
① 下载文末资料中Ros通信的参考程序visual_experiment_ws\src\color_tracking\scripts\ros_arduino_translation_test.py:
  1. #!/usr/bin/env python

  2. #!coding=utf-8

  3. import rospy

  4. from sensor_msgs.msg import Image

  5. from cv_bridge import CvBridge, CvBridgeError

  6. import cv2

  7. import numpy as np

  8. import serial

  9. import time

  10. import sys

  11. from std_msgs.msg import UInt16

  12. from std_msgs.msg import String

  13. #lower_blue=np.array([50,143,146])

  14. #upper_blue=np.array([124,255,255])

  15. #lower_blue=np.array([14,143,80])

  16. #upper_blue=np.array([23,255,200])

  17. lower_blue=np.array([100,43,46])

  18. upper_blue=np.array([124,255,255])

  19. #lower_red=np.array([0,200,55])

  20. #upper_red=np.array([10,255,130])

  21. #lower_red=np.array([0,150,55])

  22. #upper_red=np.array([10,255,130])

  23. lower_red=np.array([0,43,46])

  24. upper_red=np.array([10,255,255])

  25. lower_green=np.array([40,43,46])

  26. upper_green=np.array([77,255,255])

  27. #ser = serial.Serial('/dev/ttyACM0', 57600, timeout=2.0) #2020.8.28 source value=0.5

  28. img_pub = rospy.Publisher('webcam/image_raw', Image, queue_size=2)

  29. data_pub= rospy.Publisher('Color_center_point',String,queue_size=20)

  30. red_flag=0

  31. blue_flag=0

  32. image_flags = 1

  33. cx_string=""

  34. cy_string=""

  35. cx_cy_string=""

  36. send_data = ""

  37. count=0

  38. scaling_factor = 1.0   #2020.8.28 source value=0.5

  39. def areaCal(contour):

  40.     area = 0

  41.     for i in range(len(contour)):

  42.         area += cv2.contourArea(contour[i])

  43.     return area

  44.    

  45. def image_callback(msg):

  46.   global count,send_data

  47.   bridge = CvBridge()

  48.   frame = bridge.imgmsg_to_cv2(msg, "bgr8")

  49.   #cv2.imshow("source", frame)

  50.   hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

  51.   mask_red = cv2.inRange(hsv,lower_red,upper_red)

  52.   res = cv2.bitwise_and(frame,frame,mask=mask_red)

  53.   #cv2.imshow("res",res)

  54.   image,contours,hierarchv = cv2.findContours(mask_red,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  

  55.   print "mianji=",areaCal(contours)

  56.   if (areaCal(contours)>5000):

  57.     if(areaCal(contours)>80000):

  58.       send_data="back"

  59.       #ser.write("back\n")

  60.       #print "back"

  61.     elif( areaCal(contours)<50000 and areaCal(contours)>5000 ):

  62.       send_data="forward"

  63.       #ser.write("forward\n")

  64.       #print "forward"

  65.     else:

  66.       send_data="state"

  67.     if len(contours) > 0:

  68.       c = max(contours, key=cv2.contourArea)

  69.       #print "c=",c

  70.       cnt=contours[0]

  71.       cv2.drawContours(frame, c, -1, (0, 0, 255), 3)#画轮廓

  72.       #cv2.imshow("drawcontours",frame)

  73.       M = cv2.moments(c)

  74.       if M["m00"] !=0:

  75.         cx = int(M['m10']/M['m00'])

  76.         cy = int(M['m01']/M['m00'])

  77.         center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))

  78.         cv2.circle(frame, (cx,cy), 8, (0, 255, 0), -1)

  79.         print "center=",center,"cx=",cx,"cy=",cy

  80.         cx_string=str(cx)

  81.         cy_string=str(cy)

  82.         #cx_cy_string=(cx_string + "-" + cy_string + "\n").encode('utf-8')

  83.         #cx_cy_string=(cx_string + "-" + cy_string + "-" + send_data + "\n").encode('utf-8')

  84.         cx_cy_string=(cx_string + "-" + cy_string + "+" + send_data ).encode('utf-8')

  85.         print (cx_cy_string)

  86.         data_pub.publish(cx_cy_string)

  87.       else:

  88.         cx=0

  89.         cy=0

  90.     else:

  91.       print "no red color something"

  92.       #cv2.imshow("chanle", img)

  93. #      if cv2.waitKey(1) & 0xFF == ord('q'):

  94. #        #break

  95. #        #continue

  96.   if(image_flags==1):

  97.     count = count+1

  98.   else:

  99.     rospy.loginfo("Capturing image failed.")

  100.   if count == 2:

  101.     count = 0

  102.     frame = cv2.resize(frame,None,fx=scaling_factor,fy=scaling_factor,interpolation=cv2.INTER_AREA)

  103.     msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")

  104.     img_pub.publish(msg)

  105.   cv2.waitKey(1)

  106. def main():

  107.     rospy.init_node('image_listener',anonymous=True)

  108. #    img_pub = rospy.Publisher('webcam/image_raw', Image, queue_size=2)

  109.     rospy.Subscriber("/image_raw", Image, image_callback)

  110.     rospy.spin()

  111. if __name__ == '__main__':

  112.     main()
复制代码

下载文末资料中控制黑手底盘运动的参考程序visual_experiment_ws\src\color_tracking\arduino_program\Color_Tracking_Arduino_Program\Color_Tracking_Arduino_Program.ino:
  1. /*

  2. * rosserial Publisher Example

  3. * Prints "hello world!"

  4. */

  5. #include <ros.h>

  6. #include <std_msgs/String.h>

  7. #include <Arduino.h>

  8. #include <stdio.h>

  9. #include <string.h>

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

  11. #define mySerial Serial2

  12. #define SerialBaudrate 57600

  13. #define RGB_LED_NUMBERS 3

  14. #define Bus_servo_Angle_inits 1500

  15. #define ActionDelayTimes 1500

  16. //

  17. #define wheel_speed_forward 0.08    //car forward speed

  18. #define wheel_speed_back -0.08      //car back speed

  19. #define wheel_speed_stop 0.0        //car stop speed

  20. #define wheel_speed_left 0.1       //car turnleft speed

  21. #define wheel_speed_right -0.1     //car turnright speed

  22. #define wheel_speed_left_translation 0.08   //speed of car left translation

  23. #define wheel_speed_right_translation -0.08 //speed of car right translation

  24. char cmd_return[200];

  25. String receive_string="hello";

  26. ros::NodeHandle   nh;

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

  28.    receive_string=toggle_msg.data;

  29. }

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

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

  32. void setup()

  33. {

  34.   delay(1100);

  35.   Serial.begin(SerialBaudrate);

  36.   mySerial.begin(CTL_BAUDRATE);  

  37.   nh.initNode();

  38.   nh.subscribe(sub);

  39. }

  40. void loop()

  41. {

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

  43.   {

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

  45.      break;

  46.      }

  47.   }

  48.     else{

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

  50.        int Data_one = 0;

  51.        int Data_two = 0;

  52.        int numbers_left=0 ,numbers_right=0;

  53.        char num_left[32] = {};

  54.        char num_right[32] = {};

  55.        String x_data="";

  56.        String y_data="";

  57.        String z_data="";

  58.        String new_string = "";                                                                              

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

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

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

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

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

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

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

  66.       Data_one = x_data.toInt();

  67.       Data_two = y_data.toInt();

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

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

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

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

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

  73.       else {Car_Move(STOP);}

  74.      

  75.       receive_string = "";

  76.       x_data="";

  77.       y_data="";

  78.       z_data="";

  79.       new_string="";

  80.     }  

  81.   nh.spinOnce();

  82.   delay(100);

  83. }

  84. <font size="3">
  85. </font>
复制代码
② 打开终端(Alt+ctrl+T),输入roslaunch astra_camera astra.launch命令即可,见下图。


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



③ 移动灭火器,观察黑手底盘跟随灭火器运动的效果。
      【注意:请把灭火器放置在摄像头可采集到的区域内;受硬件的影响,移动灭火器的速度建议稍微慢点,可以先把灭火器移动到一个位置,然后观察底盘追踪的效果】
       我们可以在rviz界面里看到摄像头采集到红色目标的中心坐标及面积,供追踪使用(如下图所示)。



4. 资料下载
资料内容:程序源代码
资料下载地址:桌面级全向底盘-机器视觉 https://www.robotway.com/h-col-260.html




回复

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-1 21:33 , Processed in 0.042008 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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