Сервису ROS не удалось сохранить файлы

Я хочу иметь службу save_readings, которая автоматически сохраняет данные из rostopic в файл. Но каждый раз, когда вызывается служба, она не сохраняет никаких файлов. Я попытался запустить этот код сохранения файла на Python без использования rosservice, и код работает нормально. Я не понимаю, почему это происходит.

#!/usr/bin/env python
# license removed for brevity

import rospy,numpy
from std_msgs.msg import String,Int32MultiArray,Float32MultiArray,Bool
from std_srvs.srv import Empty,EmptyResponse
import geometry_msgs.msg
from geometry_msgs.msg import WrenchStamped
import json
# import settings
pos_record = []
wrench_record = []
def ftmsg2listandflip(ftmsg):
    return [ftmsg.wrench.force.x,ftmsg.wrench.force.y,ftmsg.wrench.force.z, ftmsg.wrench.torque.x,ftmsg.wrench.torque.y,ftmsg.wrench.torque.z]

def callback_pos(data):
    global pos_record
    pos_record.append(data.data)

def callback_wrench(data):
    global wrench_record
    ft = ftmsg2listandflip(data)
    wrench_record.append([data.header.stamp.to_sec()] + ft)

def exp_listener():
    stop_sign = False
    rospy.Subscriber("stage_pos", Float32MultiArray, callback_pos)
    rospy.Subscriber("netft_data", WrenchStamped, callback_wrench)
    rospy.spin()

def start_read(req):
    global pos_record
    global wrench_record
    pos_record = []
    wrench_record = []
    return EmptyResponse()

def save_readings(req):
    global pos_record
    global wrench_record
    filename = rospy.get_param('save_file_name')
    output_data = {'pos_list':pos_record, 'wrench_list': wrench_record }
    rospy.loginfo("output_data %s",output_data)

    with open(filename, 'w') as outfile:  # write data to 'data.json'
        print('dumping json file')
        json.dump(output_data, outfile)   #TODO: find out why failing to save the file.
    outfile.close()
    print("file saved")
    rospy.sleep(2)
    return EmptyResponse()


if __name__ == '__main__':
    try:
        rospy.init_node('lisener_node', log_level = rospy.INFO)
        s_1 = rospy.Service('start_read', Empty, start_read)
        s_1 = rospy.Service('save_readings', Empty, save_readings)
        exp_listener()
        print ('mylistener ready!')
    except rospy.ROSInterruptException:
        pass

person Daolin    schedule 19.06.2018    source источник


Ответы (1)


Понятно. Мне нужно указать путь к сохраняемому файлу.

save_path = '/home/user/catkin_ws/src/motionstage/'
filename = save_path + filename
person Daolin    schedule 20.06.2018