安裝Tello Driver
為了讓空拍機可以使用ROS,我們必須先安裝Dji Tello 的驅動
在安裝的過程中,會安裝TelloPy、h264_image_transport、tello_driver
並且要放到對應的位置,才可以順利呼叫
$ cd <CATKIN_WS/SRC>
$ git clone https://github.com/anqixu/TelloPy.git
$ cd TelloPy
$ sudo -H pip2 install -e .
$ cd ..
$ git clone https://github.com/anqixu/h264_image_transport.git
$ git clone https://github.com/anqixu/tello_driver.git
$ cd ..
$ rosdep install h264_image_transport
$ catkin build tello_driver
執行Tello Driver
- 開啟tello,並讓筆電與tello連線
- 開啟終端機
- 執行指令roslaunch tello_driver tello_node.launch
安裝後的檢查
因為ROS 是用node 以及topic的方式貫穿所有指令,如果安裝沒裝好,會有指令無法使用的問題
所以我們會再一次如同上一篇一樣用rosnode list、rostopic list,以顯示目前有的。
rosnode list
rostopic list
開始寫第一個ROS控制空拍機飛行的程式
在發佈者Publisher方面
我們要在對應的拍令動作作出定義
像是起飛動作takeoff 會用rospy.publisher中呼叫/tello/takeoff
而在cmd則是/tello/cmd_vel
takeoff_pub = rospy.Publisher('/tello/takeoff', Empty, queue_size = 1)
cmd_pub = rospy.Publisher('/tello/cmd_vel', Twist, queue_size = 10)
另外,在Cmd中的Twist就是我們的message
單純地送出一個 geometry_msgs/Twist 的 command,所以我們只要定期送出一個 command 就可以維持空拍機的動作
同時在一連串的動作之間我們也要有sleep為指令之間的緩衝時間
當中message 這次用的是以x,y,z三軸的動力數值去控制空拍機的飛行行為
msg = Twist()
msg.linear.x = 0.4
msg.angular.z = 0.36
rospy.loginfo(msg)
cmd_pub.publish(msg)
在訂閱者Subscriber方面
因為這次我們要在飛行的中途取得影像,之後再作分析的動作
所以會用到ROS當中的影像
CvBridge
ROS以其自己的sensor_msgs/Image訊息格式釋出影象,但許多使用者會希望將影象與OpenCV結合使用。
CvBridge是一個ROS庫,提供ROS和OpenCV之間的介面。
要將ROS影象訊息轉換為opencv,模組cv_bridge.CvBridge提供以下功能:
cv_image = bridge.imgmsg_to_cv2(image_message, desired_encoding="passthrough")
輸入是影象訊息,以及可選的編碼。 編碼引用目標c影象。如果給出預設值“passthrough”,則目標影象編碼將與影象訊息編碼相同。 影象編碼可以是以下任何一種OpenCV影象編碼:
- 8UC[1-4]
- 8SC[1-4]
- 16UC[1-4]
- 16SC[1-4]
- 32SC[1-4]
- 32FC[1-4]
- 64FC[1-4]
對於流行的影象編碼,CvBridge將根據需要選擇進行顏色或畫素深度轉換。 要使用此功能,請指定編碼為以下字串之一: - mono8: CV_8UC1, grayscale image
- mono16: CV_16UC1, 16-bit grayscale image
- bgr8: CV_8UC3, color image with blue-green-red color order
- rgb8: CV_8UC3, color image with red-green-blue color order
- bgra8: CV_8UC4, BGR color image with an alpha channel
- rgba8: CV_8UC4, RGB color image with an alpha channel
請注意,mono8和bgr8是大多數OpenCV函式預期的兩種影象編碼。
下一編將說明OpenCV的導入