007 导航
...
006 机器人仿真
机器人仿真常见仿真软件目前市面上有许多机器人仿真软件,这些仿真软件其实是独立于ROS的,他们是通过一些物理引擎做的。通过一些插件,可以让这些仿真软件和ROS2结合。下面的笔记全是基于Gazebo的 所需参数仿真时URDF文件必须定义一些子标签: 碰撞(collison标签) 内参:包括物体质量(mass标签)、旋转惯量(inertia标签)、摩擦力(gazebo扩展的一些标签) Gazebo的使用Gazebo本身是个与ROS无关的软件,必须通过一些插件,才能让它和ROS2结合 启动直接启动Gazebo的话,不会启动对应的ROS2 node,这样的话就无法和ROS2联动了。所以启动Gazebo的时候必须指定ROS2插件 1gazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so 此时会创建一个叫/gazebo的ROS节点,该节点创建了一些service,让我们可以与其交互(gazeo里面本身也有一些GUI操作工具,但是无法直接加载urdf文件) 1234567891011121314ros2...
XV6实验
XV6 Labs参考 Mit6.S081学习记录-CSDN博客 Lab Utils Slepp实验:写一个用户程序,调用sleep system call实现,执行sleep 10,表示程序等待10个时钟周期 pingpong实验:写一个程序,使用unix system calls在两个进程间”ping-pong“一个字节,使用一对pipe,一个pipe对应一个方向,另外一个pipe对应另外一个方向 find实验:实现find用户程序 ,即在某个路径中,找出某个文件 xargs实验:实现类似unix xargs类似功能,比如echo hello too|xargs echo bye,要输出bye hello too Lab System Calls System call tracing实验:实现trace系统调用,跟踪指定的系统调用 Sysinfo实验:实现一个sysinfo 系统调用,可以实现打印当前空闲内存大小(字节)、可用进程数 Lab Page tables Print a page...
内存的分区
内存的分区及存放位置一、内存分区介绍程序中内存有以下分区: 栈区(stack) 临时创建的局部变量存放在栈区。 函数调用时,其入口参数存放在栈区。 函数返回时,其返回值存放在栈区。 const定义的局部变量存放在栈区。 堆区(heap)堆区用于存放程序运行中被动态分布的内存段,可增可减。 可以有malloc等函数实现动态分布内存。 有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。 全局区(静态区)(static)内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。它主要存放静态数据(局部static变量,全局static变量)、全局变量。当程序结束后,变量由系统释放 。 常量区存放数字 和 常量字符串。当程序结束后,由系统释放 。 常量区的内容不可以被修改。 代码区存放函数体的二进制代码。 123456789101112131415161718192021222324//main.cpp#include <iostream>using namespace std;#include...
IIC
IIC1.IIC的地址问题 IIC中的器件地址DEV_ADDRESS是7位地址,但C语言中没有7bit的数据类型,所以你只能传uint8_t的数据进去。HAL库会把这个变量的高7位提取出来作为地址,根据实际情况对最后一个读写位set或reset。 通常数据手册在表述地址的时候,地址是在一个8位二进制数的低7位,比如6050就是0x68=0110 1000,但HAL库IIC传进去的地址在一个8位二进制数的高7位,就变成了0xD0(写)或者0xD1(读)这点要注意。 HAL库你在传地址的时候不需要自己考虑第8位是0还是1,它那个函数内部会自动根据你调用的是IIC读还是IIC写来对那一位进行运算。不过你要是非要传第8位已经写0或1的地址进去也行,因为运算结果不会变,只要你不写反就行了 2. IIC的数据传输IIC一般根据从机寄存器的位数来确定一次传几个字节的数据。通过以下函数中的 Size参数可以设定传输数据的字节数 12345HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,...
LVGL基础
LVGL基础1.对象(1)概述在 LVGL 中,用户界面的基本构建块是对象,也称为 Widgets。 例如 button、label、image。lsit….. 所有的对象都使用lv_obj_t这个类型的指针作为句柄(类似于C++中的Base),通过该指针来获取对象的各种信息 (2)对象的属性对象的属性包括:基本属性、特定属性 所有对象类型共享一些基本属性: 位置 尺寸 parent 样式 事件处理程序 等等 您可以使用 lv_obj_set_... 和 lv_obj_get_... 函数设置/获取这些属性 对象类型也有特殊的属性。例如,一个滑块有 最小值和最大值 当前值 对于这些特殊的属性,每个对象类型都可能有唯一的 API 函数。例如对于滑块 lv_slider_set_range(slider1, 0, 100); (3)工作机制父对象可以被视为其子对象的容器。每个对象只有一个父对象(屏幕除外),但一个父对象可以有任意数量的子对象。 如果父节点的位置发生变化,子节点将与父节点一起移动。...
gdb
gdbgdb是gcc工具链中的调试器,本身是个命令行的可执行程序,以往我们用vscode、Qt Creator调试程序的时候,底层用的都是gdb工具,不过这些IDE把他的数据给可视化了 1.gdb中常见指令启动与连接 命令 说明 gdb <executable> 启动GDB并加载可执行文件 gdb -p <pid> 附加到正在运行的进程 target remote :<port> 连接远程gdbserver(常用于嵌入式调试) target remote /dev/ttyUSB0 通过串口连接目标板(如ARM开发板) 断点与观察点 命令 说明 break <function> 在函数入口设断点(如 break main) break *<address> 在内存地址设断点(如 break *0x8000) break <file:line> 在指定文件的某一行设断点(如 break driver.c:42) watch...
01 系统移植概述
系统移植概述 所谓Linux系统的移植,就是让Linux在自己的嵌入式板子上跑起来。但是不像STM32上移植个FreeRTOS那么简单,移植Linux还是挺复杂的,不仅包含了OS本身,还要移植bootloader和rootfs 为了让Linux系统能够运行,只需保证组成Linux最小系统的那些部分都被移植了就行了,具体地,包括以下几点(具体作用见另一个文档): BootLoader:常见的有U-Boot,本质上就是一个裸机程序,用于初始化一些外设,然后将Linux内核从Flash拷贝到DDR启动,内核启动后U-Boot就结束运行了。就相当于PC上的BIOS Linux内核:这里需要的不是Linux内核源码,而是编译好的内核镜像 根文件系统:一个目录,包含了Linux运行必备的一些文件和程序 只要移植了这3部分,那么一个基础的Linux系统就能跑起来了,而Ubuntu那些的Linux发行版也包含了这几部分,并进行了一定的扩充。 各种配置文件在编译移植完的uboot、内核、根文件系统时,大致流程都是: 1.加载适配此板子的默认(default)配置文件:make...
06 input子系统
input子系统 在应用层对于input子系统的开发,其实就是:通过读取/dev/input/eventX设备文件,获取某个input设备的输入信息的过程 1.怎么看某个硬件设备对应input子系统下哪个event呢? 1cat /proc/bus/input/devices 看Handlers字段 2.应用层如何获取从input子系统的设备获取数据? 对/dev/input/eventX设备节点进行open()和read()系统调用 12345678910int fd = open("/dev/input/eventX",O_RDONLY);struct input_event ev;while(1){ if(read(fd,&ev,sizeof(struct input_event)) != sizeof(struct input_event)) { perror("error!"); exit(-1); ...







