< >
Home » ROS2与STM32入门教程 » ROS2与STM32入门教程-stm32f407整合micro-ros方法

ROS2与STM32入门教程-stm32f407整合micro-ros方法

说明

  • 对于stm32F407芯片目前官方提供两种方法来整合micro-ros,一个例子是参考1,另一个例子参考2
  • 目录前面例子,我们已经做了说明,参考本专栏文章
  • 使用Ailibot驱动板套件测试
  • 环境: linux + openocd + vscode + stm32cubemx + gcc-arm-none-eabi

整合步骤

安装相关软件

# 安装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,如图:
    请输入图片描述

    1. 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,都已经配置好,可以直接生成代码
    1. 生成代码到目录 ~/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'
---

演示

  • 目前相关代码已经安装,演示编译,烧录和测试

请输入图片描述

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与stm32入门教程