Posts
CawDrive-[V2]复刻注意事项
手工贴片 驱动器有很多0402封装的器件,在使用针管挤锡膏时很容易挤出一大坨锡膏,如果锡膏太多,再焊接时零件可能会发生移动跟其他元器件粘连在一起。所以要控制每个焊盘锡膏的量。 开钢网刷锡膏:淘宝有开钢网比较便宜,这种方式效率比较高而且锡膏的量也比较合适 镊子或牙签:使用镊子或者牙签之类,粘上一些锡膏,然后涂在焊盘上,这种方式也可以控制锡膏的量 焊接 焊接可以通过电烙铁,热风枪或热焊台进行 可以通过刀头烙铁拖焊的形式先把主控芯片STM32F446RET6焊接到板子上,如果引脚连锡了可以挤一些助焊剂用刀头粘掉 在每个焊盘上都有锡膏,且元器件摆放好后,可以使用加热焊台进行加热,加热过程中如果发现元器件移位了,那可能是锡膏多了,可以使用镊子把元器件归位。 NMOS和DRV8323芯片底部都有散热焊盘,加热时可以使用镊子捅几下,如果芯片能够自动归位,引脚也会自动对齐。 焊接后检查所有芯片的引脚是否短接,可以用放大镜看,有短接的可以用刀头烙铁配合助焊剂把锡清理掉。 检查 在板子焊接完成后,可以用万用表检查电源接口正极于负极是否短路,检查5V和GND是否短路,检查3.3V与GND是否短路,当不存在短路的情况下可以上电,如果3.3V电源指示灯能够正常点亮,那么供电部分就没问题了。 注意事项 所有采样电路的分压电阻精度都是: 0.1% 贴片的时候注意下有10K的NTC电阻 SH1.0接口不要拿热风枪吹 5mΩ采样电阻焊盘为1210,可使用1206大小的电阻进行贴片
STM32H7使用串口DMA避坑指南
缓冲区设定 使用RAM_D2作为读写缓冲区配置 STM32H7 _ _ _ _ _ x_FLASH.ld配置 .dma_buffer : /* 冒号前有一个空格 */ { *(.dma_buffer) } >RAM_D2 然后在需要进行读写缓冲区的文件中添加以下定义: /// 这里通过宏定义来定义DMA_BUFFER /// __ICCARM__:表示 IAR EWARM 编译器 /// 所以如果是GCC的话就使用else块中的定义了 #if defined( __ICCARM__ ) #define DMA_BUFFER \ _Pragma("location=\".dma_buffer\"") #else #define DMA_BUFFER \ __attribute__((section(".dma_buffer"))) #endif #define BUFFER_SIZE 256 DMA_BUFFER uint8_t tx_buffer[BUFFER_SIZE]; static uint8_t tx_idx = 0; DMA_BUFFER uint8_t rx_buffer[BUFFER_SIZE]; 串口异常处理函数 如果不对串口异常进行处理,清理相关错误标记,可能无法继续执行中断函数 /// 错误码是定义如下 #define HAL_UART_ERROR_NONE (0x00000000U) /*!< No error */ #define HAL_UART_ERROR_PE (0x00000001U) /*!< Parity error */ #define HAL_UART_ERROR_NE (0x00000002U) /*!< Noise error */ #define HAL_UART_ERROR_FE (0x00000004U) /*!< Frame error */ #define HAL_UART_ERROR_ORE (0x00000008U) /*!< Overrun error */ #define HAL_UART_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ #define HAL_UART_ERROR_RTO (0x00000020U) /*!< Receiver Timeout error */ /// 下面错误处理函数中把奇偶校验错误以及数据溢出错误标志清除 /// 可以直接在调试时打断点查看huart->ErrorCode的值 void HAL_UART_ErrorCallback(UART_HandleTypeDef* huart) { if (huart->Instance == USART6) { __HAL_UART_CLEAR_OREFLAG(huart); __HAL_UART_CLEAR_PEFLAG(huart); huart->RxState = HAL_UART_STATE_READY; HAL_UARTEx_ReceiveToIdle_DMA(huart, rx_buffer, BUFFER_SIZE); __HAL_DMA_DISABLE_IT(&hdma_usart6_rx, DMA_IT_HT); } } 关闭半中断 在调用HAL_UARTEx_ReceiveToIdle_DMA函数时默认打开“半中断”,数据在接收到一半(左右)时会触发HAL_UARTEx_RxEventCallback回掉函数, 如果仅需要处理完整数据的可以在调用HAL_UARTEx_ReceiveToIdle_DMA函数后直接执行__HAL_DMA_DISABLE_IT(&hdma_usart6_rx, DMA_IT_HT);,即可关闭半中断 ...
行星减速器设计
现代机器人的一个核心部件就是就是关节电机,在关节电机中会用到减速器,行星减速器就是最常见的一种。 本文针对行星减速器的一种情况进行讲解:行星架固定,太阳轮作为输入,行星架作为输出。 基础概念 名称 描述 符号 齿数(Number of teeth) 齿轮齿的数量 Z 模数(Module) 决定齿大小的因数 M 直径 齿轮分度圆直径 D 上述关系可以表示为:\( D = M \times Z \) 这个公式在设计行星减速器时非常重要请牢记 要是两个齿轮啮合,它们必须拥有相同的模数(Module): $$ M_1 = M_2 \\ \therefore \frac{D_1}{Z_1} = \frac{D_2}{Z_2} \\ \therefore \frac{Z_2}{Z_1} = \frac{D_2}{D_1} = \frac{2R_2}{2R_1} = \frac{R_2}{R_1} $$行星减速器组件 名称 符号 太阳轮(Sun) S 行星轮(Planet) P 齿圈(Ring) R 行星架(Carrier) C 半径关系 $$ r_R = r_S + 2 r_P \\ 2 r_P = r_R - r_S $$ ...
windows系统vtk-v9.1.0使用Qt5.15.2自带mingw810_64进行编译
在windows中使用mingw编译vtk存在不少问题, 测试了几个高于vtk-v9.1.0的版本都存在一些问题导致无法正常编译, 本文记录下编译过程 相关资源下载地址 cmake-3.31.4-windows-x86_64.msi vtk-v9.1.0 VTK编译 & 安装 前置操作: 将Qt5.15.2中的mingw810_64的bin目录添加到系统环境变量中,并重启操作系统, 如: C:\Qt\Tools\mingw810_64\bin 打开C:\Qt\Tools\mingw810_64\x86_64-w64-mingw32\include\winerror.h文件搜索ERROR_INCORRECT_SIZE __MSABI_LONG, 查看该定义下面是否有以下定义, 没有的话加上: #define ERROR_SYMLINK_CLASS_DISABLED 1463 #define ERROR_SYMLINK_NOT_SUPPORTED 1464 #define ERROR_XML_PARSE_ERROR 1465 #define ERROR_XMLDSIG_ERROR 1466 #define ERROR_RESTART_APPLICATION 1467 #define ERROR_WRONG_COMPARTMENT 1468 #define ERROR_AUTHIP_FAILURE 1469 #define ERROR_NO_NVRAM_RESOURCES 1470 下载并安装cmake 下载并解压vtk-v9.1.0 进入vtk-v9.1.0目录下创建build文件夹 打开cmake-gui对vtk-v9.1.0进行配置 设置源码和编译路径 点击Configure按钮, 选择MinGW Makefiles, 然后点击Finish 需要等待CMake进行一些配置, 然后会出现一些新的选项, 下面是一些我们要配置的选项, 先选中界面上的Advanced复选框: Name Value 描述 CMAKE_CXX_FLAGS -fcommon - CMAKE_C_FLAGS -fcommon - CMAKE_BUILD_TYPE Release 以Release的模式进行编译 CMAKE_INSTALL_PREFIX C:\Library\VTK 执行make install时的安装路径 VTK_GROUP_ENABLE_Qt YES 使能Qt选项 ...
配置IsaacLab环境
IsaacLab本地安装的方式有两种 通过PIP安装 二进制安装 本次课程将使用二进制安装 安装要求 系统要求 Element Minimum Spec Good Ideal OS Ubuntu 20.04/22.04、Windows 10/11 Ubuntu 20.04/22.04、Windows 10/11 Ubuntu 20.04/22.04、Windows 10/11 CPU Intel Core i7 (7th Generation)、AMD Ryzen 5 Intel Core i7 (9th Generation)、AMD Ryzen 7 Intel Core i9, X-series or higher、AMD Ryzen 9, Threadripper or higher Cores 4 8 16 RAM 32GB* 64GB* 64GB* Storage 50GB SSD 500GB SSD 1TB NVMe SSD GPU GeForce RTX 3070 GeForce RTX 4080 RTX Ada 6000 VRAM 8GB* 16GB* 48GB* 本机配置 描述 地址 显卡 RTX 3080 Ti 操作系统 PopOS(一款基于Ubuntu的操作系统) https://pop.system76.com IsaacSim 4.2.0 https://developer.nvidia.com/omniverse#section-getting-started IsaacLab 最新的main分支 https://github.com/isaac-sim/IsaacLab Anaconda Anaconda3-2024.10-1-Linux-x86_64 https://docs.anaconda.com/anaconda/install 🎉 开始安装! 1. Anaconda安装(Linux) # 安装依赖 sudo apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6 # 下载 & 安装anaconda curl -O https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh bash ~/Anaconda3-2024.10-1-Linux-x86_64.sh # 刷新环境变量 source ~/.zshrc # 或source ~/.bashrc 2. 安装Omniverse Launcher # 下载Omniverse Launcher wget https://install.launcher.omniverse.nvidia.com/installers/omniverse-launcher-linux.AppImage # 添加可执行权限 chmod +x omniverse-launcher-linux.AppImage # 运行 ./omniverse-launcher-linux.AppImage 运行后出现如下界面,然后输入邮箱账号登陆(没注册过的需要先注册) ...
Rust嵌入式开发embassy环境搭建
先配置Rust开发STM32所需的环境,文章地址: https://fake-rick.github.io/posts/rust%E9%85%8D%E7%BD%AEstm32%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/ 安装项目创建CLI工具 cargo install cargo-embassy 生成项目 cargo embassy init my_project --chip stm32f407vgtx 在Cargo.toml中[dependencies]添加: embassy-stm32 = { version = "0.1.0", features = ["defmt", "stm32f407vg", "unstable-pac", "memory-x", "time-driver-any", "exti", "chrono"] } Embed.toml文件 # This file was automatically generated. [default.general] chip = "STM32F407VGTx" [default.reset] halt_afterwards = false [default.rtt] enabled = true [default.gdb] enabled = false 运行 cargo run 如果在终端出现以下内容则表示运行成功:
Rust配置STM32嵌入式开发环境
安装 安装cargo工具 cargo install cargo-generate 安装stlink v2驱动 sudo apt-get install git make cmake libusb-1.0-0-dev sudo apt-get install gcc build-essential git clone https://github.com/stlink-org/stlink.git cd stlink/ mkdir build cd build cmake .. make cd bin/ sudo cp st-* /usr/local/bin cd ../lib/ sudo cp *.so* /lib32 cd ../../ sudo cp config/udev/rules.d/49-stlinkv* /etc/udev/rules.d/ 安装烧录和调试的工具 Linux, macOS curl --proto '=https' --tlsv1.2 -LsSf https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.sh | sh WIndows irm https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.ps1 | iex 安装适用于ARM Cortex-M目标的rust-std组件 rustup target add thumbv6m-none-eabi thumbv7m-none-eabi thumbv7em-none-eabi thumbv7em-none-eabihf ...
IsaacLab创建直接工作流RL环境
原文地址:https://isaac-sim.github.io/IsaacLab/source/tutorials/03_envs/create_direct_rl_env.html 从环境中获取信息(观察) 获取joint(铰链)信息:位置和速度 joint会被包含在Articulation(关节)中,一个Articulation可能会包含1个或多个的joint对象,可以通过Articulation.find_joints()方法获得joint在当前Articulation中的索引(index)数据。 find_joints的返回值是这样的:tuple[list[joint索引], list[joint名字]] find_joints的函数声明如下: def find_joints( self, name_keys: str | Sequence[str], joint_subset: list[str] | None = None, preserve_order: bool = False ) -> tuple[list[int], list[str]] 在Articulation内部有一个属性私有变量_data: ArticulationData,该变量通过方法def data(self) -> ArticulationData获取,在ArticulationData中存放着几个关节重要的数据:位置ArticulationData._joint_pos,速度ArticulationData._joint_vel,加速度ArticulationData._joint_acc 在ArticulationData有几个@property装饰器函数,用于获取上述的三个属性,这样可以用过属性名的方式直接访问到这些数据。 下面介绍下这三个方法的返回值: joint_pos返回torch.Size([num_instances, num_joints]) joint_vel返回torch.Size([num_instances, num_joints]) joint_acc返回torch.Size([num_instances, num_joints]) 是时候讲解下DirectRLEnv(gym.Env)._get_observations(self) -> VecEnvObs方法了,该方法带有@abstractmethod被定义成抽象方法,所以我们在继承DirectRLEnv类后必须在自己的类中实现_get_observations方法。 我们在_get_observations方法中计算并返回观测值,这会用到上面提到的ArticulationData以及如何通过joint索引从中获取实际数据。 在cartpole_env.py的代码中有如下实现: def _get_observations(self) -> torch.Dict[str, torch.Tensor | torch.Dict[str, torch.Tensor]]: obs = torch.cat( ( self.joint_pos[:, self._pole_dof_idx[0]].unsqueeze(dim=1), self.joint_vel[:, self._pole_dof_idx[0]].unsqueeze(dim=1), self.joint_pos[:, self._cart_dof_idx[0]].unsqueeze(dim=1), self.joint_vel[:, self._cart_dof_idx[0]].unsqueeze(dim=1), ), dim=-1, ) observations = {"policy": obs} return observations 上述代码中的_pole_dof_idx里边存放的是杆子的joint对应的索引数据,_cart_dof_idx存放的是小车的joint对应的索引数据,这里介绍下获取杆子位置的代码,获取杆子速度和小车位置和速度的代码都一样。 ...
Park变换
Park变换 Park变换的目的是将Clark变换后的αβ坐标系转换成d,q旋转坐标系。d轴方向与转子磁链方向重合,所以d轴也叫直轴。q轴方向与转子磁链方向垂直,所以q轴又叫交轴。 旋转矩阵是什么? ⊿abo: $ob = oa\times \cos(\theta)$ 已知:bc = ad $$ \because \angle pad + \angle pab = 90°\\ \angle oab + \angle pab = 90°\\ \therefore \angle oab = \angle pad\\ \angle aob = \angle apd = \angle \theta $$⊿adp: $ad = ap \times \sin(\theta)$ $$ \because oc = ob + bc \\ \therefore oc = oa \times \cos(\theta) + ap \times \sin(\theta) $$所以向量p到d轴的投影为:$oa \times \cos(\theta) + ap \times \sin(\theta)$ ...