1. 程式人生 > >ROS相關:使用rospy 編寫ros程式並使用rosbag儲存資料

ROS相關:使用rospy 編寫ros程式並使用rosbag儲存資料

為什麼使用rospy

ROS支援C++和Python,由於ROS的底層是由C++編寫,因此大多數的ROS程式都使用C++,但是Python語言介面簡單,更容易編寫。並且可以使用python與深度學習的一些框架比如Caffe,TensorFlow,Theano等結合。因此,採用python是更好的選擇。本文只總結一些rospy使用的細節和rosbag的使用

rospy的優點

除了上面說的介面簡單,容易編寫,與深度學習框架相容之外,還有一點就是使用python編寫的程式可以不需要catkin_make就可以執行。對於用過ros的童鞋恐怕都知道為了編譯成功還需要修改CMakeLists.txt檔案,非常麻煩,常常編譯不成功。那麼使用python寫ROS程式會發現超級簡單。寫完直接執行。

rospy處理image的方法

該程式轉自stackoverflow

# rospy for the subscriber
import rospy
# ROS Image message
from sensor_msgs.msg import Image
# ROS Image message -> OpenCV2 image converter
from cv_bridge import CvBridge, CvBridgeError
# OpenCV2 for saving an image
import cv2

# Instantiate CvBridge
bridge = CvBridge()

def
image_callback(msg):
print("Received an image!") try: # Convert your ROS Image message to OpenCV2 cv2_img = bridge.imgmsg_to_cv2(msg, "bgr8") except CvBridgeError, e: print(e) else: # Save your OpenCV2 image as a jpeg cv2.imwrite('camera_image.jpeg'
, cv2_img) def main(): rospy.init_node('image_listener') # Define your image topic image_topic = "/cameras/left_hand_camera/image" # Set up your subscriber and define its callback rospy.Subscriber(image_topic, Image, image_callback) # Spin until ctrl + c rospy.spin() if __name__ == '__main__': main()

基本上從上面的程式碼可以看出使用rospy程式設計的方法。

如何匯入message

有時候有一些特定的message需要匯入,一般是有一個msg檔案。

所以,比如要匯入turtlesim/Pose的message型別,那麼在python中是這樣:

from turtlesim.msg import Pose

更通用的說如要匯入某個自己編寫的特定格式 xxx/kkk 那麼程式碼為:

from xxx.msg import kkk

rosbag 的使用

rosbag用來記錄資料,有兩種方法,一種是在命令列中進行。比如:

rosbag record -O dataset /turtle1/pose /turtle1/cmd_vel

另外一種做法是使用rospy。

import rospy
import rosbag
from turtlesim.msg import Pose
from turtlesim.msg import Color

bag = rosbag.Bag('dataset.bag','w')

def processColorData(data):
    bag.write('Color',data)

def processPoseData(data):
    bag.write('Pose',data)

def main():
    rospy.init_node('drone_track_data_saver')
    rospy.Subscriber('/turtle1/color_sensor',Color,processColorData)
    rospy.Subscriber('/turtle1/pose',Pose,processPoseData)

    rate = rospy.Rate(1) # 10hz
    while not rospy.is_shutdown():
        rate.sleep()
    else:
        bag.close()

if __name__ == '__main__':
        main()

兩者的效果是一樣的。採用python來寫的話可以增加一些特定的控制,比如時間間隔。

使用python讀取rosbag的內容也同樣非常簡單:

import rosbag

rbag = rosbag.Bag('dataset.bag')
numbers = 100
for topic,msg,t in rbag.read_messages():
        if numbers < 1:
            break
        numbers -= 1
        print topic,msg
rbag.close()