docker中的c++ ROS节点中使用Matplotlib-cpp

news2024/11/23 3:21:56

背景

有时debug算法问题,想把算法,代码的中间量快速可视化出来,目前采用rviz或者qt_ros可以实现,但都不是很方便,代码开发量较大,常常会想要是能在ros c++中也能像Matlab一样直接plot绘图就好了,正好Matplotlib-cpp库就可以解决该问题.

环境:Ubuntu18.04,c++,docker,ROS,docker内python2.7,python3.6

步骤1 拉取Matplotlib-cpp库

git clone https://github.com/lava/matplotlib-cpp.git

可以先拉取到本地,然后复制到要显示的ROS工程里一起挂载到容器.

步骤2 启动可以显示图像的docker容器

xhost +   #先执行这步,进入docker才可以显示图像
docker run -it --net=host --name <容器名> -v /tmp/.X11-unix:/tmp/.X11 -v <你要挂载的本地路径>:<容器内路径> -e DISPLAY=$DISPLAY --privileged <镜像名>:<tag名> bash

必须要这样启动容器尤其是挂载.X11,-e操作等,进入容器后可以编译,可以先跑一下matplotlib-cpp的example看看能否在docker绘图,再进行下一步

步骤3 容器内编译安装Matplotlib-cpp

进入到容器后,可以先拉取matplotlib-cpp,或者是将本地的matplotlib-cpp挂载到容器,因为我时用到ROS工程里,可以放入ROS工程的build/ devel/这一级,以免被catkin_make编译,这里自己cmake编译.
进入到容器内ros工程

cd /matplotlib-cpp
mkdir build
cd build
cmake ..
make
make install

步骤4 容器使用环境准备

要确保你的容器里是有python2,python3的,容器内执行

apt-get install python-matplotlib
apt-get install python3-matplotlib

安装完后,可以先跑以下matplotlib-cpp的example试试

./matplotlib-cpp/build/bin/bar

在这里插入图片描述
如果执行完后能出现该图,说明调用matplotlib-cpp安装好了,而且docker内显示图像也ok

步骤5修改CMakeList

修改你要画图的那个ros节点的cmakelist里
这一块自己做了很多摸索,可能有些设置是不需要的,但都加上可以跑起来.

find_package(PythonLibs 2.7)  #我这里python是2.7版本,最好保持一致

include_directories(
/usr/local/include/
/usr/include/python2.7/
/usr/include/python3.6m/
)
# add for matplot
include_directories(${PYTHON_INCLUDE_DIRS})

target_link_libraries(${NODE_NAME}
#加上下面这行依赖库
${PYTHON_LIBRARIES} # add for matplot
}

步骤6一个简单的动态绘图Demo

需要在ROS工程中使用matplotlib-cpp的话,先将 拉取的matplotlib-cpp/matplotlibcpp.h拷贝到你ROS工程里的头文件路径,然后需要画图的.cc/.cpp里#include “xxx/xxx/matplotlibcpp.h”,xxx代表你的相对路径
1.包含头文件

#include "matplotlibcpp.h"
#include <thread>   //多线程来更新图片

2.导入matplotlibcpp的命名空间

namespace plt = matplotlibcpp;

3.要plot的变量都定义成vector,这里是想画横轴为时间,纵轴分别为车速,参考加速度,实际加速度曲线,定义了一个当前时间变量

std::vector<double> time_plot, v_plot, acc_ref_plot, acc_real_plot;
double time_plot_now = 0.0;

4.在订阅车辆底盘topic的回调函数里,把各个变量最新的值往vector里塞,时间自己按照轮循的频率递增即可.放在一起塞保证各vector数量一致

time_plot.push_back(time_plot_now);
v_plot.push_back(msg->speed * 3.6);
acc_real_plot.push_back(msg->acceleration);
acc_ref_plot.push_back(g_lonctrdebug.preview_acceleration_reference);
time_plot_now = time_plot_now + 0.01;

