001 基本概念
基本概念节点定义:每个节点负责一个单独的模块化的功能,本质上就是一个进程,也是可执行文件 节点之间的通信方式 话题、服务、动作、参数 CLI工具运行一个节点 ros2 run <功能包名字> <可执行文件名> 查看节点列表 ros2 node list 查看节点信息 ros2 node info <node_name> 运行时重映射节点名称 ros2 run <pkd> <node_name> --ros-args --remap __node=:xxxx 功能包定义:实现一个功能可能需要多个节点,ROS将实现某功能的多个节点看成一个功能包 功能包的手动编译有3种方式: ament_python(python) ament_cmake(ROS2定义的一系列CMake函数) cmake 手动编译的功能包一般需要手动source工作空间的install目录 除了手动编译,也可直接下载开源功能包: sudo apt install...
002 节点间的通信
节点间的通信发布-订阅模式注意事项1.发布、订阅的接口类型要相同,比如都是字符串类型的 2.发布者和订阅者可以是1对n、n对n、n对1的 可视化rqt_gragh可以可视化目前所有节点 topic常用指令1.返回系统当前所有topic ros2 topic list 2..返回系统当前所有topic及其数据类型 ros2 topic list -t 3.打印实时话题信息 ros2 topic echo /<话题name> 4.查看话题信息:发布者和订阅者个数、数据类型 ros2 topic info /<话题name> 5.查看消息具体内容 ros2 interface show <消息类型> 6.手动发送话题信息 ros2 topic pub <数据类型> <具体数据> CPP实现订阅者节点具体步骤: 1.导入消息的类型,如std_msgs/msg/string.hpp 2.创建订阅者 3.创建订阅的回调函数
004 常用工具
常用工具Launch作用:通过Launch工具,我们可以同时启动多个节点,并且给节点传递参数 开发方式有3种开发方式,分别是用python、xml和yaml文件 使用方式参考:1.启动管理工具-Launch编写脚本 1ros2 launch <pkg> xxx.py colconcolcon就是ros2中用来编译功能包的工具(ros1中是catkin)简单来说,colcon是cmake的更高级的封装: 程序在cmake编译是这样的流程:cmake指令依据你的CMakeLists.txt 文件,生成makefiles文件,make再依据此makefiles文件编译链接生成可执行文件 colcon是将cmake与make的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径,它会自动生成install和build和log文件夹 123456789# 在一个CMake项目里 mkdir build cd build cmake .. make make install # # 使用colconcolcon build ...
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)工作机制父对象可以被视为其子对象的容器。每个对象只有一个父对象(屏幕除外),但一个父对象可以有任意数量的子对象。 如果父节点的位置发生变化,子节点将与父节点一起移动。...







