Как опубликовать std::vector с помощью zmqC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как опубликовать std::vector с помощью zmq

Сообщение Anonymous »

Я работаю над настройкой ZeroMQ PUB/SUB, где издатель отправляет данные облака точек, полученные с камеры глубины Intel RealSense, а подписчик реконструирует их для дальнейшей обработки.
В моем издателе я храню облако точек как std::vector, представляющий координаты XYZ. Затем я пытаюсь сериализовать и отправить этот вектор с помощью ZeroMQ. На стороне подписчика я пытаюсь восстановить тот же вектор из полученного сообщения.
Однако этот подход постоянно приводит к ошибке сегментации, когда я пытаюсь получить доступ к полученным данным или преобразовать их обратно в формат std::vector.
Publisher:

int ret; // error ret var

// fetch frames from realsense
frame = rs_ptr->frame_q.wait_for_frame();

if (rs2::frameset fs = frame.as()) {
auto aligned_frames = rs_ptr->align.process(fs);

// get raw point cloud data
rs2::points points = rs_ptr->pc.calculate(depthFrame);
std::vector raw_points;
raw_points.reserve(points.size());
const rs2::vertex *vertices = points.get_vertices();
for (size_t i = 0; i < points.size(); i++) {
if (vertices.z) {
Eigen::Matrix vertices_vector{
{vertices.x}, {vertices.y}, {vertices.z}, {1.0}};

Eigen::Matrix vertices_in_ned =
utils::camera_to_ned_transform * vertices_vector;

raw_points.push_back(vertices_in_ned.head().cast());
}
}

ret = utils::publish_msg(pub, topic_pointcloud, [raw_points]() {
zmq::message_t msg(raw_points.size());
memcpy(msg.data(), raw_points.data(), raw_points.size());
return msg;
});
if (!ret) { // error publishing
}

int publish_msg(zmq::socket_t &pub, const std::string &topic_name,
std::function get_encoded_msg) {

try {
zmq::message_t msg = get_encoded_msg();
zmq::message_t topic(topic_name.size());

pub.send(zmq::buffer(topic_name), zmq::send_flags::sndmore);
pub.send(msg, zmq::send_flags::none);
} catch (zmq::error_t &e) {
return 0;
}
return 1;
}


Подписчик:

std::vector pointcloud_msg;

zmq::recv_result_t result_pointcloud = zmq::recv_multipart(
mapping_sub, std::back_inserter(pointcloud_msg));

std::vector raw_points;

const float *points_buffer =
static_cast(pointcloud_msg[1].data());
size_t points_buffer_size = pointcloud_msg[1].size();

std::vector raw_points;

for (size_t i = 0; i < points_buffer_size; i++) {
raw_points.push_back(Eigen::Vector3f(points_buffer[i * 3 + 0],
points_buffer[i * 3 + 1],
points_buffer[i * 3 + 2]));
}

// std::vector filtered_points =
// nav::processPointCloud(raw_points);


Подробнее здесь: https://stackoverflow.com/questions/798 ... -using-zmq
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»