You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:25:52