ROS初心者です。
以下のようなopencvを用いたプログラム(color_vel.py)を作成しました。
※青色の物を検知したら前進、赤い物を検知したら後退するプログラムです。
#!/usr/bin/env python
import rospy
import cv2
import numpy as np
from sensor_msgs.msg import Image
from geometry_msgs.msg import Twist
from cv_bridge import CvBridge, CvBridgeError
class ColorExtract(object):
def __init__(self):
self._vel_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
self._blue_pub = rospy.Publisher('blue_image', Image, queue_size=1)
self._red_pub = rospy.Publisher('red_image', Image, queue_size=1)
self._image_sub = rospy.Subscriber('/usb_cam/image_raw', Image, self.callback)
self._bridge = CvBridge()
self._vel = Twist()
def get_colored_area(self, cv_image, lower, upper):
hsv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2HSV)
mask_image = cv2.inRange(hsv_image, lower, upper)
extracted_image = cv2.bitwise_and(cv_image, cv_image, mask=mask_image)
area = cv2.countNonZero(mask_image)
return (area, extracted_image)
def callback(self, data):
try:
cv_image = self._bridge.imgmsg_to_cv2(data, 'bgr8')
except CvBridgeError, e:
print e
blue_area, blue_image = self.get_colored_area(
cv_image, np.array([50,100,100]), np.array([150,255,255]))
red_area, red_image = self.get_colored_area(
cv_image, np.array([150,100,150]), np.array([180,255,255]))
try:
self._blue_pub.publish(self._bridge.cv2_to_imgmsg(blue_image, 'bgr8'))
self._red_pub.publish(self._bridge.cv2_to_imgmsg(red_image, 'bgr8'))
except CvBridgeError, e:
print e
rospy.loginfo('blue=%d, red=%d' % (blue_area, red_area))
if blue_area > 1000:
self._vel.linear.x = 0.5
self._vel_pub.publish(self._vel)
if red_area > 1000:
self._vel.linear.x = -0.5
self._vel_pub.publish(self._vel)
if __name__ == '__main__':
rospy.init_node('color_extract')
color = ColorExtract()
try:
rospy.spin()
except KeyboardInterrupt:
pass
しかし、以下のように実行した際に以下のようなエラーが発生しました。
ubuntu@raspberrypi:~/catkin_ws/src/cvTest$ python color_vel.py cmd_vel:=/mobile_base/commands/velocity
Traceback (most recent call last):
File "color_vel.py", line 8, in <module>
from cv_bridge import CvBridge, CvBridgeError
ImportError: No module named cv_bridge
この場合、どのように対処するべきなのでしょうか?
何かご不明な点がありましたらご質問ください。
お力をお貸しください。よろしくお願いします。
実行機器:RaspberryPi 3 (CUI環境にて使用しています。)
OS:Ubuntu 14.04
ROSver: ROS indigo
※実行機器であるRaspberrypiはCUI環境であるため、実行結果(カメラからの映像ウィンドウなど)は同じネットワークに繋がれたPCにて表示させるつもりでした。