Linux篇-kobj
1 概念kobj 是内核抽象出来的通用对象模型,用于表示内核中的实体. 结构体: https://elixir.bootlin.com/linux/v6.17.1/source/include/linux/kobject.h#L64. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// kobjstruct kobject { const char *name; // kobj 对象的名称, 跟 sys/<父 name>/<name> 一致 struct list_head entry; // 与父 kobj 建立链接的链表, 是父 kobj 的子链表 struct kobject *parent; // 指向父 kobj struct kset *kset; // 指向包含该 kobj 的 set 集合 const struct kobj_type *ktype;...
Grub篇(调试grub2)
1 调试grub21.1 编译 grub2首先从 https://cgit.git.savannah.gnu.org/cgit/grub.git 拉下压缩包. 1234# 在grub2安装目录下# --with-platform=efi 可以编译 UEFI 版本../configure --with-platform=pc --target=i386 --disable-werrormake -j$(nproc) 编译完成后,grub-core/ 下会有很多文件. 各种 *.mod 模块 kernel.exec(GRUB 核心可执行) 若干 .image / .img 文件 gdb_grub, 调试用脚本. 1.2 构建 img12# 创建一个空的磁盘镜像dd if=/dev/zero of=disk.img bs=1M count=256 建立分区并格式化. 123456789101112131415161718192021222324# 建立分区parted disk.img --script mklabel msdosparted...
Linux篇-open接口
1 过程全调试filp_open() 这里以 filp_open(“/dev/console”); 为例. file_open_name() AT_FDCWD 表示当前的工作目录. do_filp_open() path_openat() do_open() vfs_open() do_dentry_open() 取得f_op,这里为 def_chr_fops. f_op->open为 chrdev_open. chrdev_open 2 总结2.1 全过程调用 open 接口,通过 path walking 拿到 last component 的 inode,之后进入vfs_open,填充file结构体,如果file->f_op->open被填充就继续执行该设备层的open函数,否则返回。 随后在driver层继续通过 i_rdev 获取设备的信息,如果设备层的f_fop有open,函数,则继续执行驱动层的open. 2.2 基本概念 path walking: 内核要把这个 路径字符串 转换成一个 实际的对象...
Linux篇-调试linux
1 Linux篇(调试linux) 内核各个版本: https://www.kernel.org/pub/linux/kernel/ 最新主线版本: https://kernel.org/ 2 initrd制作此处我用的6.6.109版本. 1dracut -q --force -i ./package /my --add "busybox kernel-modules-extra kernel-modules rootfs-block" /tmp/bar.img 6.6.109 initrd/initramfs 本质上是一个压缩的rootfs镜像(通常是cpio格式),QEMU启动时用 -initrd 传给内核,内核会把它解压到内存里(ramfs/tmpfs),并把它临时挂载为根文件系统 /. 当内核完成自身初始化后,它必须进入用户态,去运行第一个用户进程(PID 1)。这个进程就从根文件系统里找。查找顺序大概是. 如果内核启动参数里写了 rdinit=,它会在 initrd...
virtio
1 概述VirtIO 是一个让”虚拟设备像真设备一样”工作的标准, 来宾系统里的驱动并不需要知道自己在虚拟机里, 它像给物理网卡/磁盘写驱动那样去用中断, DMA 等”常规手段”. 规范把每个 virtio 设备都拆成四个基本部件: 设备状态字段(Device Status) 特性位(feature bits) 设备配置空间(Device-specific Configuration Space) 一个或多个 virtqueue(队列) 1.1 设备状态位一组位标志, 描述”驱动与设备的握手/生命周期状态”. 驱动按顺序置这些位, 设备据此进入下一阶段. 12345678910111213ACKNOWLEDGE: 驱动已发现设备, 准备驱动它.DRIVER: 驱动已加载并能处理这个设备.FEATURES_OK: 特性协商完成.DRIVER_OK: 驱动已完成队列初始化, 设备可开始工作.NEEDS_RESET(设备置位): 设备出错, 需要驱动复位.FAILED: 驱动宣告失败(通常用于致命错误后停止).写 0...
behavior tree
1 概述安装. 12sudo apt updatesudo apt install ros-$ROS_DISTRO-behaviortree-cpp -y 行为树类似于有限状态机, 都是用来控制任务流程的. 不同的是, 行为树(BT)是由一串分层节点组成. 每次执行循环, 会向根节点发一个 tick, tick 会一路传到叶子节点. 任何被 tick 的节点都会运行自己的回调, 并返回三个状态之一, SUCCESS/FAILURE/RUNNING. 叶子节点是真正执行动作或做判断的地方, 最常见的叶子是 Action 节点. 1.1 节点的类型 ControlNode(控制节点): 有 1..N 个孩子, 按自己的规则把 tick 分发给孩子. ecoratorNode(装饰器节点):只能有 1 个孩子, 可以改变孩子的结果、重复执行孩子、或在条件不满足时阻止孩子被 tick. ConditionNode(条件)节点:不能返回 RUNNING, 只做判断,不改变系统状态. ActionNode(动作节点):真正“干活”, 可以是同步(一次 tick...
nav2_controller
1 概述1.1 Progress CheckerProgress_checker: 判断机器人在一段时间内是否真的在朝目标前进. 插件名 plugin...
nav2_planner
1 概述规划器服务器(Planner Server)负责处理规划器请求, 并托管插件实现的映射. 它会接收一个目标和一个要使用的规划器插件名称, 然后调用相应的插件来计算通往目标的路径. 它还托管全局成本图. 总得来说, 就是控制全局的导航路线. 2 参数解析默认示例. 12345678planner_server: # 负责调用规划插件 ros__parameters: expected_planner_frequency: 20.0 # 规划器运行的频率 costmap_update_timeout: 1.0 # 等待全局代价地图(global costmap)更新的超时时间 introspection_mode: "disabled" # disabled(关闭) read_only(只读) full(完全记录) planner_plugins: ['GridBased'] # 定义要加载的规划器插件列表, GridBased和下面的插件对应, 名字自己配置就行. GridBased: # 具体插件 ...
Diffdrive
1 概述以下为两轮差速机器人计算的相关公式. v: 机器人的线速度 w: 机器人的角速度 L: 两轮之间的距离 x: 机器人车体朝向在全局坐标系 x 轴的位置 y: 机器人车体朝向在全局坐标系 x 轴的位置 θ: 机器人车体朝向与全局坐标系 x 轴正方向的夹角 坐标系遵守右手法则: X轴指向前方, Y轴指向左方, Z轴指向上方. 2 运动学正解123456789v = ( v(R) + v(L) ) / 2w = ( v(R) + v(L) ) / Lx(t+1) = x(t) + v * cos(θ) * dtx(t+1) = x(t) + v * cos(θ) * dtθ(t+1) = θ(t) + w * dt 3 运动学逆解123v(R) = v + (L / 2) * w;v(R) = v - (L / 2) * w; 4 编码电机的计算 轮子的半径为 rd, 直径为 dl, 圆周率为 PI. 编码脉冲计数为 Tick, s 为 1 个 Ticks 轮子走过的距离, S 为经过 dt 时间后轮子走过的举例. 4.1...
DDS
DDS 通信示例1 概述ROS 2 默认中间件即 DDS(自动发现、无中心、UDP 传输), 你只需关心话题名、消息类型和 QoS. DDS 实现. 实现 常见 RMW 标识 备注 eProsima Fast DDS(旧称 Fast RTPS) rmw_fastrtps_cpp / rmw_fastrtps_dynamic_cpp 官方文档列为默认实现;各版均可用。([docs.ros.org][1]) Eclipse Cyclone DDS rmw_cyclonedds_cpp Galactic 中被选为默认,其余版本可选。([docs.ros.org][2]) RTI Connext DDS rmw_connextdds 专业版/付费为主;可选 RMW。([GitHub][3]) GurumDDS rmw_gurumdds_cpp 可选 RMW ADLINK OpenSplice(已停更) rmw_opensplice_cpp 早期支持,现已归档停用。([GitHub][4]) 各 ROS 2 版本的默认...