鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    STM32系列MICROROS环境配置(更新 使用cmake管理)

    已定时 已固定 已锁定 已移动
    MicroROS
    micro-ros microros
    1
    1
    19
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 24758873092
      Mona Darling
      最后由 编辑

      更新:更加自由的构建STM32 Microros静态库的方法(适用于linux X86 arm64本文只讲述x86,arm64流程一致,不过需要将arm64系统中的编译器补全部分库即可)

      一.使用 micro_ros_setup 生成Microros静态链接库

      Ubuntu x86环境:前提 ,需要下载交叉编译器,若已安装可以跳过

      sudo apt-get install -y gcc-arm-none-eabi
      

      下面为从创建工作空间到生成静态库的所有命令,一步一步运行即可:

      source /opt/ros/$ROS_DISTRO/setup.bash
      mkdir uros_ws && cd uros_ws
      git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup
      #若不能使用rosdep,可以使用rosdepc
      rosdep update && rosdep install --from-paths src --ignore-src -y
      colcon build
      source install/local_setup.bash
      ros2 run micro_ros_setup create_firmware_ws.sh generate_lib generic
      

      407d70c5-db3b-4400-bda3-a1878d5cde9d-image.png
      到此,基础构建完成目录如上图所示,但还需要配置两个配置文件 toolchain.cmake和colcon.meta才能生成静态链接库
      toolchain.cmake配置如下

      set(CMAKE_SYSTEM_NAME Generic)
      set(CMAKE_CROSSCOMPILING 1)
      set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
      
      # SET HERE THE PATH TO YOUR C99 AND C++ COMPILERS
      # 在这里添加编译器路径
      set(PIX arm-none-eabi-)
      set(CMAKE_C_COMPILER ${PIX}gcc)
      set(CMAKE_CXX_COMPILER ${PIX}g++)
      
      set(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "")
      set(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "")
      
      # SET HERE YOUR BUILDING FLAGS
      set(FLAGS "-O2 -ffunction-sections -fdata-sections -fno-exceptions -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -nostdlib -mthumb --param max-inline-insns-single=500 -D'RCUTILS_LOG_MIN_SEVERITY=RCUTILS_LOG_MIN_SEVERITY_NONE'" CACHE STRING "" FORCE)
      #-mcpu=cortex-m3 改成 -mcpu=cortex-m7   这里根据stm32内核更替
      #  加入 mfpu=fpv5-d16 -mfloat-abi=hard 支持硬件浮点编译  这里根据stm32内核更替
      set(CMAKE_C_FLAGS_INIT "-std=c11 ${FLAGS} -DCLOCK_MONOTONIC=0 -D'__attribute__(x)='" CACHE STRING "" FORCE)
      set(CMAKE_CXX_FLAGS_INIT "-std=c++11 ${FLAGS} -fno-rtti -DCLOCK_MONOTONIC=0 -D'__attribute__(x)='" CACHE STRING "" FORCE)
      set(__BIG_ENDIAN__ 0)
      

      注意:在toolchain.cmake中的 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard 部分最好根据生成的工程中cmake配置文件保持一致,此配置对stm32同意系列生效(一般同一系列内核保持一致,例如F1系列内核为M3,F4系列内核为M4)如下图所示

      af7fe6b2-584e-490e-b35d-710339e9d790-image.png

      colcon.meta配置如下,此配置摘抄自 micro_ros_stm32cubemx_utils 配置文件如下图所示路径

      e4d5e2d0-7792-41c4-b111-9976e12f4707-image.png

      {
          "names": {
              "tracetools": {
                  "cmake-args": [
                      "-DTRACETOOLS_DISABLED=ON",
                      "-DTRACETOOLS_STATUS_CHECKING_TOOL=OFF"
                  ]
              },
              "rosidl_typesupport": {
                  "cmake-args": [
                      "-DROSIDL_TYPESUPPORT_SINGLE_TYPESUPPORT=ON"
                  ]
              },
              "rcl": {
                  "cmake-args": [
                      "-DBUILD_TESTING=OFF",
                      "-DRCL_COMMAND_LINE_ENABLED=OFF",
                      "-DRCL_LOGGING_ENABLED=OFF"
                  ]
              }, 
              "rcutils": {
                  "cmake-args": [
                      "-DENABLE_TESTING=OFF",
                      "-DRCUTILS_NO_FILESYSTEM=ON",
                      "-DRCUTILS_NO_THREAD_SUPPORT=ON",
                      "-DRCUTILS_NO_64_ATOMIC=ON",
                      "-DRCUTILS_AVOID_DYNAMIC_ALLOCATION=ON"
                  ]
              },
              "microxrcedds_client": {
                  "cmake-args": [
                      "-DUCLIENT_PIC=OFF",
                      "-DUCLIENT_PROFILE_UDP=OFF",
                      "-DUCLIENT_PROFILE_TCP=OFF",
                      "-DUCLIENT_PROFILE_DISCOVERY=OFF",
                      "-DUCLIENT_PROFILE_SERIAL=OFF",
                      "-UCLIENT_PROFILE_STREAM_FRAMING=ON",
                      "-DUCLIENT_PROFILE_CUSTOM_TRANSPORT=ON"
                  ]
              },
              "rmw_microxrcedds": {
                  "cmake-args": [
                      "-DRMW_UXRCE_MAX_NODES=1",
                      "-DRMW_UXRCE_MAX_PUBLISHERS=10",
                      "-DRMW_UXRCE_MAX_SUBSCRIPTIONS=5",
                      "-DRMW_UXRCE_MAX_SERVICES=1",
                      "-DRMW_UXRCE_MAX_CLIENTS=1",
                      "-DRMW_UXRCE_MAX_HISTORY=4",
                      "-DRMW_UXRCE_TRANSPORT=custom"
                  ]
              }
          }
      }
      

      上述两个文件(toolchain.cmake colcon.meta)放入如下图所示的路径中 ~/uros_ws/firmware/mcu_ws
      88c1c1d3-f1cd-4ef9-9817-28c3b1ef1f01-image.png
      最后编译静态库

      ros2 run micro_ros_setup build_firmware.sh $(pwd)/firmware/mcu_ws/toolchain.cmake $(pwd)/firmware/mcu_ws/colcon.meta
      

      最后生成文件在firmware/build目录下,如下图所示

      b59283e9-50de-46aa-b7ab-0a0d87a258ef-image.png
      将inclue目录和静态库文件移植到stm32工程文件中即可使用

      二.使用静态库文件

      STM32方面配置可参考我上篇文章进行配置STM32配置流程只需注意最后生成工程选择cmake即可(cubemx可能需要更新到最新才有此选项)

      6e4a20bd-4db6-4067-b0cc-ff323fb5cdf8-image.png

      在STM32 CMakeLists.txt文件中需要加入以下内容
      编译C文件

      • custom_memory_manager.c
      • microros_allocators.c
      • microros_time.c
      • microros_transports/dma_transport.c
        如下图所示
        67577c43-4754-489a-9201-03ce9bd6270d-image.png
      set(extera_source 
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/custom_memory_manager.c
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/microros_allocators.c
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/microros_time.c
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/microros_transports/dma_transport.c
      
      )
      

      并在如下图位置加入即可
      cbbba782-a7db-42e5-8a37-b21c8c1aa48b-image.png
      添加静态库文件

      • libmicroros.a
      set(THIRD_PARTY_LIB "${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/lib/libmicroros.a")
      

      并在如下图位置加入即可
      368ae08c-5295-44ae-b79a-04b857ef7a0d-image.png

      cmake内容如下,但由于该工程有其他库内容,读者只需看个模板即可,具体内容还是根据读者工程目录进行修改

      cmake_minimum_required(VERSION 3.22)
      
      #
      # This file is generated only once,
      # and is not re-generated if converter is called multiple times.
      #
      # User is free to modify the file as much as necessary
      #
      
      # Setup compiler settings
      set(CMAKE_C_STANDARD 11)
      set(CMAKE_C_STANDARD_REQUIRED ON)
      set(CMAKE_C_EXTENSIONS ON)
      
      
      # Define the build type
      if(NOT CMAKE_BUILD_TYPE)
          set(CMAKE_BUILD_TYPE "Debug")
      endif()
      
      # Set the project name
      set(CMAKE_PROJECT_NAME MicroROSF4_Cmake)
      
      # Include toolchain file
      include("cmake/gcc-arm-none-eabi.cmake")
      
      
      
      # Enable compile command to ease indexing with e.g. clangd
      set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
      
      # Core project settings
      project(${CMAKE_PROJECT_NAME})
      message("Build type: " ${CMAKE_BUILD_TYPE})
      
      # Enable CMake support for ASM and C languages
      enable_language(C ASM)
      
      # Create an executable object type
      add_executable(${CMAKE_PROJECT_NAME})
      
      # Add STM32CubeMX generated sources
      add_subdirectory(cmake/stm32cubemx)
      
      # Link directories setup
      target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
          # Add user defined library search paths
      )
      
      
      
        #
        #  3rd-party  lib start
        #
        #
      
      set(THIRD_PARTY_LIB "${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/lib/libmicroros.a")
      set(extera_source_control
              ${PROJECT_SOURCE_DIR}/Third-party/control/Src/control.c
              ${PROJECT_SOURCE_DIR}/Third-party/control/Src/Encoder.c
              ${PROJECT_SOURCE_DIR}/Third-party/oled/Src/I2C_Fun.c
              ${PROJECT_SOURCE_DIR}/Third-party/imu/Src/ICM20948.c
              ${PROJECT_SOURCE_DIR}/Third-party/oled/Src/oled.c
              ${PROJECT_SOURCE_DIR}/Third-party/delay/Src/Delay.c
              ${PROJECT_SOURCE_DIR}/Third-party/robot_sys/Src/sys_struct.c
              ${PROJECT_SOURCE_DIR}/Third-party/MadgwickAHRS/Src/MadgwickAHRS.c
      )
      
      
      set(extera_source 
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/custom_memory_manager.c
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/microros_allocators.c
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/microros_time.c
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Src/microros_transports/dma_transport.c
      
      )
      
      
      message(STATUS "dir  is = ${PROJECT_SOURCE_DIR}")
      
      add_library(LibMicroros_app   
      ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microrosapp/Src/microrosclass_agent.cpp
      )
      
      target_include_directories(LibMicroros_app PRIVATE
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Inc/microros_include
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microrosapp/Inc
      )
      target_sources(LibMicroros_app PRIVATE
          # Add user sources here
              ${extera_source}
              Third-party/Lib_Microrosapp/Src/microros_class.cpp
      )
      
      target_link_libraries(LibMicroros_app PRIVATE 
              stm32cubemx
              ${THIRD_PARTY_LIB}
      
      )
        #
        #  3rd-party lib end
        #
        #
      
      # Add sources to executable
      target_sources(${CMAKE_PROJECT_NAME} PRIVATE
          # Add user sources here
          ${extera_source}
          ${extera_source_control}
      )
      
      # Add include paths
      target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
          # Add user defined include paths
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microros/Inc/microros_include
              ${PROJECT_SOURCE_DIR}/Third-party/Lib_Microrosapp/Inc
              ${PROJECT_SOURCE_DIR}/Third-party/MadgwickAHRS/Inc
              ${PROJECT_SOURCE_DIR}/Third-party/control/Inc
              ${PROJECT_SOURCE_DIR}/Third-party/oled/Inc
              ${PROJECT_SOURCE_DIR}/Third-party/imu/Inc
              ${PROJECT_SOURCE_DIR}/Third-party/robot_sys/Inc
              ${PROJECT_SOURCE_DIR}/Third-party/delay/Inc
      )
      # Add project symbols (macros)
      target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
          # Add user defined symbols
      )
      
      # Add linked libraries
      target_link_libraries(${CMAKE_PROJECT_NAME}
          stm32cubemx
          # Add user defined libraries
          LibMicroros_app                 # 自己生成的静态库
          ${THIRD_PARTY_LIB}     # 第三方静态库
      )
      

      5d1e469f-84e0-4211-b7c2-80dbd10c13c0-image.png

      剩下的内容可以查看我上一章节内容,主要是microros agent的构建与使用AGENT使用

      1 条回复 最后回复 回复 引用 0
      • 第一个帖子
        最后一个帖子
      皖ICP备16016415号-7
      Powered by NodeBB | 鱼香ROS