自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

RedCrabe的博客

这个人很懒...

  • 博客(42)
  • 资源 (1)
  • 收藏
  • 关注

原创 RK3588编译CH343驱动

在linux中所有的设备都需要驱动,才能被正确识别,一般的驱动会直接编译在内核中,也可以以单独的模块存在,然后加载到系统中。rk3588编译出来的boot镜像,里面就包含了很多的驱动。有时候,我们需要新加一些外设的时候,将驱动单独编译成 一个模块文件是很方便的事情。这个驱动模块文件就是.ko文件。模块自身不被编译到内核映像中,从而不影响内核映像的大小一旦模块被加载,模块和内核中的其他部分的功能完全一样。

2024-08-23 15:36:05 990

原创 ubuntu上模拟串口通信

有时候写了一些串口相关的程序,需要调试的时候,又没有硬件,或者需要等其他模块完成才能一起联调。这样搭建环境费时费力,很多问题等到最后联调才发现就已经很晚了。本文提供一种在ubuntu环境下模拟串口,直接就可以调试的方法。在Ubuntu上创建虚拟串口,可以使用 socat 工具。

2024-07-16 15:32:01 765

原创 ubuntu使用vcan做本地测试

当本地没有can设备时,可以使用虚拟can在ubuntu本地进行模拟测试程序的正确性。在Ubuntu上启用虚拟控制器区域网络(vCAN),需要安装并配置CAN工具箱。以下是如何在Ubuntu上安装并设置vCAN的步骤。

2024-07-16 14:43:46 237

原创 从RK3588开发板中克隆出镜像进行备份

在开发的过程中,我们经常在开发板中按照了很多程序,配置了复杂的环境,如果每个开发板子都配置一次,费时又费力,还容易出错。本文介绍一种克隆开发板的文件系统的方法。

2024-04-23 17:46:49 864 2

原创 RK3588构建ubuntu22.04根文件系统

RK系列的平台提供了buildroot和debian的系统,使用脚本可以直接构建出来,但是没有提供ubuntu的系统,很多厂商只提供一个rootfs.img的固件包,没有将方法开源出来。本文实现了从ubuntu官网开始构建一个ubuntu22.04根文件系统。

2024-04-21 15:44:43 1934

原创 操作系统:进程(二)

一个进程从创建而产生至撤销而消亡的整个生命期间,有时占有处理器执行,有时虽可运行但分不到处理器、有时虽有空闲处理器但因等待某个事件的发生而无法执行,这一切都说明进程和程序不相同,它是活动的且有状态变化的,这可以用一组状态加以刻画。为了便于管理进程,一般来说,按进程在执行过程中的不同情况至少要定义三种不同的进程状态。如果子进程被信号中断,status会被设置一个特殊的值,表示子进程被哪个信号中断。前一篇父进程和子进程的关系已经说明了他们之间的关系,子进程结束后,要由父进程负责回收子进程的资源。

2024-04-15 19:12:19 713

原创 ROS2学习(七) Foxy版本ros2替换中间件。

在ros2使用的过程中,一开始选用的foxy版本,后来发现,foxy版本的ros2有很多问题。一个是foxy版本已经停止维护了。另一个问题是这个版本有很多bug, 后续的版本在功能实现上做了很大的改动,甚至说进行了重写。修复的一些问题,foxy版本上的问题也没有修复。最近遇到的问题是,service有时候没有应答,根据输出的log看是中间件出的问题,错误的的日志如下后面查看源码发现如下的内容,看到这个if条件是Maybe就很崩溃了。

2024-03-07 16:03:49 1535 3

原创 操作系统:进程(一)

因为进程是系统资源的分配实体,所以进程里面会有很多的系统信息,进程相关的分配的内存,寄存器,数据,PCB等很多的域。一个比较方便的办法就是把已经存在的进程的各个域完全拷贝一份,然后再修改不同的地方,就形成了一个新的进程,这样的话,创建的进程和被创建的进程之间就存在继承的关系,也就是父子进程。第8行调用fork()函数时,进程就产生了分差,变成了一个父进程一个子进程同时在系统中运行,在父进程中,fork()函数返回子进程的pid, 在子进程中,fork()函数返回0,表示当前是子进程自己。

2023-11-18 23:58:19 196

原创 云服务器安装宝塔Linux面板

