- 博客(81)
- 资源 (1)
- 收藏
- 关注
原创 ROS2(9)stage仿真多robot
在AGV调度系统中,需要仿真多个AGV进行测试,可选的方案有很多,但仿真上百辆、只关心在哪去哪是否碰撞的方案就不多了,这里还是 选择使用stage仿真进行测试,用来验证调度算法的执行情况。stage是基于2D栅格进行的仿真,占用资源非常少,且具有碰撞检测功能,可以获取小车的真实坐标。为了尽可能的增加仿真的数量,那么可以进行如下限制:这样既可以控制AGV行走,又可以获取它的真实位置,还能进行碰撞检测、显示路网,基本够用了。下面就来研究如何搭建整个仿真系统,并和AGV调度系统进行对接。因为不需要扫图,所以
2025-12-11 18:30:00
1021
原创 ROS2(8)stage_ros2+slam_toolbox+Nav2仿真及问题总结
本篇文章研究如何在ros2 humble下使用stage_ros2仿真多个机器人。stage是一个2D模拟器,相比来说运行资源要求不高,仿真速度快,可以仿真多个移动机器人。不过stage-ros只支持ros1。
2025-12-01 18:00:00
998
原创 【glog】编译及使用中的坑
一定要加’/',否则自动清理不会触发!源码如下,当然如果用0.7.0以上的版本就不用看了,已经修复了//这里去看log_directory最后是否有斜杠,没有的话filepath就不会拼接上目录,导致后面的IsLogFromCurrentProject判定错误if (!//没有斜杠,文件就不会进入清理列表!
2025-11-20 18:30:00
699
原创 ROS2(7)高级篇 FastDDS
XML 配置文件中的 QoS 仅在代码未指定时生效(或作为补充)。当设置 RMW_FASTRTPS_USE_QOS_FROM_XML=1 后,FastDDS 会强制忽略代码中定义的 QoS,完全遵循 XML 配置文件中声明的 QoS 策略。即使代码中显式设置了 QoS(如可靠性、历史深度),也会被 XML 中的配置覆盖。
2025-11-10 18:30:00
2104
原创 ROS2(6)中级篇3 tf2
我们可以在launch文件中,或者命令行中,发布一个静态TF转换,通过tf2_ros功能包中的static_transform_publisher节点,发布一个从world坐标系到mystaticturtle坐标系的静态坐标变换(即两个坐标系之间的相对位置和姿态固定不变)。比如这里描述了world坐标系到mystaticturtle坐标系的变换关系,描述的是mystaticturtle坐标系在world坐标系中的位置。使用tf2_echo。
2025-11-07 07:00:00
991
原创 ROS2(5)中级篇2 rosdep
rosdep init指令会创建/etc/ros/rosdep/sources.list.d/20-default.list文件,当然如果安装了ros2的docker容器,该文件已经存在。安装依赖项,比如你下载了一个 ROS 2 功能包(比如 image_pipeline,用于图像处理),准备在本地编译。这里的 opencv2 和 python3-numpy 都是系统级库(非 ROS 内部包),需要通过 Ubuntu 的 apt 等工具安装。没有 rosdep 时,你需要手动确认包的名称,并手动下载。
2025-11-05 07:00:00
250
原创 ROS2(3)入门篇 - 使用客户端库
src,ros包源码build,存储中间文件,每个包都有对应的子文件夹install,包安装位置,默认情况下,每个包都安装到单独的子目录中log,存储colcon调用的日志记录注意和catkin构建方式相比,没有了devel目录。<export></export></package>这里的TODO需要自己填写。_depend关键字和依赖有关系,这里先按住不表。这里创建了一个tutorial_interfaces的包,其中定义了一个msg和srv。
2025-10-24 19:00:00
1128
原创 ROS2(2)入门篇 - 使用命令行CLI
如---因为请求和响应的结构是用---分开描述的,/Empty服务不发送和接收任何数据,所以只显示了横线。float32 xfloat32 y机器人系统可用Action进行导航控制,发送一个目标告诉机器人到一个位置,机器人移动到该位置过程中,通过feedback反馈实时位置信息,到达后发送一个Result结果消息。
2025-10-23 18:00:00
1225
原创 【嵌入式STM32】HardFault总结
MSP压栈顺序为R0、R1、R2、R3、R12、LR,**此处LR和上面CPU寄存器的LR是不一样的!当进入HardFault时,首先看CPU寄存器信息,这里LR用于异常返回控制,0xFFFFFFF9可以去看MSP主栈寄存器。改为int显示,直接找0x8开头的,也对应了LR。也就是说,Instance非法了,遇到这种情况可以根据map文件进行问题排查。有时候,进入hardfault时,并没有堆栈信息,此时可通过如下方法进行定位。这要看map文件了,打开。此时虽然有堆栈,但我们不管,这里看。
2025-08-22 07:00:00
503
原创 【嵌入式STM32】系统架构
/消息头//消息体 } TMsg;typedef struct //消息头 {//接收消息的队列标识//发送消息的队列标识uint8_t F;//消息功能uint8_t T;//消息类型uint8_t C;//消息类别//保留//消息体长度 } TMsgHead;//短消息体struct{} tS;//长消息体struct{//消息体指针//引用计数,如果该消息被投递到多个消息队列,投递时可以增加引用计数//释放标记 0:本地释放 1 远端释放。
2025-08-20 18:30:00
893
原创 【嵌入式】CAN通信
CAN2的(只有互联型设备才有CAN2)。本次使用的STM32F103C8T6只有CAN1。简单看一下,发送的数据会进入3个发送邮箱进行数据发送,接收的数据首先进过滤器,然后放到FIFO中,每个FIFO有3个接收邮箱。
2025-08-20 18:00:00
1145
原创 【嵌入式STM32】SPI总结
在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持2S音频协议。SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。注意在小容量和中容量产品上,不支持I2S音频协议。通讯引脚SCK引脚:SPI1/SPI2/SPI3芯片手册中告知,最大速率18Mbps。NSS引脚:有两种NSS模式,软件和硬件。软件模式即可以用指定的GPIO来进行从设备片选。一般采用这种模式。MISO/MOSI引脚:数据收发引脚,通过一个数据寄存器(DR)进行收发控制。
2025-08-14 18:30:00
1128
原创 【嵌入式STM32】I2C总结
双线制总线:I2C仅使用两条线——串行数据线(SDA)和串行时钟线(SCL)进行通信,有效降低了连接复杂性。多主多从:I2C支持多个主设备和多个从设备连接到同一总线上。每个设备都有唯一的地址。总线仲裁机制保证同一时刻只有一个主设备控制总线。不同的传输速率:I2C总线支持不同的速率模式,如标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。同步通信:I2C是一种同步通信协议,数据传输由时钟信号(SCL)来控制(区别于UART异步通信)。简单的连接。
2025-08-14 18:00:00
1436
原创 【嵌入式STM32】串口通信UART
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。STM32F1系列有一个DMA控制器,F4系列有两个DMA控制器。两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
2025-08-12 18:30:00
1054
原创 【嵌入式】记录一次网络转串口透传性能提升的过程
目标:基于STM32F427,验证TCP协议下,波特率在2000000下,1网络转8串口的极限性能。网卡速率100Mbps。裸测试:不启动串口,纯网络tcp,收到数据后接着send返回,经过测试发现单收速率能到40Mbps左右,收发回环方式单方向速率只能到25Mbps。
2025-08-08 18:00:00
419
原创 【嵌入式STM32】TIM定时器总结
stm32F427,定时器的划分如下(参考官方数据手册):stm32f103定时器:这里以TIM4高级定时器为例。先看MX配置:这里的配置选项非常多,下面整理一下。可选的如下:- Disable 关闭从模式,定时器独立运行。- External Clock Mode 1,【外部时钟模式1,很特殊】 定时器时钟时钟源由外部触发信号驱动, 用外部脉冲信号作为计数时钟。当设置该项时,Clock Source变为灰色:- - Reset Mode:触发信号使定时器计数器重置,计数从0重新开始。
2025-08-07 16:55:46
1316
原创 QSerialPort关键信息总结
Qt串口编程关键要点总结 线程要求:串口的打开、发送、接收操作必须在同一线程(如主线程)完成。多线程操作需通过moveToThread或QMetaObject::invokeMethod实现。 发送机制:write()为异步发送,底层无限缓冲数据,需配合waitForBytesWritten()确保发送完成。 接收优化: 保持readBufferSize=0避免丢包,readyRead信号触发后调用readAll()读取数据。 通过SetupComm调整接收缓冲区(如32KB),减少高频信号触发。 数据解析
2025-07-31 08:50:30
501
原创 C# TAP异步编程(Task/async/await)总结
C#中有个很好用的东西,TAP异步编程(Task-based Asynchronous Pattern),是目前C#推荐的异步编程模型。它基于 System.Threading.Tasks.Task 和 async/await 关键字,旨在简化异步代码的编写、调试和维护。TAP 是现代 .NET 应用开发中最常用、最推荐的异步编程方式。要实现TAP,有三个基本元素:Task、async和await。在Winform中,使用好TAP编程,非常优雅。
2025-06-12 13:05:34
628
原创 【嵌入式】STM32内部NOR Flash磨损平衡与掉电保护总结
以上是状态控制的核心代码,其他和写文件数据内容相关、扇区切换相关略去了,以后有机会可以写个通用的、小型的模块。数据恢复的思路如下,本次检查到非法数据,直接擦了:当写入新的结构时(注意这个结构必须具备唯一标识符),需将旧的结构标记为准备删除,然后写新的结构,当新结构数据写完后,会将旧的结构数据再标记为已删除。这样初始化时扫描所有数据,如果同一个标识符的结构,一个状态为准备删除,一个为准备写入,此时认为数据未拷贝完,可以将准备写入改为已删除,废掉这个数据,重新拷贝一个新的,此时即使再次掉电也没问题。
2025-02-25 17:35:48
1767
原创 【从0到0.5】基于STM32F427+DP83848+FreeRTOS+LWIP+CubeMx+Keil搭建TCP服务端与客户端
本次测试使用的板卡是基于STM32F427ZI MCU制作的,使用的PHY芯片是DP83848。测试目的是从0开始搭建一套可以在keil执行的基于FreeRTOS和lwip的例程。
2024-12-30 18:00:00
1267
2
原创 Halcon 3D应用 - 胶路提取
本文基于某手环(拆机打磨处理)做的验证性工作,为了项目保密性,只截取部分数据进行测试。这里使用的是海康3D线激光轮廓相机+直线电机的方式进行的高度数据采集,我们拿到的是数据。提取手环上的胶路信息,检测胶路的胶宽、胶高、断胶等信息。
2024-10-09 18:00:00
2230
1
原创 DevC++编译及使用Opencv
这个DevCpp真的难用的要死,代码提示、代码补全、定义跳转等等无比难用,还是选择vscode+mingw吧!
2024-09-07 07:32:07
2727
原创 Qt 树形控件 QTreeView QTreeWidget深入剖析
通过上面的分析,用QTreeWidget在数据量不是特别大的时候,用着是没什么问题的。QTreeWidget为了兼容各种情况,已经写的很灵活了,但如何更高效呢?答案就是定制化,这样就减少了一部分灵活性。如何定制化呢?核心就是重写,Qt已经给了我们一个很好的实例,可以自己看一下这个例子,笔者这里实现的也是在这个例子基础上改的,添加了TreeItem和TreeModel两个类。TreeItem:对应了树的一行,每一列的数据存储在成员中,同时还存储父和子TreeModel:重新实现关键函数。
2024-08-26 18:03:44
3261
原创 hyper-v ubuntu下连接嵌入式linux板卡
用hyper-v非常的方便,不用装vm也不会那么臃肿,但如何在hyper-v和嵌入式板卡之间进行通讯呢?
2024-08-20 06:49:37
1517
原创 Hyper-v ubuntu22 上外网方法
步骤一,首先新建一个虚拟网络交换机,我这里名称为vEthernet (hyper-v-ubuntu),选【内部网络】步骤二, 在网络设置中,找到可以上网的网卡,这里我用的是无线网卡WLAN,设置共享连接为vEthernet (hyper-v-ubuntu):步骤三:此时查看vEthernet (hyper-v-ubuntu)网卡的ip地址,发现自动设置为了192.168.137.1。
2024-08-18 15:28:18
1931
1
原创 C语言结构体4字节对齐对效率的影响
CPU只能寻址4或8整除的地址,如果要寻址其他地址,比如0x00000003,则会寻址到0x00000000上取出4字节再找到第3位置上的数据,如果此时的数据比较长,比如有4个数据,那么第一次寻址只能拿到0x00000000取出4字节的最后一个,然后再寻址0x00000004,拿出剩余的3字节,这样就寻址了两次,花费的时间更多了。在本例中,先看TNoAlign ,当取(或者赋值)ch1时,没问题,ch2和ch3都可以取ch1的地址。当取sh4时,问题就来了,只能先取。拿到第一个字节,再取。
2024-07-26 16:47:06
436
原创 windows下vscode调试虚拟机linux c++工程的三种方法
vscode去远程调试方法有很多种,不同的插件对应了不同的调试方法,比如:1.C/C++插件进行GDB调试(编写launch.json文件)2.C/C++ Runner插件3.CMake Tools插件(只针对CMake工程,需要搭配C/C++插件一起使用,但无需编写launch.json)
2024-04-16 14:03:07
3287
1
原创 Hdevelop编辑器常用功能
【阈值分割】——对应算子threshold通过菜单【可视化】-【工具】-【灰度直方图】打开,打开后选中【变量窗口】的某张图片即可进行灰度直方图分析。刚打开并选中某张图片:调节【最小化】和【最大化】的两个竖线,此时图中绿色部分为分割出的部分(颜色可以通过【颜色】选项修改):【缩放图像灰度】——对应算子scale_image作用:即拉开图像的对比度,让图像中黑的地方更黑,亮的地方更亮。
2024-04-15 18:07:51
774
原创 halcon 3.2标定相机
使用HALCON,您不局限于使用平面校准对象,如HALCON校准板。你可以使用3D校准对象,甚至可以使用任意特征点(自然地标)。唯一的要求是模型点的3D世界位置具有高精度。然后,只需将校准对象所有点(标记)的三维坐标作为参数中的元组传递set_calib_data_calib_object对象的CalibObjDescr。所有点的所有x、y和z坐标都必须以[X,Y,Z]的形式打包在元组中按顺序排列。但是,请注意,如果使用自己的校准对象,则不能使用运算符find_calib_object接口。
2024-04-15 17:48:44
1849
原创 Halcon 3D算子总结整理
对于hom_mat3d_rotate/hom_mat3d_rotate_local等旧轴和新轴的区别,这里用2d下的类似算子进行验证,这样比较直观。对图像先旋转30度,再沿x轴平移100个像素。套用hom_mat2d_rotate_local 和hom_mat2d_translate_local,因为是对新轴进行的,所以平移是按照旋转之后的坐标系沿x平移。套用hom_mat2d_rotate和hom_mat2d_translate,因为是对旧轴进行的,所以平移还是按照之前的图像坐标系平移。
2024-03-18 11:25:40
6197
3
原创 2D/3D相机手眼标定总结
无需进行相机内参标定,只能识别,属于平面标定,在标定过程中。该算法的核心是,即到的(注意这里并不是RT的刚体变换)。由上篇文章,可知仿射变换的基本公式:有6个自由度,至少需要3组点才能解决,超过3组点,可以用非线性最小二乘优化。uvxy求解后,就可以根据给出的像素点,得到机械手的点坐标,进而可以控制机械手去相应的位置了。
2024-03-04 17:41:40
7193
8
原创 射影变换的一种解法
按照《计算机视觉中的多视图几何》P430的解释,透视变换是射影映射的一种特殊情况,它最终要的一个性质是:连接对应点的直线,共点。
2024-03-01 09:18:17
1747
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