Построение сообщения OSC с циклом for в C /oscpack для лидара

#c

Вопрос:

Итак, я неплохо разбираюсь во многих языках программирования, C не входит в их число. Эта задача заняла бы у меня 5 минут практически во всем остальном, но после многих попыток я надеюсь на некоторые рекомендации.

Мое приложение считывает данные с RPLidar A3 и упаковывает данные в OSC для отправки другим приложениям, которые работают с данными и преобразуют их в отслеживаемые большие двоичные объекты в качестве общей системы отслеживания людей в пространстве. ( В настоящее время это выглядит так ) Я делаю это с помощью НЕБОЛЬШОЙ модификации их приложения для просмотра примеров, используя библиотеку oscpack. Датчик возвращает 2 значения: угол (плавающий) и расстояние в мм (целое число)

sdk получает все значения из спина, а затем вы повторяете их с помощью цикла. У меня все работает нормально, когда он отправляет пары значений, когда получает их «т. Е. расстояние лидара1/ угла» из UDP-сокета. Это выглядит так:

  UdpTransmitSocket transmitSocket(IpEndpointName(ADDRESS, PORT));
    char lidbuffer[OUTPUT_BUFFER_SIZE];
    
    for (int pos = 0; pos < (int)count;   pos) {
        scanDot dot;
        
        if (!buffer[pos].dist_mm_q2) continue;

        dot.quality = buffer[pos].quality;
        dot.angle = buffer[pos].angle_z_q14 * 90.f / 16384.f;
        dot.dist = buffer[pos].dist_mm_q2 /4.0f;
        _scan_data.push_back(dot);
       
        osc::OutboundPacketStream p(lidbuffer, OUTPUT_BUFFER_SIZE);
        p << osc::BeginMessage(SENDPREFIX)
            << dot.angle << (int)dot.dist << osc::EndMessage;
        transmitSocket.Send(p.Data(), p.Size());      

    }
 

Это работает, но поскольку я перешел на датчик с более высоким разрешением, у меня возникли проблемы с удаленными данными, поэтому я хотел бы собрать данные в одно сообщение или пакет. Для справки, каждый оборот датчика составляет около 800 пар угол/расстояние.

Это то, что, как я думал, сработает, основываясь на примере oscpack, который он компилирует, но вылетает при открытии:

Как большое послание:

 UdpTransmitSocket transmitSocket(IpEndpointName(ADDRESS, PORT));
char lidbuffer[OUTPUT_BUFFER_SIZE];
//make a new message
osc::OutboundPacketStream p(lidbuffer, OUTPUT_BUFFER_SIZE);
p << osc::BeginMessage(SENDPREFIX);
for (int pos = 0; pos < (int)count;   pos) {
    scanDot dot;
    
    if (!buffer[pos].dist_mm_q2) continue;

    dot.quality = buffer[pos].quality;
    dot.angle = buffer[pos].angle_z_q14 * 90.f / 16384.f;
    dot.dist = buffer[pos].dist_mm_q2 /4.0f;
    _scan_data.push_back(dot);

    //add more data into the message
    p << dot.angle << (int)dot.dist; 
      
}
//send the message
p << osc::EndMessage;
transmitSocket.Send(p.Data(), p.Size());  
 

As a bundle

 UdpTransmitSocket transmitSocket(IpEndpointName(ADDRESS, PORT));
char lidbuffer[OUTPUT_BUFFER_SIZE];
osc::OutboundPacketStream p(lidbuffer, OUTPUT_BUFFER_SIZE);
//make a bundle
p << osc::BeginBundleImmediate;    
for (int pos = 0; pos < (int)count;   pos) {
    scanDot dot;
    
        if (!buffer[pos].dist_mm_q2) continue;
    
        dot.quality = buffer[pos].quality;
        dot.angle = buffer[pos].angle_z_q14 * 90.f / 16384.f;
        dot.dist = buffer[pos].dist_mm_q2 /4.0f;
        _scan_data.push_back(dot);
    
        //add a message to the bundle
        p << osc::BeginMessage(SENDPREFIX) << dot.angle << (int)dot.dist << osc::EndMessage;; 
          
    }
    //send the bundle
    p << osc::EndBundle;
    transmitSocket.Send(p.Data(), p.Size());
 

Both compile but crash.

Я прочитал несколько вещей, но <

Предостережения:

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

Любое руководство приветствуется