Я работаю над настройкой 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
Как опубликовать std::vector с помощью zmq ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1765745646
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[i].z) {
Eigen::Matrix vertices_vector{
{vertices[i].x}, {vertices[i].y}, {vertices[i].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);
Подробнее здесь: [url]https://stackoverflow.com/questions/79814461/how-to-publish-stdvectoreigen3f-using-zmq[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия