2017-01-26 3 views
0

Я пытаюсь использовать клиент roscpp для вызова rospy-сервера. К сожалению, мои вызовы от моего клиента всегда терпят неудачу, хотя мой сервер работает правильно и без проблем. Я включил код для клиента и сервера ниже вместе с получаемым результатом (я могу включить CMakeList.txt и package.xml по запросу, но я уверен, что проблема находится где-то в следующих файлах).Клиент roscpp не может вызвать службу rospy

service.py:

#!/usr/bin/env python 

from std_srvs.srv import Empty, EmptyResponse 
import rospy 

def serviceCall(call): 
    print "service called" 
    return EmptyResponse() 

def serviceCall_server(): 
    rospy.init_node('service_server') 
    s = rospy.Service('a_new_service', Empty, serviceCall) 
    print "Ready to receive service calls." 
    rospy.spin() 

if __name__ == "__main__": 
    serviceCall_server() 

client.cpp:

#include <ros/ros.h> 
#include <std_srvs/Empty.h> 

int main(int argc, char** argv){ 
    ros::init(argc, argv, "service_client"); 
    ros::NodeHandle n; 
    ros::Rate r(30); 

    ros::ServiceClient service_call = n.serviceClient<std_srvs::Empty>("/a_new_service", 100); 

    std_srvs::Empty srv; 
    service_call.waitForExistence(); 
    if (service_call.call(srv)) 
    { 
     ROS_ERROR("Successfully called service a_new_service"); 
    } 
    else 
    { 
     ROS_ERROR("Failed to call service a_new_service"); 
    } 

} 

запуск файла:

<launch> 
    <node name="server" pkg="test" type="server.py" output="screen"/> 
    <node name="client" pkg="test" type="client" output="screen" /> 
</launch> 

выход из стартового файла:

core service [/rosout] found 
process[server-1]: started with pid [25659] 
process[client-2]: started with pid [25660] 
[ INFO] [1485448779.402439557]: waitForService: Service [/a_new_service] has not been advertised, waiting... 
Ready to receive service calls. 
[ INFO] [1485448779.630636002]: waitForService: Service [/a_new_service] is now available. 
[ERROR] [1485448779.630685730]: Failed to call service a_new_service 

Запуск файла запуска приводит к сбою вызова службы (см. Последнюю строку вывода). Я могу позвонить rosservice call/a_new_service {} с терминала успешно, что заставляет меня поверить, что я делаю что-то не так с моим клиентом, но я не уверен, что не так.

-

EDIT: Так что после дальнейшего исследования это, кажется, ошибка с файлом запуска Поскольку я могу назвать как сервер и клиент, используя rosrun и они общаются успешно. Кто-нибудь знает, почему файл запуска может вызвать ошибку при вызове? Особенно учитывая тот факт, что вызов waitForService говорит, что сервер доступен.

ответ

0

мне удалось решить мою собственную проблему, изменив

ros::ServiceClient service_call = n.serviceClient<std_srvs::Empty>("/a_new_service", 100); 

в

ros::ServiceClient service_call = n.serviceClient<std_srvs::Empty>("/a_new_service"); 

Я до сих пор не совсем уверен, почему код, дайте мне скомпилировать с этим, как я не могу видеть какую-либо информацию о ROS API относительно того, что могло означать значение.