5.定义了一个线程单独执行的画图函数

void PlotSpd() {
plt::ion();  //加这句为了动态画图
plt::figure_size(1200, 780);  //定义画图框大小
while (true) { //该线程函数里写了个死循环一直更新图像
if (time_plot.size() > 0) {  //有数据的时候才画
plt::subplot(2, 1, 1); //211含义分别为将上面figure分2行,1列,这个子图的index为1
plt::plot(time_plot, v_plot, "r*-");//该子图里画t-v曲线,r代表red,*-代表matlab里*连接每个散点
plt::title("SpeedKph");//该子图的标题
plt::subplot(2, 1, 2);//212含义分别为将上面figure分2行,1列,这个子图的index为2
plt::named_plot("acc_ref", time_plot, acc_ref_plot, "b*-");//named_plot在子图2带legend的plot
plt::named_plot("acc_real", time_plot, acc_real_plot, "r*-");
plt::legend();//将上面named_plot带的legend显示在该子图上
plt::title("acc");//该子图的标题
plt::pause(0.001);//这句非常重要,加了这句就会实时更新图像
}
}
}

6.在主线程里开辟一个线程专门调用画图函数,多线程执行减少图像显示的延迟

std::thread plot_thread(PlotSpd);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

英飞凌-AURIX-TC3XX 片上总线通信架构

目录1、英飞凌-AURIX-TC3XX 片上总线通信架构1.1、SRI-系统资源互连结构1.1.1、SRI简介1.1.2、SRI 的特征&#xff1a;1.1.3、SRI 结构相比于前一代产品主要的区别&#xff1a;1.1.4、SRI Crossbar 点对点连接机制1.1.5、SRI主机和SRI从机的连接情况1.2、系统外设总线1.3、BBB-…

Windows Qt连接达梦数据库

下载达梦数据库 首先可以在达梦数据库的官网下载达梦数据库&#xff1a;https://www.dameng.com/list_103.html 如果你的QT程序是64位的&#xff0c;那么就下载win64 的达梦数据库&#xff0c;相应的32位的QT程序要下载win32的达梦数据库。否则&#xff0c;程序在连接数据库时…

【图像分割】各向异性热扩散方程SAR图像分割【含Matlab源码 1879期】

⛄一、各向异性热扩散方程简介&#xff08;具体理论见参考文献&#xff09; 1 前言 图像分割是 图像解译的一个关键步骥。 图像分割属于图像解译的早期处理 &#xff0c; 目的是为更高水平的后续处理提供输人。 因此图像分割的好坏对后续 解译性能有较大的影响。 相对于光学图…

3、metasploit渗透测试初识

一、Metasploitable2靶机安装 参考(1条消息) Metasploitable-linux-2.0.0靶机下载配置教程_draper-crypto的博客-CSDN博客_metasploitable2-linux用户密码&#xff1a;msfadmin/msfadmin二、模块介绍 exploits&#xff08;渗透攻击/漏洞利用模块&#xff09;渗透攻击模块&#…

SuperMap GIS 倾斜摄影数据优化 QA

一、为什么要优化 倾斜摄影数据自身存在文件碎、体量大等特点。未经优化的倾斜摄影在目前市面上主流的三维平台上加载均会出现加载慢&#xff0c;浏览效率低等问题。特别是在浏览器端受文件请求量、网络带宽、硬件性能等方面的影响&#xff0c;倾斜摄影的显示效果往往不尽人意…

元房地产经纪人 — 科幻系列包 #2 来袭!

OUTR Studios 刚刚发布了他们最新的 The Sandbox 元宇宙科幻包&#xff0c;里面装满了很多好东西&#xff01;新内容包括两个非玩家角色 (NPC)、两套可装备的太空服和两个独特的太空无人机。这个最新版本肯定会为已有的模块化科幻构建套件增添更多乐趣。无论你们是与朋友一起建…

