#c
Вопрос:
Итак, я неплохо разбираюсь во многих языках программирования, C не входит в их число. Эта задача заняла бы у меня 5 минут практически во всем остальном, но после многих попыток я надеюсь на некоторые рекомендации.
Мое приложение считывает данные с RPLidar A3 и упаковывает данные в OSC для отправки другим приложениям, которые работают с данными и преобразуют их в отслеживаемые большие двоичные объекты в качестве общей системы отслеживания людей в пространстве. ( В настоящее время это выглядит так ) Я делаю это с помощью НЕБОЛЬШОЙ модификации их приложения для просмотра примеров, используя библиотеку oscpack. Датчик возвращает 2 значения: угол (плавающий) и расстояние в мм (целое число)
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.
Я прочитал несколько вещей, но <
Предостережения:
- Я знаю, что люди написали обертки для этого кода драйвера на многих других языках, но я хотел бы придерживаться этого, если это возможно
- Я хотел бы сохранить его как OSC/UDP
Любое руководство приветствуется