roscpp客户端无法调用rospy服务

时间:2017-01-26 16:48:18

标签: python c++ ros rospy

我正在尝试使用roscpp客户端来调用rospy服务器。不幸的是,即使我的服务器似乎正常运行且没有问题,我的客户端的呼叫也总是失败。我已经包含了下面的客户端和服务器的代码以及我收到的输出(我可以根据请求包含CMakeList.txt和package.xml,但我很确定问题出现在以下文件中)。

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 {} ,这让我相信我的客户端有问题,但我不确定是什么问题。

-

编辑:因此,经过进一步调查,这似乎是启动文件的错误因为我能够使用rosrun同时调用服务器和客户端并让它们成功通信。有没有人知道为什么启动文件会导致调用错误?特别是考虑到waitForService调用说服务器可用的事实。

1 个答案:

答案 0 :(得分: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的任何信息。