最近趁双11优惠,买了个腾讯云轻量应用服务器,尝试在这上面搭建一个个人的网站。研究了一下,通过宝塔软件安装的话,非常降低,上手快。

2023-11-18 11:52:06 461

原创 Linux终端与交互式Bash

终端通常是一个文本模式的界面,可以通过键盘输入命令,并显示命令的执行结果。因此,当使用 -i 选项以交互模式运行 Bash 时,它会加载上述配置文件和环境变量,从而将当前终端的环境变量加载到新的终端中。这个命令是重新启动一个终端,然后执行bash $script脚本,如果在script脚本中需要使用到一些环境变了,例如在.bashrc中添加的环境变量,此时就无法将环境变了添加到script的执行程序中去。所以需要使用交互式的Bash运行,这样,当前的终端设置的环境变量就会传递到script的执行程序中。

2023-11-16 18:02:37 1937

原创 ROS2学习(六)Bag回放使用plotjugger

但是当在ROS2上,各类工具并不完善,比如我现在使用的foxy版本,就没有提供rqt_bag等工具,想要回放bag,分析数据比较困难。你可以导入文本文件让它显示文本文件中的数据,可以导入csv等各种格式的文件,支持画出数据曲线2.注意一下,如果是配合ROS1来使用,推荐安装PlotJuggler 2.X.X,如果是配合ROS2来使用,则推荐安装PlotJuggler 3.X.X。在靠下的位置有播放按钮,点一下播放,再点击暂停,时间轴可以拖动,从任一时间开始播放。使用下记命令可以记录ros2 的bag。

2023-10-09 13:52:19 1758

原创 ROS2学习(五)进程内topic高效通信

下面的例子是在一个进程中创建两个节点,都是用intra_process,包括一个发不器的节点,和一个订阅器的节点,二者都使用了节点的进程内通信,并通过unique指针打印了其中地址。每次通信的时候,二则消息指针的地址都是一致的,即消息没有通过UDP传输,而是通过知己读写内存区块传输的。使用intra_process的节点,其中的topic可以同时支持进程内核进程外的通信,只不过进程外的通信仍然使用UDP作为媒介。对ROS2有一定了解后,我们会发现ROS2中节点和ROS1中节点的概率有很大的区别。

2023-08-06 19:49:46 1085

原创 ROS2学习(四)进程,线程与节点的关系

单线程节点执行器会将所有已添加到维护队列的节点限制在一个线程内处理所有回调,而多线程节点执行器会按照设备的性能,动态分配线程为队列内的节点处理回调。在ROS2中,节点和进程的概念完全分开的,节点是独立于操作系统进程或者线程的概念的抽象定义,它虽然依旧承载着通信的功能,但是并不作为独立的进程运行,而是嵌入进程中,作为一个抽象的实体进行运作。节点,英文是node,在ROS2中,节点是一个抽象的实体,它可以代表某种或某类特定功能的抽象集合体,它可以存在于进程中,也可以存在于线程中。

2023-08-03 22:55:07 1728

原创 ROS2学习(三)colcon编译某个包并提供给其他包依赖使用

    简单的ROS2的例子学习可能不会遇到这个问题。但是我们仍然难免会思考为什么ROS2官方提供的包比如rclcpp,这些包我们使用的时候可以直接添加依赖,使用find_package(rclcpp REQUIRED),就可以找到。我们自己编译的包是否也可以提供给其他包使用。    如果稍微大一些的工程,会有很多人开发,那么就有可能自己开发的包是一个共通的包,希望提供您给其他人使用,如何才能做的那?    本文通过一个例子来说明如何解决这种依赖问题。例子是在一个ROS2的工程中做了两个包一个commo

2023-07-27 23:46:36 1687 1

原创 理解特殊成员函数的生成(构造,析构,拷贝构造函数等)

移动操作仅在需要的时候生成,如果生成了,就会对非static数据执行逐成员的移动,那意味着移动构造函数根据rhs参数里面对应的成员移动构造出新的部分,移动赋值运算符根据参数里面对应的非static成员移动赋值。如果你声明一个拷贝构造函数,但是没有声明拷贝赋值运算符,如果写的代码用到了拷贝赋值,编译器会帮助你生成拷贝赋值运算符重载。默认构造函数仅在类完全没有构造函数的时候才会生成(防止编译器为某个类生成构造函数,但是你希望的那个构造函数是由参数的)。与上面的拷贝操作对应的是移动操作的并不是独立的。

