2017-06-07 32 views
0

私はPythonには新しく、ローズバックから生データメッセージを抽出できるだけで、LiDARデータのパターンを探すアルゴリズムで操作できるようにする必要があります。ROSbagからのデータの抽出

私はrosbagからデータを抽出しますが(Ubuntuの16.04で、端末から実行している)このエラーを取得するためにgithubの上でスクリプトを見つけました:

[email protected]:~/workspace/TORC/LiDAR$ python ExtractDataROSbag.py 2017-02-27-09-35-59_0.bag 
[OK] Found bag: 2017-02-27-09-35-59_0.bag 
Traceback (most recent call last): 
    File "ExtractDataROSbag.py", line 130, in <module> 
    run() 
    File "ExtractDataROSbag.py", line 40, in run 
    bag = rosbag.Bag(inputFileName) 
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosbag/bag.py", line 173, in __init__ 
    self._open(f, mode, allow_unindexed) 
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosbag/bag.py", line 1096, in _open 
    if mode == 'r': self._open_read(f, allow_unindexed) 
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosbag/bag.py", line 1118, in _open_read 
    self._file  = open(f, 'rb') 
IOError: [Errno 2] No such file or directory: '2017-02-27-09-35-59_0.bag' 

コードの先頭を反復処理するように見えると袋を認識し、ファイル "Found Bag"を印刷し、その後に変数を設定しても、エラーが始まります。次のように

私が実行しているスクリプトの完全なコードは次のとおりです。

#!/usr/bin/python 

# Copyright 2010 Ankur Sinha 
# Author: Ankur Sinha 
# 
# This program is free software: you can redistribute it and/or modify 
# it under the terms of the GNU General Public License as published by 
# the Free Software Foundation, either version 3 of the License, or 
# (at your option) any later version. 
# 
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
# GNU General Public License for more details. 
# 
# You should have received a copy of the GNU General Public License 
# along with this program. If not, see <http://www.gnu.org/licenses/>. 
# 
# File : extractRawInfo.py 
# 

import rosbag 
import sys 
import os 
import pickle 

# Global variable for input file name 

def run(): 
    """ 
    Main run method. Calls other helper methods to get work done 
    """ 

    if len(sys.argv) != 2: 
     sys.stderr.write('[ERROR] This script only takes input bag file as argument.n') 
    else: 
     inputFileName = sys.argv[1] 
     print "[OK] Found bag: %s" % inputFileName 

     bag = rosbag.Bag(inputFileName) 
     topicList = readBagTopicList(bag) 

     while True: 
      if len(topicList) == 0: 
       print "No topics in list. Exiting" 
       break 
      selection = menu(topicList) 

      if selection == -92: 
       print "[OK] Printing them all" 
       for topic in topicList: 
        extract_data(bag, topic, inputFileName) 
       break 
      elif selection == -45: 
       break 
      else: 
       topic = topicList[selection] 
       extract_data(bag, topic, inputFileName) 
       topicList.remove(topicList[selection]) 

     bag.close() 

def extract_data (bag, topic, inputFileName): 
    """ 
    Spew messages to a file 

    args: 
     topic -> topic to extract and print to txt file 
    """ 

    outputFileName = os.path.splitext(os.path.split(inputFileName)[1])[0] + topic.replace("/","-") + ".txt" 
    print "[OK] Printing %s" % topic 
    print "[OK] Output file will be called %s." % outputFileName 

    outputFh = open(outputFileName, "w") 

    for topic, msg, t in bag.read_messages(topics=topic): 
     pickle.dump(msg,outputFh) 

    outputFh.close() 
    print "[OK] DONE" 

def menu (topicList): 
    """ 
    Print the user menu and take input 

    args: 
     topicList: tuple containing list of topics 

    returns: 
     selection: user selection as integer 
    """ 

    i = 0 
    for topic in topicList: 
     print '[{0}] {1}'.format(i, topic) 
     i = i+1 
    if len(topicList) > 1: 
     print '[{0}] Extract all'.format(len(topicList)) 
     print '[{0}] Exit'.format(len(topicList) + 1) 
    else: 
     print '[{0}] Exit'.format(len(topicList)) 

    while True: 
     print 'Enter a topic number to extract raw data from:' 
     selection = raw_input('>>>') 
     if int(selection) == len(topicList): 
      return -92 # print all 
     elif int(selection) == (len(topicList) +1): 
      return -45 # exit 
     elif (int(selection) < len(topicList)) and (int(selection) >= 0): 
      return int(selection) 
     else: 
      print "[ERROR] Invalid input" 

def readBagTopicList(bag): 
    """ 
    Read and save the initial topic list from bag 
    """ 
    print "[OK] Reading topics in this bag. Can take a while.." 
    topicList = [] 
    for topic, msg, t in bag.read_messages(): 
     if topicList.count(topic) == 0: 
      topicList.append (topic) 

    print '{0} topics found:'.format(len(topicList)) 
    return topicList 

if __name__ == "__main__": 
    run() 
+0

「このようなファイルやディレクトリはありません」とは、その内容を正確に示しています。あなたのコードは、あなたが何を入力したとしても "Found bag"を印刷しますが、実際には何も見つかりませんでした。 – jasonharper

答えて

0
  1. という名前のファイルが実際に存在しないことを確認してください。エラーメッセージからファイル名をコピーし、システムに見つけてもらいます。名前を再入力しないでください。初めてエラーを導入した場合は、再度実行する可能性があります。

  2. ファイルが実際に存在する場合は、コマンドラインで.bagファイルへのフルパスを入力してみてください。

+0

ファイルは存在する場所に存在しますが、まだ見つからないファイルです。しかし、あなたの応答をありがとう。私は、私はこの特定のスクリプトで運がなかったので、私はこのデータを抽出しようとするために別のrosライブラリを試してみるかもしれないと思っています。 –

関連する問題