大屏适配的两种方案

现在做大屏的需求越来越多,大屏的适配是个头疼的事情 一、基于rem的适配方案 rem是什么? rem是指相对于根元素的字体大小的单位,在日常开发过程中我们通常把根元素(html/body)的字体设置为10px,方便于我们计算(此时子元素的1rem就相当于10px)。 适用场景 不固定宽高…

A_A05_001 aithinker_serial_tool_安信可调试助手使用

目录 一、软件获取 二、软件基本功能介绍 1、接收区 2、串口通信参数配置区 3、串口打开关闭与其他设置区域 4、手动发送区域 5、多文本发送区 6、辅助区域 三、注意事项 一、软件获取 网盘链接 直戳跳转 二、软件基本功能介绍 1、接收区 接收区就是接收外部设备给串口…

理解vue2.x版本中productionTip=false设置无效的原因

首先&#xff0c;我们看到vue官网中关于productionTip的API使用&#xff1a; 但是&#xff0c;我在本地中使用却无效&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta htt…

写接口用例文档,测接口

定义数据工具 共用API文档 产品、设计、前端、后端、测试、运维、售前、售后 mock 自动生成code和data 前后端 编写接口文档 post json格式 查询需要token值 APIfox介绍 一、常用解决方案 使用 Swagger 管理 API 文档 使用 Postman 调试 API 使用 mockjs 等工具 Mock AP…

算法刷题打卡第46天:排序数组---堆排序

排序数组 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5]堆排序…

[附源码]Python计算机毕业设计高校图书馆网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

C++初阶 模板进阶

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍进阶模板的一些特性 C 模板进阶非类型模板参数注意点模板的特化概念函数模板特化类模板的特化全特化偏特化模板的编译分离什么是编…

再见print !这个牛逼的库竟然这么强!

PySnooper 是一个非常方便的调试器。如果您正在试图弄清楚为什么您的Python代码没有按照您的预期去做&#xff0c;您会希望使用具有断点和监视功能的成熟Debug工具&#xff0c;但是许多Debug工具配置起来非常麻烦。 现在&#xff0c;有了PySnooper&#xff0c;您并不需要配置那…

最长回文子串问题(Manacher算法)

文章目录题目1&#xff09;例子演示2&#xff09;思路分析3&#xff09;Manacher 算法4&#xff09;代码展示题目 如何求得某字符串 str 的最长回文子串的长度&#xff1f; 要求时间复杂度 O(N) 1&#xff09;例子演示 什么是回文子串&#xff1f; 回文串即该字符串从前往…

Stable Diffusion 迁移和部署

文章目录1. 模型概述2. 模型架构3. 模型迁移流程3.1 前置准备3.2 CLIP text encoder3.3 VQ-VAE (fp16)3.4 Text conditioned unet3.5 创建pipeline3.6 web demo部署4. 效果展示5. 相关链接此实验需要最新的sdk实现模型的迁移&#xff0c;最终在1684X上进行推理。代码地址为&…

mysqldumpslow和mysqldumpslow

mysqldumpslow 这是一款mysql自带的慢查询工具&#xff0c;个人使用下来发现&#xff0c;可以满足在很多慢日志中找到有问题的慢的sql&#xff0c;并且可以进行sql排序。属于一种短小精干的工具。 命令大概形式&#xff1a; slowlog是需要分析的日志 mysqldumpslow -s c -t 1…

rocketmq源码-consumer启动

前言 这篇笔记记录consumer启动的逻辑 consumer主要是负责去broker中拉取消息&#xff0c;然后将拉取到的消息&#xff0c;交给消费者去处理 consumer本质上也是一个netty客户端&#xff0c;所以&#xff0c;在启动的时候&#xff0c;和producer有很多相似的点&#xff0c;但是…

[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-052(CVE-2017-9805)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

[附源码]Node.js计算机毕业设计高校国防教育管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…