2023-07-22 17:37:17 185

原创 设计模式: 23重设计模式

在20世纪70年代,Christopher Alexander 提出了城市建筑的模式,他认为:模式是描述一个不断发生的问题和该问题的解决方案。随后,Erich Gamma,Richard Helm,Ralph Johnson 和John Vlissides 写了一本著名的参考书《设计模式:可复用面向对象软件的基础》,后人也因为这本书称四人为四人组,将这本书中描述的模式称为GoF(Gang of Four)设计模式。

2023-07-22 10:32:44 217

原创 ROS2学习(二、写一个简单的C++例子)

在安装完ROS2后,就开始接触ros2的很多概念,东西很多,包括编译,中间件,节点等与ros1都有一些区别。如果没有ROS1的基础,直接接触这些概念,可能更难理解。最简单的开始,就是先写一个简单的程序熟悉一下,把所有东西用一下,然后在理解所使用的每一个点的概念,这样更容易理解。就如同所有语言学习前先写一个“hello, world”一样。ROS2 也从“hello,world”开始。本文就实现了一个定时器,通过定时器,触发固定频率的发出“hello world”.

2023-07-21 00:18:56 946

原创 ROS2学习(一 、ROS2安装)

ROS2官方安装本来想找一下和ros1一样的安装指导文档,可以根据自己的系统选择。不过没有找到一个直接的说明教程。不过在ROS2的各个版本安装说明里面有写支持哪些版本的系统。比如我使用的是ubuntu20.04 安装的就是foxy版本的ROS2。这个也是目前使用最多的版本。其他的一些版本我大概看了一下,目前ROS2支持的最低的ubuntu版本就是20.04.所以如果使用的是比较低的系统版本,建议升级一下系统。我自己没有试过在低版本的上面安装,所以也不确定是否会有其他问题。

2023-07-13 00:30:38 451

原创 PCL 滤波去除噪点StatisticalOutlierRemoval

它通过计算每个点与其邻域内点的距离的标准差和平均值,来判断该点是否为噪点。如果该点与邻域内点的距离超过一定倍数的标准差,则认为该点为噪点。激光雷达扫描周围环境的时候,周围环境材料不同,反射不同,会产生不同密度的点云,同时,如果有测量偏差会导致更加稀疏的异常值出现,从而使点云生成结果质量更差。离群点滤波是一种常见的去除噪点的方法。它通过计算一个点的邻域内的点和该点的距离,来判断该点是否为噪点。如果该点距离邻域内的点的平均距离超过一定的阈值,则认为该点为噪点。

2023-06-18 11:04:09 339

原创 ROS: C++实现节点发布多边形,通过RVIZ查看

例子主要使用visualization_msgs::Marker 这个消息,通过节点发布这个消息,然后在rviz上订阅这个topic,即可以显示出画的多边形。节点启动后,启动rviz订阅topic即可,如下图。下图中红色矩形框即为显示的多边形。

2023-06-18 09:57:50 945

原创 ROS:通过topic发布栅格地图,让RVIZ显示

现在有了中心点的坐标(1.02321215e+01,1.19620981e+01),求原点坐标,即使用中心点的坐标,X,Y分别减去半张图片的大小(500 * 0.05)即25m。得到的就是原点的坐标。是直接写的固定值,使用SLAM建图后,在地图文件夹一般般都会存在map.yaml和map_0.pgm文件,map.yaml文件中的坐标就是pgm栅格图片的中心位置对应的坐标。这样程序写好后,就可以运行,然后发出的topic是/map_loader/map. 启动rviz,订阅这个topic就可以了。

2023-06-18 09:43:34 1963

原创 C++创建线程的三种方式

早期的C++并不支持多线程的创建,如果要创建多线程,依赖的是系统提供的一些方法(例如linux的 pthread). 从C++11以后开始,提供了std::thread线程库,因此我们可以创建std::thread类对象的方式来创建线程。

2023-06-11 12:05:44 4658

原创 C++ new / delete 重载

