публикация сообщений OSC через ROS - PullRequest
0 голосов
/ 23 апреля 2019

Мне нужно написать узел издателя ROS (и затем абонентский узел), используя данные IMU, которые публикуются из IMU с использованием OSC. У меня есть скрипт Python, который будет печатать данные на экран, но мне нужно иметь возможность опубликовать это через ROS.

Я видел rososc, но это связано с использованием интеллектуальных устройств, которыми я не пользуюсь, и я просто не знаю достаточно, чтобы иметь возможность преобразовать его в то, что мне нужно.

Я написал некоторый код, используя примеры, которые я нашел в качестве основы, но на данный момент он просто публикует «нет» вместо потока данных.

Как мне опубликовать OSC в узле ROS, а не только на экране?

Вот мой код - он в основном такой же, как и оригинальный скрипт , но с некоторыми смешанными командами ROS.

# I've added this function
def handlerfunction(s, x, y, z, w): 
    # Will receive message data unpacked in s, x, y
    pass

def generate_imu():
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="0.0.0.0", help="The ip to listen on")
    parser.add_argument("--port",
      type=int, default=8084, help="The port to listen on")
    args = parser.parse_args()

    dispatcherObj = dispatcher.Dispatcher()
    # dispatcherObj.map("/quaternion", print) #- original command to print data to screen
    pub=rospy.Publisher('imu_pub',Float32,queue_size=10)
    rospy.init_node('generate_imu')
    while not rospy.is_shutdown():
        #/quaternion is imu data followed by numerical data. I replaced 'print' with handlerfunction
        ngimu_out = dispatcherObj.map("/quaternion",handlerfunction)
        rospy.loginfo("imu: %s", ngimu_out)
        pub.publish(ngimu_out)

    server = osc_server.ThreadingOSCUDPServer((args.ip, args.port), dispatcherObj)
    print("Serving on {}".format(server.server_address))

    server.serve_forever()

Прокомментированная строка Я получил: [INFO] [1556016429.254443]: imu: нет

Я хочу получить: [INFO] [1556016429.254443]: imu: 0,02763 3,282368 9,367127 0,32357235 0,775263

Если кто-нибудь может помочь или даже направить меня в правильном направлении, я был бы так благодарен.

1020 * ТИА *

1 Ответ

0 голосов
/ 23 апреля 2019
# I've added this function
def handlerfunction(s, x, y, z, w): 
    # Will receive message data unpacked in s, x, y
    pass

Эта часть ничего не делает.

Как насчет того, чтобы попробовать это?

class imu_data:

    def __init__(self):
        self.s = 0
        self.x = 0
        self.y = 0
        self.z = 0
        self.w = 0


# I've added this function
def handlerfunction(s, x, y, z, w): 
    # Will receive message data unpacked in s, x, y
    newData = imu_data() //creating new object
    newData.s = s;
    newData.x = x;
    newData.y = y;
    newData.z = z;
    newData.w = w;
    return newData

И:

rospy.init_node('generate_imu')
ngimu_out = new imu_data()
while not rospy.is_shutdown():

Не могли бы вы проверить, если этоработает пожалуйста?Если он не пытается распечатать его отдельно.

print("s: " + ngimu_out.s)

Как, например,

...