ROS2与STM32入门教程-stm32f407整合micro-ros方法
说明
- 对于stm32F407芯片目前官方提供两种方法来整合micro-ros,一个例子是参考1,另一个例子参考2
- 目录前面例子,我们已经做了说明,参考本专栏文章
- 使用Ailibot驱动板套件测试
- 环境: linux + openocd + vscode + stm32cubemx + gcc-arm-none-eabi
整合步骤
安装相关软件
安装micro_ros_stm32cubemx_utils
# 安装rcm
curl -k https://www.ncnynl.com/rcm.sh | bash -
# 安装代码
rcm ros2_stm32 install_micro_ros_utils
- 这一步会自动在用户根目录下构建一个项目名为project_micro_ros目录,micro_ros_stm32cubemx_utils下载到此目录下
stm32cubemx配置
参考micro_ros_stm32cubemx_utils下的sample_project.ioc,我们制作了基于stm32F407的版本
利用stm32cubemx打开project_micro_ros目录下project_micro_ros.ioc
1.也可以根据自己的实际情况配置芯片,使用的串口,时钟,GPIO等
2.Project Manager -> Project下,选择toolchain使用
Makefile
3.中间件使用FreeRTOS,task项下的stack zise需要大于10 kB,输入3000,如图:
- Transport配置, 激活U(S)ART带有DMA
选择的USART激活DMA
设置DMA priotity to Very High for Tx and Rx
设置 DMA mode to Circular for Rx 如图:
- 设置 enable global interrupt under NVIC Settings
- project_micro_ros.ioc文件中的上面1-4,都已经配置好,可以直接生成代码
- 生成代码到目录 ~/project_micro_ros/下,跟project_micro_ros.ioc一起
配置代码
- 1.先编译下原始代码,确认成功
cd ~/project_micro_ros/
make
- 一般stm32cubemx生成的代码直接make不会报错
- 2.修改Makefile文件,增加micro_ros相关部分
- 通过比较App/Makefile.in文件和生成的Makefile了解添加的内容
- 也可以复制App/Makefile.in到项目目录下,更改名称为Makefile
生成micro_ros静态库
- 使用我们重做的docker镜像,官方的镜像针对国内环境不能正常使用
# 进入项目根根目录
cd ~/project_micro_ros/
# 拉取镜像
docker pull microros/micro_ros_static_library_builder:galactic
# 生成静态库
docker run -it --rm -v $(pwd):/project --env MICROROS_LIBRARY_FOLDER=micro_ros_stm32cubemx_utils/microros_static_library ncnynl/micro_ros_static_library_builder:galactic
- 这一步使用docker来完成,需要根据自己的ros2版本来修改,目前测试使用galactic版本
- 会自动根据Makefile文件相关内容来生成对应目录的静态库,位于
micro_ros_stm32cubemx_utils/microros_static_library/libmicroros/libmicroros.a
修改freertos.c入口文件
- 编辑freertos.c文件,增加micro-ros部分
- 通过比较App/freertos.c.in和Src/freertos.c文件,把差异部分添加到新生成的Src/freertos.c
- 正常应该也可以复制freertos.c.in到Src重名为freertos.c
编译最终代码
- 再次编译,确认需要的库能正常
cd ~/project_micro_ros/
make
测试代码
- 烧录代码
cd ~/project_micro_ros/
#编译
make
#烧录
make stflash
测试
- 假设你的stm32F407板子的usb端口为/dev/ttyUSB0
- 下载镜像
# 下载镜像
docker pull microros/micro-ros-agent:galactic
- 运行客户端
# 运行micro-ros-agent
./scripts/agent.sh
- 效果如下:
ubuntu@AiROS2-NUC:~/project_micro_ros$ ./scripts/agent.sh
[1694600164.625099] info | TermiosAgentLinux.cpp | init | running... | fd: 3
[1694600164.625443] info | Root.cpp | set_verbose_level | logger setup | verbose_level: 6
[1694600164.972114] info | Root.cpp | create_client | create | client_key: 0x788473F1, session_id: 0x81
[1694600164.972264] info | SessionManager.hpp | establish_session | session established | client_key: 0x788473F1, address: 0
[1694600164.972514] debug | SerialAgentLinux.cpp | send_message | [** <<SER>> **] | client_key: 0x788473F1, len: 19, data:
0000: 81 00 00 00 04 01 0B 00 00 00 58 52 43 45 01 00 01 0F 00
[1694600164.975068] debug | SerialAgentLinux.cpp | recv_message | [==>> SER <<==] | client_key: 0x788473F1, len: 13, data:
0000: 81 00 00 00 0A 01 05 00 00 00 00 01 80
[1694600164.978268] debug | SerialAgentLinux.cpp | recv_message | [==>> SER <<==] | client_key: 0x788473F1, len: 13, data:
0000: 81 00 00 00 0A 01 05 00 00 00 00 01 80
[1694600164.978323] debug | SerialAgentLinux.cpp | recv_message | [==>> SER <<==] | client_key: 0x788473F1, len: 13, data:
0000: 81 00 00 00 0A 01 05 00 00 00 00 01 80
[1694600164.981401] debug | SerialAgentLinux.cpp | recv_message | [==>> SER <<==]
- 打印话题
# 打印话题
ros2 topic list
ros2 topic echo /microROS/ping
- 效果如下:
ubuntu@AiROS2-NUC:~/tools$ ros2 topic echo /microROS/ping
stamp:
sec: 685
nanosec: 341000000
frame_id: '60110828_1003779084'
---
stamp:
sec: 687
nanosec: 333000000
frame_id: '658006887_1003779084'
---
stamp:
sec: 689
nanosec: 341000000
frame_id: '912239057_1003779084'
---
stamp:
sec: 691
nanosec: 324000000
frame_id: '285802368_1003779084'
---
演示
- 目前相关代码已经安装,演示编译,烧录和测试
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号