如果重载的是成员函数,责operator new和operator delete 函数必须是静态的。operator new 和operator delete的命名容易让人误解,与其他operator函数(如operator=)不同,这两个函数并没有重载new和delete。通过分析上面的工作过程,可以看到new和delete实际并不等同于operator new() 和operator delete(), new和delete做的事情要更多,实际上我们不能重定义new 和delete表达式的行为。

2023-06-10 23:51:47 656

原创 函数 重载,重写,重入

最近被问到函数的重载,重写和重入有什么区别,突然一问这些概念,有点懵了,这里梳理总结一下这三个概念。其实重载,重写和重入完全是不同维度的概念,但是名字比较像,所以经常被拿来比较。尤其是重载和重写是最容易被比较的。这两个概念也是针对C++的,对于C语言的语法,重载和重写都是不支持的。下面也会详细说一下为什么C不支持。

2023-06-04 22:28:15 671

原创 ROS导航包map错误

检查代码后发现map_server需要订阅/scantopic,而自己写的topic的名字是/robot/laser/scan。在使用ROS的导航功能包时,发现机器人人始终和地图位置不对应。将/robot/laser/scan名字改为/scan即可。需要将全局和局部代价地图总的“/”删除。启动导航功能包后,提示坐标转换错误。出现找不到激光topic错误。此时导航功能包正常运行。

2023-01-08 20:38:08 1819

原创 Gazebo仿真环境中odom和baselink关联一起

在Gazebo仿真环境中使用slam_gmapping采图时发现,没有odom数据,topic /map没有数据。通过tf_tree发现。odom没有和base_link建立关联。这需要在gazebo的配置文件中加入下面启动odom的配置。此时再看tf tree就能看做所有的位置关系关联再一起了。日志上可以看到odom完全没有。

2023-01-08 20:14:39 1517 9

原创 ROS学习:turtlebot3机器人的Gazebo仿真

2D导航目标允许设置一个期望位姿作为机器人的导航目标,导航功能包会等待名位/move_base/goal的主题来初始化目标信息,然后导航模块生产导航路线,机器人便沿着导航路线走到目标点。深入研究导航功能包的话,进入/opt/ros/melodic/share/turtlebot3_navigation可以看到具体的启动脚本如何配置的,和coastmap如何配置的.领启一个终端,启动navigation 导航节点,启动后会看到rviz被启动,从rviz上可以看到地图和点云信息,与gazebo仿真的环境对应。

2023-01-08 19:23:20 1756

原创 OPENCV 寻找图形最大内接矩形

轮廓的最大外接矩形,Opencv有提供的现成的算法,最大内接圆也有提供的算法。但是没有现成的内接矩形的算法。本文使用C++实现了取轮廓最大内接矩形的方式,供大家参考。实现的基本思路是:处理图片为灰度图其实实现的代码,直接就读入的是一张灰度图图片这一步省略了。当然如果实现起来,opencv也很容易实现。坐标转换寻找轮廓的边缘,找到轮廓的主方向的角度。通过仿射转换,主方向作为x轴。统计有效栅格。.........

2022-08-07 12:10:41 6555 9

原创 关于ldd命令使用的一些问题总结

ldd错误问题

2022-07-21 22:38:18 5041

原创 docker常用指令

docker 常用命令

2022-06-17 09:34:59 84

原创 python实现PDF文件合并成一个文件

使用python将几个pdf文件合并成一个文件,需要使用PyPDF2包。

2022-06-12 18:27:21 1174

原创 Opencv 统计灰度图所有灰度值

    一个简单的尝试,统计灰度图中共有哪些像素值。    思路:建立256大小的数组,以像素值为下标,遍历所有像素,对应像素值位置加1, 所有不为0的位置的下标即为图片中存在的像素值。...

2022-06-12 18:13:19 2273

原创 Ubuntu18.04 使用doxygen生成注释文档

在程序开发的过程中,经常遇到的是与别人交接程序,直接看别人代码是很头疼的一件事情,更何况现在有一些人写的程序非常的烂,几百行一个的函数,瞎起名字的变量,简直是代码自带加密功能,对人非常不友好。本人以前的公司,要求的比较严格,系统设计详细设计各种文档都是比较全的,设计完成后再写代码,给别人解释程序的时候,将详细设计文档发给别人就可以了。可以避免直接看代码的问题。在现在的工作时遇到的问题就是开发的周期非常短,提出需求来就马上要功能,根本没有设计一说,时间长了搞得非常难受,尤其多人参与一个模块的项目。下面

