小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
[教程]自动化编译microROS的github仓库
-
接前文:https://fishros.org.cn/forum/topic/2085/自动化编译microros的github仓库?_=1705806395279
仓库链接:https://github.com/ganyuanzhen/microROSF407BinrayBuilder
STM32 系列芯片 microROS 自动化编译库
这个repo可以帮助大家使用
Github Actions
来自动化编译microROS
库。不再需要在本地搭建Docker
编译环境!目录结构
repo ├── Core ├── Drivers ├── micro_ros_stm32cubemx_utils └── Middlewares
其中,
Core
,Drivers
, 和Middlewares
都是由CubeMX
自动化生成的。而micro_ros_stm32cubemx_utils
则是microROS的核心库,我们之后编译的静态库就是基于这个的。使用方法
0. fork 并 克隆本仓库
但是,克隆下来的仓库是根据我的需求配置的,不符合你的需求,需要按照下面的步骤修改哦~
1. 获取
microROS
代码由于
microROS
代码是区分ROS2
的版本的,因此需要根据你的需求选择不同的版本。仓库地址为:https://github.com/micro-ROS/micro_ros_stm32cubemx_utils
注意不要直接克隆,下载压缩包就可以了!
用你下载下来的版本替换本仓库中的
micro_ros_stm32cubemx_utils
文件夹。注意要保持文件夹名字相同!2. 修改
.ioc
文件并生成代码这里需要根据你的芯片型号来修改
.ioc
文件。在修改和重新生成代码的过程中,需要注意一下几点:1. 使用
FreeRTOS
中间件,microROS
需要使用FreeRTOS
作为中间件,因此需要修改.ioc
文件,将FreeRTOS
中间件添加到 项目中。2. 修改
FreeRTOS
中的Stack Size
microROS
需要大于10kb
的Stack Size
,因此需要修改FreeRTOS
中的Stack Size
。具体配置选项在
FreeRTOS
->Tasks and Queues
中,双击defaultTask
进行修改。3. 按需要设置通信协议,比如使用
USART + DMA
- 初始化USART并启用其DMA请求功能。
- 创建并配置两个DMA通道,一个用于Tx(传输),一个用于Rx(接收)。
- 对于每个DMA通道,将优先级设置为非常高(DMA_PRIORITY_VERY_HIGH)。
- 对于Rx通道,将其配置为循环模式(DMA_CIRCULAR)。
- 开启串口的
UARTx global interrupt
4. 在
Project Manager
选项卡中,配置Toolchain
为Makefile
5. 生成代码,注意
.ioc
的保存位置是否正确。6. 如果第一步复制好的文件夹不见了,请再复制一遍。
3. 修改
microROS
生成脚本1. 修改
Makefile
在
Makefile
中找到build the application
部分,在上方插入以下内容:####################################### # micro-ROS addons ####################################### LDFLAGS += micro_ros_stm32cubemx_utils/microros_static_library/libmicroros/libmicroros.a C_INCLUDES += -Imicro_ros_stm32cubemx_utils/microros_static_library/libmicroros/microros_include # Add micro-ROS utils C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/custom_memory_manager.c C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_allocators.c C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_time.c # Set here the custom transport implementation C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_transports/dma_transport.c print_cflags: @echo $(CFLAGS)
注意,
@echo $(CFLAGS)
前面的是tab
而不是空格,如果复制下来是空格,请手动修改为tab
。2. 修改
library_generation.sh
默认的编译脚本是需要人机交互的,我们将其去掉以实现自动编译。
打开
micro_ros_stm32cubemx_utils\microros_static_library\library_generation\library_generation.sh
文件,按照如下方式修改:将:
if [ $RET_CODE = "0" ]; then echo "Found CFLAGS:" echo "-------------" echo $RET_CFLAGS echo "-------------" read -p "Do you want to continue with them? (y/n)" -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]] then echo "Continuing..." else echo "Aborting" exit 0; fi else echo "Please read README.md to update your Makefile" exit 1; fi
修改为:
if [ $RET_CODE = "0" ]; then echo "Found CFLAGS:" echo "-------------" echo $RET_CFLAGS echo "-------------" # read -p "Do you want to continue with them? (y/n)" -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]] then echo "Continuing..." else echo "Aborting"; # exit 0; fi else echo "Please read README.md to update your Makefile" exit 1; fi
修改前后差异如下:
3. 将代码推送到
GitHub
4. 开始编译
1. 配置权限
Github 默认是不允许在Actions中读写仓库的,我们需要先配置一下权限,让它可以上传Release。
-
首先前往 Settings 界面
-
然后,前往 Actions -> General
-
在页面下方,选择
Read and write permissions
选项
2. 开始编译
- 前往你的仓库的
Actions
页面,点击 左边的CI
按钮,再点击右边的Run worlflow
就可以开始编译了!。
- 编译完成后的结果,可以在仓库的
Release
页面直接下载。
-
大佬,问一下 你这个用在repo之后 是不是就不用执行 docker run -it --rm -v $(pwd):/project --env MICROROS_LIBRARY_FOLDER=micro_ros_stm32cubemx_utils/microros_static_library microros/micro_ros_static_library_builder:foxy 这一条命令了 最近我也在研究这个,我主要是foxy的版本 在执行这个命令的时候没有编译 ,和docker有关导致无法搞下去了, 你那边有没有foxy的版本 能不能留个联系方式,我想请教几个问题 很简单的问题 很多我基本都已经跑通了,只有一些小问题不知道怎么去做,麻烦大佬了
-
-
@472795832 我也是最近才在用STM32版本哈哈(^_^)
-
@ganyuanzhen 关注你很久了 ,我的芯片也是STM32F407VET6的,我现在就是卡在docker编译这里,搞得很难受,我看你的提示似乎没有配置RCC
-
@ganyuanzhen 这是为啥?因为我把我下的micro_ros_stm32cubemx_utils_build.tar这个文件解包了导致的吗,我需要原压缩文件直接上传吗?
-
我的抬头就是我的QQ号,可以私下交流一下吗?
-
用你的代码git clone下来 然后重新建一个库 也没编译过
-
@472795832 哈哈,我的问题,教程里少了一个配置Git仓库权限的步骤。少了这个步骤,就没法上传到Release
我这就去补上
-
@472795832 编译这个库,似乎不需要配置外部晶振也可以编译。不过最好还是都配置好再进行编译,避免不确定性嘛。