Не могу получить данные от ROS Services, только вход на сервер, а данные не выходят, почему?

Мне нужно прочитать данные (скажем, давление) из микроконтроллера последовательного порта по запросу клиента. Я проверяю учебник для ROS Services в Python, но мой код все еще не передает значение данных клиенту. Здесь сначала узел Service Server Python

#!/usr/bin/env python3

from __future__ import print_function
import rospy
import numpy as np
from os import system
import time
import threading
import Microcontroller_Manager_Serial as Serial
import IMU_Functions as IMU
import Motors_Functions as Motor
import Pressure_Functions as Pressure
from geometry_msgs.msg import Vector3
import Modem_Functions as Modem
import threading 
import time
import serial
import serial.tools.list_ports

from time import sleep
from std_msgs.msg import Float32
from std_msgs.msg import String

from demo_teleop.srv import ImuValue
Communication_Mode_ = 0

def handle_ros_services():
    global P0
    data_received = Pressure.Pressure_Get_Final_Values(1,1)
    print("Server Read Data:")
    P0 = (np.int16((data_received[6]<<24) | (data_received[7]<<16) | (data_received[8]<<8) | (data_received[9])))/10000
    P=P0
    pressure = P/9.81
    current_x_orientation_s=pressure
    print("Returning ", current_x_orientation_s)
    #return ImuValue(current_x_orientation_s)


def ros_serice_server():
    #rospy.init_node('ros_serice_server')
    s = rospy.Service('imu_value', ImuValue, handle_ros_services)
    print("Ready to get_value")
    rospy.spin()


if __name__ == '__main__':
    rospy.init_node('server_node_f')
    Serial.Serial_Port_Standard()
    while not rospy.is_shutdown():
        try:
            print("entering service")
            ros_serice_server()
        except:
            print("pass")

Когда я звоню на сервер, я получаю этот вывод

entering service 
Ready to get_value

А вот и клиентский узел

#!/usr/bin/env python3

from __future__ import print_function
import rospy
import sys
import numpy as np
from os import system
import time
import threading
import Microcontroller_Manager_Serial as Serial
import IMU_Functions as IMU
import Pressure_Functions as Pressure
import time
import serial
import serial.tools.list_ports
from time import sleep
from std_msgs.msg import Float32
from std_msgs.msg import String

from demo_teleop.srv import ImuValue

Communication_Mode_ = 0

def imu_client():
    rospy.wait_for_service('handle_ros_services')
    print("Request call send")
    imu_value = rospy.ServiceProxy('imu_value', ImuValue)
    #resp1 = imu_value
    #return imu_value.current_x_orientation_s

if __name__ == "__main__":
    rospy.init_node('client_node_f')
    while not rospy.is_shutdown():
        try:
            print("entering client")
            imu_client()
        except:
            print("pass")

Когда я звоню, клиент только получил

entering client

Это означает, что сервер никогда не входит в функции handle_ros_services(), а клиент никогда не входит в функции imu_client():. Что не так с кодом?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас неправильное имя при звонке wait_for_service. Ваш сервис перезвонить называется handle_ros_services, но само имя сервиса imu_value. Из-за этого ваш клиент будет ждать вечно, потому что прежнее имя службы на самом деле никогда не вызывается. Вместо этого внутри imu_client() вам нужна линия

rospy.wait_for_service('imu_value')

Я меняю это. Теперь я могу войти в клиент, но в узле сервера никогда не вхожу в функцию handle_ros_services(), поэтому я не могу получить данные. Это потому, что сервер не ответил возврат? Как заставить сервер возвращать ответ?

Macedon971 21.03.2022 07:21

Другие вопросы по теме