2022-03-13 00:17:55 2347

原创 树莓派安装系统和系统备份还原

最近有使用到树莓派做一些项目,下面整理了下树莓派烧录系统到系统镜像备份还原的一些方法。在操作中尝试了windows和ubuntu两个系统下的烧录方式。1.树莓派官网下载Raspberry Pi Imager登录树莓派官网https://www.raspberrypi.org/software/, 找到Pi Imager下载安装(本例使用Windows版本),然后进行安装.2.下载RaspBerry PI OS Lite版本镜像登录网址:https://www.raspberrypi.org/so

2022-02-22 23:06:43 3706 6

原创 树莓派上使用 Gstreamer做视频推流

树莓派使用Gstreamer进行视频推流 最近在研究如何使用树莓派进行视频推流推送到云端。进行了各种比较尝试后,认为使用Gstreamer比较好,主要的一点就是想利用Gstreamer的硬件加速。 在使用ffmpeg的的时候软件推流CPU使用率可以达到60%多。同样摄像头使用Gstreamer硬件加速情况下CPU使用率只有不到10%。是非常理想的一种嵌入式设备上的推流方式。 首先,是安装Gstreamer。1.安装Gstreamer使用apt-get安装,执行下面命令:sudo apt-get

2022-02-22 22:19:52 9955

原创 树莓派安装ubuntu18.04

树莓派安装Ubuntu18.041.树莓派官网下载Raspberry Pi Imager登录树莓派官网https://www.raspberrypi.org/software/, 找到Pi Imager下载安装(本例使用Windows版本),然后进行安装.2.下载Ubuntu18.04镜像登录网址:http://cdimage.ubuntu.com/releases/18.04/release/, 下载ubuntu18.04版本镜像:里面有18.04对应的支持的树莓派的版本.3.使用读卡机

2022-02-21 21:52:50 3631 1

原创 解决apt-get install不能安装软件问题

前几天在删除一个软件的的时候使用 apt-get autoremove,结果把所有依赖的软件都卸载了,而且导致很多库文件出了问题,不能再安装任何软件。后来在网上查了一下,autoremove – 卸载所有自动安装且不再使用的软件包例如:C 依赖于 B, D 依赖于B, 且D没有被其他手动安装的包依赖,apt-get autoremove C 将删除B, C, D。其实很多时候我们并不想删除B,D。所以一定慎用autoremove.经过这次删除后,导致后面任何软件都无法安装了。然后仔细研究了一下ubu

2021-02-07 11:20:40 6355

原创 Easylog一种简单的适合C++大工程的日志方式

最近在做项目时候,遇到了写日志比较麻烦的问题,需要考虑多线程而且不同类实例之间如果要写入同一个日志文件还有考虑线程安全问题,另外因为项目划分架构存在多级结构,一部分类要写入A 日志文件,另一部分要写入B日志文件.既要满足可以写多文件,又要满足写同一个文件线程安全.  从网速上找了一些开源的代码,但是要么太过简单无法满足需求,要么太复杂,需要安装库,配置文件等,于是参考别人的经验,自己写了一个日志...

2019-10-05 11:57:09 1675 2

原创 mosquitto MQTT使用中遇到的问题.

Mosquitto是实现了MQTT的一个开源库.在网上有很多如何安装的例子,这里不在讲如何安装的问题,只是谈一下在使用的过程中遇到的一些问题. 之前很奇怪网上在使用MQTT协议时,客户端大多使用paho的客户端,关于Mosquitto的客户端讲的比较少.不太清楚具体原因是什么.不过我在使用Mosquitto的客户端时确实遇到了些比较棘手的问题. 首先蜗使用的是Mosquitto 1.5.5版本...

2019-09-08 16:54:07 7125 4

原创 ubuntu CPU负荷过高原因之一--中断

[2019-07-10 14:21:09] [ERROR] MQTT log level:4, str:Warning: Received PUBREC from cloud_IDPWXB201003960101 for an unknown packet identifier 1800…

2019-08-27 22:32:00 1971

树莓派制作镜像,数据备份脚本

通过拷贝树莓派sd分区中的内容制作image镜像,方便制作系统母版,

2022-02-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除