ROS SetBool服务调用始终接收False问题求助
问题分析与解决方案
核心原因
你的问题出在JavaScript客户端传递的请求参数格式不符合ROS std_srvs/SetBool服务的消息定义。SetBool服务的请求要求传递一个包含data字段的对象,而你直接传入了布尔值true/false,导致服务端接收到的请求缺少data字段,最终使用默认值False。
具体修复步骤
1. 修改JavaScript客户端的参数传递格式
在validate函数中,将直接传递的布尔值包装为包含data字段的对象:
async function validate(val) { const service_name = "/validate_vision_info"; const service_type = "std_srvs/SetBool"; console.log(val); const iface_ = new ROSInterface(); // 关键修改:将val包装为符合SetBool请求格式的对象 let serv = await iface_ .callService_(service_name, service_type, {data: val}) .then((result) => { return result; }).catch(e => { console.log(e); }); console.log("service result", serv); }
2. (可选)统一服务名称(避免命名空间问题)
Python服务端的服务名可以改为全局名称(带/),和客户端保持一致,避免命名空间差异导致的问题:
# 在StateController的__init__方法中修改服务名 rospy.Service("/validate_vision_info", SetBool, self.validVision)
3. (可选)修复Python代码中的日志错误
原Python代码中except块使用了logging.error但未导入logging模块,会引发报错,可改为ROS自带的日志函数:
#! /usr/bin/env python3 import rospy from std_srvs.srv import SetBool, SetBoolResponse class StateController: def __init__(self): rospy.init_node("state_controller", anonymous=True) rospy.Service("/validate_vision_info", SetBool, self.validVision) rospy.spin() def validVision(self, req): model_valid = req.data rospy.logwarn("Vision Model Validation: {}".format(req.data)) return SetBoolResponse(success=True, message="") if __name__ == "__main__": try: controller_ = StateController() except rospy.ROSInterruptException: # 使用rospy自带的日志函数,无需额外导入 rospy.logerr("Error in the State Controller")
4. (可选)优化ROS连接复用
每次调用validate都新建ROSInterface实例会重复创建WebSocket连接,建议全局复用一个连接:
// 全局创建一次ROS接口实例 const iface_ = new ROSInterface(); async function validate(val) { const service_name = "/validate_vision_info"; const service_type = "std_srvs/SetBool"; console.log(val); let serv = await iface_ .callService_(service_name, service_type, {data: val}) .then((result) => { return result; }).catch(e => { console.log(e); }); console.log("service result", serv); } validate(true); validate(false);
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

