MicroROS on RT-Thread

OSPP 2022 - MicroROS on RT-Thread

Student: Haijun Du

Mentor: Han Wu

Robot Operating System (ROS) is a set of a software frameworks for robotic application development that was initially released by Stanford University in 2007. Further improvements on ROS could introduce breaking changes, making ROS1 unstable. As a result, the second generation of ROS was released (ROS2). The target platform of ROS2 is Linux, while micro_ros devote to bringing ROS2 API to MCU.

This project aims to use micro_ros on RT-Thread, which is a Real-time Operating System (RTOS). Some issues remain unsolved on the existing micro_ros software package(https://github.com/wuhanstudio/micro_ros): the UDP communication is unstable, more service examples are to be added, a precompiled static library is required for compilation of the micro_ros package, and not integrated into the micro_ros official build system to provide benchmark results.

Week 0

2022/06/27 - 2022/07/03

前提

虚拟机上安装Ubuntu20.4,ROS2安装foxy

工作内容

  1. microROS在linux上使用;
  2. microROS在rtthread上使用;

microROS在linux上使用

目的

  1. 初步尝试microROS;

  2. 查看microROS的源码的组成部分;

结果

按照First micro-ROS Application on Linux构建microROS和micro-ROS agent。由于运行ros2 run micro_ros_setup build_firmware.shros2 run micro_ros_setup build_agent.sh报错:

Compiling for host environment: not cleaning path
Building firmware for host platform generic
usage: colcon [-h] [--log-base LOG_BASE] [--log-level LOG_LEVEL]
              {build,test,test-result} ...
colcon: error: unrecognized arguments: --packages-up-to rosidl_typesupport_microxrcedds_c --metas src

所以直接使用colcon build

服务端:

ros2 run micro_ros_agent micro_ros_agent udp4 -p 8888

客户端:

ros2 run micro_ros_demos_rclc ping_pong 

客户端报错:

[ERROR] [1656251587.172644707] [rclc]: [rclc_publisher_init_best_effort] Error in rcl_publisher_init: Undefined type support, at /home/haijun/Desktop/test/src/uros/rmw_microxrcedds/rmw_microxrcedds_c/src/rmw_publisher.c:127, at /tmp/binarydeb/ros-foxy-rcl-1.1.13/src/rcl/publisher.c:180

从error来看,应该是rclc_publisher_init_best_effort函数出错。

具体原因未知

microROS在rtthread上使用

目的

  1. 尝试rtt能否接入ROS2

结果

rtt客户端:

连接方式:udp

运行时,从rtt终端终端提示来说,线程能正常运行。

ros agent 服务端:

ros2 run micro_ros_agent micro_ros_agent udp4 -p 8888
[1656252343.224844] info     | UDPv4AgentLinux.cpp | init                     | running...             | port: 8888
[1656252343.225293] info     | Root.cpp           | set_verbose_level        | logger setup           | verbose_level: 4
[1656252350.362219] info     | Root.cpp           | create_client            | create                 | client_key: 0x7097FB67, session_id: 0x81
[1656252350.362475] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x7097FB67, address: 192.168.31.73:704
[1656252350.400982] info     | ProxyClient.cpp    | create_participant       | participant created    | client_key: 0x7097FB67, participant_id: 0x000(1)

重新查看rtt端的代码,发现rclc_publisher_init_default()的返回值不为零,可以定位创建publish失败。原因未知。

总结

在linux端的rtt端运行microROS均失败,定位到的错误均由于publisher_init初始化失败导致。目前不知道原因为何,猜测是不是micro-ROS agent构建有问题。

下一步计划

  1. rtt端测试下uart通信,看是否出现同一样问题;
  2. 使用docker 尝试下。

Week 1

2022/07/04 - 2022/07/10

上周问题

  • 单片机和ROS2 无法连接

上周会议给出的原因和建议:

  • 原因
    • 使用虚拟机,导致数据多次转发,可能存在数据延迟问题;
    • docker版本过旧;
  • 建议:
    • 使用WSL或者双系统;
    • 安装新版本的docker;
    • 使用串口作为测试;

本周工作

  1. 在window上基于RT-Thread Studio和art-pi构建micro ros (串口)工程;
  2. 在Ubuntu上构建micro-ros-agent ( docker & Vulcanexus)

docker

版本:20.10.17

# 运行micro-ros-agent:本地
docker run -it --net=host microros/micro-ros-agent:galactic udp4 -p 8888
# 运行micro-ros-demos
sudo docker run -it --net=host microros/micro-ros-demos bash
source install/local_setup.bash
ros2 run micro_ros_demos_rclc int32_publisher
# 查看话题
ros2 topic list
ros2 topic echo /std_msgs_msg_Int32

可以看到话题,说明micro-ros-agent没有问题

# 运行micro-ros-agent
docker run -it -v /dev:/dev --privileged microros/micro-ros-agent:galactic serial --dev /dev/ttyUSB0
# docker run -it -p 9999:9999/udp --privileged microros/micro-ros-agent:galactic udp4 -p 9999

# 单片机
microros_pub_int32

结果:

# ubuntu
[1657365773.777815] info     | TermiosAgentLinux.cpp | init                     | running...             | fd: 3
[1657365773.778163] info     | Root.cpp           | set_verbose_level        | logger setup           | verbose_level: 4
[1657365857.374839] info     | Root.cpp           | create_client            | create                 | client_key: 0x10176887, session_id: 0x81
[1657365857.375037] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x10176887, address: 0
[1657365858.394287] info     | ProxyClient.cpp    | create_participant       | participant created    | client_key: 0x10176887, participant_id: 0x000(1)

# 单片机
[micro_ros] node created                                                        
[micro_ros] publisher created                                                   
[micro_ros] timer created                                                       
[micro_ros] executor created                                                    
[micro_ros] New thread mr_pubint32 

micro_ros 软件包配置

image-20220709091040708

Vulcanexus

Vulcanexus

# agent 测试
ros2 run micro_ros_agent micro_ros_agent udp4 -p 8888
# demos 测试
sudo docker run -it --net=host microros/micro-ros-demos bash
source install/local_setup.bash
ros2 run micro_ros_demos_rclc int32_publisher

可以看到话题,说明基于Vulcanexus安装的micro-ros-agent没有问题

# 运行micro-ros-agent
ros2 run micro_ros_agent micro_ros_agent serial -D /dev/ttyUSB0
# 单片机
microros_pub_int32

结果和 docker一致。

结果 & 问题

结果:单片机和ROS2 无法连接的问题没有解决。从结果上来看,还是create_topic没有成功。

目前micro ros agent运行在双系统的Ubuntu上,应该不存在数据多次转化。目前猜想是不是单片机端配置有问题。

Week 2

2022/07/11 - 2022/07/17

上周任务

  • 解决uart1问题(完成);
  • 在单片机端使用 subscribe int32(未完成)
  • 尝试Hardfloat / Softfloat(未完成)

uart1通信问题

未对uart1底层驱动进行适配,硬件没有问题

周会需帮助解决问题

  • micro ros 软件包编译报错

arm-none-eabi-gcc 版本:

arm-none-eabi-gcc -v

Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/home/haijun/env_released_1.2.0/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/lto-wrapper
Target: arm-none-eabi
Configured with: /home/build/work/GCC-5-0-build/src/gcc/configure --target=arm-none-eabi --prefix=/home/build/work/GCC-5-0-build/install-native --libexecdir=/home/build/work/GCC-5-0-build/install-native/lib --infodir=/home/build/work/GCC-5-0-build/install-native/share/doc/gcc-arm-none-eabi/info --mandir=/home/build/work/GCC-5-0-build/install-native/share/doc/gcc-arm-none-eabi/man --htmldir=/home/build/work/GCC-5-0-build/install-native/share/doc/gcc-arm-none-eabi/html --pdfdir=/home/build/work/GCC-5-0-build/install-native/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-newlib --with-headers=yes --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/home/build/work/GCC-5-0-build/install-native/arm-none-eabi --build=i686-linux-gnu --host=i686-linux-gnu --with-gmp=/home/build/work/GCC-5-0-build/build-native/host-libs/usr --with-mpfr=/home/build/work/GCC-5-0-build/build-native/host-libs/usr --with-mpc=/home/build/work/GCC-5-0-build/build-native/host-libs/usr --with-isl=/home/build/work/GCC-5-0-build/build-native/host-libs/usr --with-cloog=/home/build/work/GCC-5-0-build/build-native/host-libs/usr --with-libelf=/home/build/work/GCC-5-0-build/build-native/host-libs/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for ARM Embedded Processors' --with-multilib-list=armv6-m,armv7-m,armv7e-m,armv7-r,armv8-m.base,armv8-m.main
Thread model: single
gcc version 5.4.1 20160609 (release) [ARM/embedded-5-branch revision 237715] (GNU Tools for ARM Embedded Processors)

编译报错:

scons

scons: Reading SConscript files ...
Newlib version:unknown
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
CC build/packages/micro_ros-galactic/src/rtt_serial_transports.o
packages/micro_ros-galactic/src/rtt_serial_transports.c:47:16: error: conflicting types for '__ctype_ptr__'
 char __EXPORT *__ctype_ptr__ = (char *) _ctype_b + 127;
                ^
In file included from packages/micro_ros-galactic/src/rtt_serial_transports.c:5:0:
/home/haijun/env_released_1.2.0/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/ctype.h:46:23: note: previous declaration of '__ctype_ptr__' was here
 extern __IMPORT char *__ctype_ptr__;
                       ^
In file included from packages/micro_ros-galactic/src/rtt_serial_transports.c:52:0:
packages/micro_ros-galactic/src/micro_ros_rtt.h:20:44: warning: 'struct timespec' declared inside parameter list
 int clock_gettime(clockid_t unused, struct timespec *tp);
                                            ^
packages/micro_ros-galactic/src/micro_ros_rtt.h:20:44: warning: its scope is only this definition or declaration, which is probably not what you want
packages/micro_ros-galactic/src/rtt_serial_transports.c:71:5: error: conflicting types for 'clock_gettime'
 int clock_gettime(clockid_t unused, struct timespec *tp)
     ^
In file included from packages/micro_ros-galactic/src/rtt_serial_transports.c:52:0:
packages/micro_ros-galactic/src/micro_ros_rtt.h:20:5: note: previous declaration of 'clock_gettime' was here
 int clock_gettime(clockid_t unused, struct timespec *tp);
     ^
scons: *** [build/packages/micro_ros-galactic/src/rtt_serial_transports.o] Error 1
scons: building terminated because of errors.

猜测原因:GCC版本问题

上次周会下载的arm-none-eabi-gcc 5.4.1因为网络问题,似乎没有下载全,我从该链接下载 :

选择: 5-2016-q2-update

Week 3

2022/07/18 - 2022/07/24

Break

week4

2022/07/25 - 2022/07/31

1.遗留的问题

单片机端和PC端的create_topic没有成功,估计是/ libc (POSIX) or clock_gettime的问题

2. 任务

  • 由于将rtthread的版本降低到4.0.1尝试运行micro -ros软件包;
  • 编译基于cortex-m7的micro -ros的静态编译库,使micro -ros软件包能在art-pi上运行;

3. 工作情况

3.1 降低rtthread的版本

rtthread4.0.1没有art-pi的bsp,考虑到以后会使用rtthread的最新版本,因此配置art-pi的意义不大,终止该任务;

3.2 静态编译micro -ros

参考网址:

Creating custom static micro-ROS library

docker

由于VPN的原因,导致download的仓库不全,无法进行正常的编译;

4. 周会讨论问题

  • VPN
  • 如何生成静态库;

5. 下周任务

  1. 解决Ubuntu端的vpn问题;
  2. 继续完成为art-pi生成静态库的任务,期望下周能在art-pi运行micro -ros;

week5

2022/08/01 - 2022/08/05

任务:

  • 为art -pi 编译静态库,使micro ros能在art -pi上成功运行

完成情况:

  1. 完成静态库的编译,micro ros能在art -pi上运行(串口)

遇到的问题:

  1. clock_gettime()
  2. 无法使用udp运行,问题在于该函数rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));具体原因未知修改方法未知micro_ros_pub_int32_udp.c能运行是因为程序里面没有使用rclc_executor_spin_some())
  • ROS2版本:galactic
  • 单片机:art-pi

1 环境准备

参考链接:

  • https://micro.ros.org/docs/tutorials/advanced/create_custom_static_library/
  • https://micro.ros.org/docs/tutorials/core/first_application_rtos/freertos/

1. 1 准备micro_ros_setup

# 创建micro ros工具
mkdir microros_ws
cd microros_ws
git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

sudo apt update && rosdep update
rosdep install --from-paths src --ignore-src -y

colcon build
source install/local_setup.bash

1.2 准备firmware

ros2 run micro_ros_setup create_firmware_ws.sh generate_lib

可能出现的问题1vcs not found

vcs not found 
command 'vcs' not found , but there are 17 similar ones.

缺少 python3-vcstool软件包

sudo apt-get install python3-vcstool

可能出现的问题2colcon: error: unrecognized arguments:

colcon: error: unrecognized arguments: --packages-ignore-regex

coclon安装不全

pip install -U colcon-common-extensions

正确下载firmware和编后的文件夹结构如下:

$ tree -L 2

.
├── COLCON_IGNORE
├── dev_ws
│   ├── ament
│   ├── build
│   ├── install
│   ├── log
│   ├── ros2
│   └── ros2.repos
├── mcu_ws
│   ├── build
│   ├── colcon.meta
│   ├── eProsima
│   ├── install
│   ├── log
│   ├── ros2
│   ├── ros2.repos
│   └── uros
└── PLATFORM

1.3 编译 静态文件库

定义交叉编译规则:my_custom_toolchain.cmake

# 使用交叉编译 目标:嵌入式平台
SET(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING 1)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# 交叉编译链:参考单片机端的rtconfig.py编译版本
set(TOOLS /home/haijun/env_released_1.2.0/gcc-arm-none-eabi-5_4-2016q3/bin/)
set(CMAKE_C_COMPILER ${TOOLS}arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER ${TOOLS}arm-none-eabi-g++)

SET(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "")
SET(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "")


# SET HERE YOUR BUILDING FLAGS:参考rtconfig.py的DEVICE的配置

set(FLAGS "-O2 -mfloat-abi=softfp -mfpu=fpv5-sp-d16 -mfloat-abi=hard  -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-exceptions -mcpu=cortex-m7 -DF_CPU=480000000L -DARDUINO=10813 -mthumb -DSTM32H750XX" CACHE STRING "" FORCE)


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)

定义静态库包含的头文件:my_custom_colcon.meta

{
    "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"
            ]
        }
    }
}

编译静态库:

ros2 run micro_ros_setup build_firmware.sh $(pwd)/my_custom_toolchain.cmake $(pwd)/my_custom_colcon.meta

一共编译会编译64个包,其中会出现一些警告。编译时间1min多

Summary: 64 packages finished [1min 10s]
  40 packages had stderr output: action_msgs actionlib_msgs builtin_interfaces composition_interfaces diagnostic_msgs example_interfaces geometry_msgs libyaml_vendor lifecycle_msgs micro_ros_msgs micro_ros_utilities microxrcedds_client nav_msgs rcl rcl_action rcl_interfaces rcl_lifecycle rcl_logging_interface rcl_logging_noop rclc rclc_lifecycle rclc_parameter rcutils rmw rmw_implementation rmw_microxrcedds rosgraph_msgs rosidl_runtime_c rosidl_typesupport_c rosidl_typesupport_microxrcedds_c sensor_msgs shape_msgs statistics_msgs std_msgs std_srvs stereo_msgs test_msgs trajectory_msgs unique_identifier_msgs visualization_msgs

静态库和头文件在firmware/build

haijun@haijun-Lenovo:~/micro_ROS/microros_ws/firmware/build$ tree -L 2
.
├── include
│   ├── actionlib_msgs
│   ├── action_msgs
│   ├── builtin_interfaces
│   ├── composition_interfaces
│   ├── diagnostic_msgs
│   ├── example_interfaces
│   ├── geometry_msgs
│   ├── lifecycle_msgs
│   ├── micro_ros_msgs
│   ├── micro_ros_utilities
│   ├── nav_msgs
│   ├── rcl
│   ├── rcl_action
│   ├── rclc
│   ├── rclc_lifecycle
│   ├── rclc_parameter
│   ├── rcl_interfaces
│   ├── rcl_lifecycle
│   ├── rcl_logging_interface
│   ├── rcutils
│   ├── rmw
│   ├── rmw_microros
│   ├── rmw_microxrcedds_c
│   ├── rosgraph_msgs
│   ├── rosidl_runtime_c
│   ├── rosidl_typesupport_c
│   ├── rosidl_typesupport_interface
│   ├── rosidl_typesupport_introspection_c
│   ├── rosidl_typesupport_microxrcedds_c
│   ├── sensor_msgs
│   ├── shape_msgs
│   ├── statistics_msgs
│   ├── std_msgs
│   ├── std_srvs
│   ├── stereo_msgs
│   ├── test_msgs
│   ├── tracetools
│   ├── trajectory_msgs
│   ├── ucdr
│   ├── unique_identifier_msgs
│   ├── uxr
│   ├── visualization_msgs
│   └── yaml.h
└── libmicroros.a

43 directories, 2 files

1.4 部署到单片机端

参考链接:https://github.com/ros2middleware/micro_ros_RTThread_apps/tree/galactic

基于micro_ros_RTThread_apps的配置:

  • Device type (UART)
  • ARCH CPU (Cortex M7 (fpv5-d16-hard)) --->
  • uart1) serial device name
  • [*] microros_pub_int32: microros publish int32 example
  • [*] microros_sub_int32: micro ros subscribe int32 example
  • Version (galactic) --->

由于生成的头文件和原有micro_ros-galactic的头文件有出入 ,为了快速部署,修改了micro_ros-galactic的文件布局:

  • 新增include文件夹,防止firmware生成的头文件
  • 把原来src文件夹中的micro_ros_rtt.h, yaml.h
  • libmicroros.a直接放在micro_ros-galacticw文件下
  • src文件夹只保留.c文件

因此会导致micro_ros的以下配置失效:

  • ARCH CPU (Cortex M7 (fpv5-d16-hard)) --->

再稍微修改SConscript

# 获取静态文件的位置
LIBPATH = [cwd]
# 获取头文件位置
path	= [cwd]
path	+= [cwd + '/include']

编译中可能出现错误:

In file included from packages/micro_ros-galactic/include/rmw/qos_profiles.h:23:0,
                 from packages/micro_ros-galactic/include/rmw/rmw.h:103,
                 from packages/micro_ros-galactic/include/rmw_microros/rmw_microros.h:20,
                 from packages/micro_ros-galactic/include/micro_ros_rtt.h:13,
                 from packages/micro_ros-galactic/examples/micro_ros_pub_int32.c:5:
packages/micro_ros-galactic/include/rmw/types.h:418:49: error: expected ',' or '}' before '__attribute__'
 # define RMW_DECLARE_DEPRECATED(name, msg) name __attribute__((deprecated(msg)))
                                                 ^
packages/micro_ros-galactic/include/rmw/types.h:439:3: note: in expansion of macro 'RMW_DECLARE_DEPRECATED'
   RMW_DECLARE_DEPRECATED(
   ^
In file included from packages/micro_ros-galactic/include/rmw/rmw.h:103:0,
                 from packages/micro_ros-galactic/include/rmw_microros/rmw_microros.h:20,
                 from packages/micro_ros-galactic/include/micro_ros_rtt.h:13,
                 from packages/micro_ros-galactic/examples/micro_ros_pub_int32.c:5:
packages/micro_ros-galactic/include/rmw/qos_profiles.h:111:3: error: 'RMW_QOS_POLICY_LIVELINESS_UNKNOWN' undeclared here (not in a function)
   RMW_QOS_POLICY_LIVELINESS_UNKNOWN,

知道错误由define RMW_DECLARE_DEPRECATED(name, msg) name __attribute__((deprecated(msg)))引起,但是不知道原有,因此删除__attribute__((deprecated(msg)))

// 位置:/micro_ros-galactic/include/rmw/types.h:418
# define RMW_DECLARE_DEPRECATED(name, msg) name 

1.5 运行

出现问题: 建立连接失败

单片机:

msh >microros_pub_int32
[E/micro_ros_serial] succeed to open device uart1
[micro_ros] failed to initialize
msh >

PC 端:

haijun@haijun-Lenovo:/dev$ ros2 run micro_ros_agent micro_ros_agent serial -D /dev/ttyUSB0 
[1659538409.675036] info     | TermiosAgentLinux.cpp | init                     | running...             | fd: 3
[1659538409.675183] info     | Root.cpp           | set_verbose_level        | logger setup           | verbose_level: 4
[1659538417.480562] info     | Root.cpp           | create_client            | create                 | client_key: 0x6EEC6270, session_id: 0x81
[1659538417.480852] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x6EEC6270, address: 0
[1659538418.720121] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538419.969156] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538421.218229] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538422.467203] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538423.716348] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538424.965481] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538426.214506] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538427.463394] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0
[1659538428.712708] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x6EEC6270, address: 0

原因未知,但是可以估计是int clock_gettime(clockid_t unused, struct timespec *tp)的原因

修改:

int clock_gettime(clockid_t unused, struct timespec *tp)
{
    (void)unused;
    static uint32_t rollover = 0;
    static uint32_t last_measure = 0;

    uint32_t m = rt_tick_get() * 1000 / RT_TICK_PER_SECOND * 1000;

    rollover += (m < last_measure) ? 1 : 0;

    rt_uint64_t real_us = (rt_uint64_t) (m + rollover * micro_rollover_useconds);

    tp->tv_sec = real_us / 1000000;
    
    last_measure = m;
    last_measure = m;

    return 0;
}

能通信成功,但是仅是权宜之计

通信测试

单片机端:

msh >microros_sub_int32
[E/micro_ros_serial] succeed to open device uart1
[micro_ros] node created
[micro_ros] executor created
[micro_ros] New thread mr_subint32
msh >[micro_ros] received data 1
[micro_ros] received data 1
[micro_ros] received data 1
[micro_ros] received data 1
[micro_ros] received data 1
[micro_ros] received data 1
[micro_ros] received data 1

PC 端:

# 参看话题 & 类型
aijun@haijun-Lenovo:/dev$ ros2 topic list -t
/micro_ros_rtt_subscriber [std_msgs/msg/Int32]
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]


# 发送话题
haijun@haijun-Lenovo:/dev$ ros2 topic pub /micro_ros_rtt_subscriber std_msgs/msg/Int32 "{data: 1}"
publisher: beginning loop
publishing #1: std_msgs.msg.Int32(data=1)

publishing #2: std_msgs.msg.Int32(data=1)

publishing #3: std_msgs.msg.Int32(data=1)

publishing #4: std_msgs.msg.Int32(data=1)

publishing #5: std_msgs.msg.Int32(data=1)

publishing #6: std_msgs.msg.Int32(data=1)

publishing #7: std_msgs.msg.Int32(data=1)

1. 6 待解决问题

  • int clock_gettime(clockid_t unused, struct timespec *tp)

week6

2022/08/08 - 2022/08/012

上周任务

  • 尝试寻找分离rclc rmw的方法;

完成情况

micro ros 构建复杂,一共有25个文件,64个包,编译出108个静态文件,因此文件和文件之间存在一定的依赖关系,在编译过程中ament贯穿整个编译过程,其作用大致如下:

  • 调用cmake编译c文件;
  • 将..msg .srv等ROS消息类型转换为c文件;

因此micro ros 以rclc 和Micro-XRCE-DDS为基础,以ROS消息类型,适配和转化rclc、Micro-XRCE-DDS支撑文件为辅助;所以分离难度较大

目前尝试过脱离ament,直接使用cmake进行交叉编译,以Micro-CDR、Micro-XRCE-DDS-Client进行尝试(Micro-CDR无依赖;Micro-XRCE-DDS-Clien依赖于Micro-CDR)。

周会拟讨论内容

  • micro ros 仓库里为freertos , cubemx提供的程序基本是通过micro_ros_setup下载源码,调用ament编译源码,添加编译出的静态文件到工程,因此如果实现任务三:集成到 micro_ros 官方的编译系统实际上可以不分离 rclc rmw
  • 分离rclc rmw的目前想法:先剥离ament,使用cmake编译,再使用scons构建(ament负责将ROS消息类型转化为c的工作,这一部分的处理将是难点)

工作内容:生成静态库过程分析

源码

ros2 run micro_ros_setup create_firmware_ws.sh generate_lib
  1. clone ament相关的包 ----- /firmware/dev_ws ---- 构建工具
  2. clone micro ros相关包 ---- /firmware/mcu_ws ----- micro ros 相关的源代码
  3. 编译ament相关包
├── colcon.meta
├── eProsima						# DDS源文件
│   ├── Micro-CDR					# 实现 CDR 标准序列化方法的 C 库
│   └── Micro-XRCE-DDS-Client		# DDS客户端
├── ros2							# ros2相关源文件
│   ├── common_interfaces			# (.msg and .srv)文件(不是c 库)
│   ├── example_interfaces			# 消息类型example (不是C 库)
│   ├── libyaml_vendor				# 下载和构建 libyaml
│   ├── rcl							# rcl 包相关的包
│   ├── rcl_interfaces				# 接口文件(.msg 和 .srv)
│   ├── rcl_logging					# 日志
│   ├── rcpputils					# C++ API
│   ├── rmw							# 中间件
│   ├── rmw_implementation			# RMW_IMPLEMENTATION 可选可用的rmw实现
│   ├── rosidl						# 将.msg/.srv/.action 文件转化为相关的接口(.idl/c/cpp)
│   ├── rosidl_dds
│   ├── rosidl_defaults
│   ├── test_interface_files
│   └── unique_identifier_msgs
├── ros2.repos
└── uros
    ├── micro_ros_msgs				#  micro-ROS 实现过程中使用ROS 2 消息定义的集合
    ├── micro_ros_utilities			# 提供通用程序,
    ├── rcl							# 和 ros2/rcl文件内容一致
    ├── rclc						# ROS 客户端支持库 (rcl)
    ├── rcutils						# c API ROS 2 中常用的函数和数据结构
    ├── rmw_microxrcedds			# 实现Micro XRCE-DDS
    ├── rosidl_typesupport			# 为ROS中的消息提供支持
    ├── rosidl_typesupport_microxrcedds 
    └── tracetools

构建

ros2 run micro_ros_setup build_firmware.sh $(pwd)/my_custom_toolchain.cmake $(pwd)/my_custom_colcon.meta

调用脚本:

  1. build_firmware.sh
    1. 检查micro_ros_setup环境
    2. 检查firmware是否存在
    3. source dev_ws环境
    4. 调用config/generate_lib/generic/build.sh
  2. config/generate_lib/generic/build.sh:该脚本中调用了my_custom_toolchain.cmake 和my_custom_colcon.meta
    1. 判断使用哪里的my_custom_colcon.meta文件
    2. 进入/mcu_ws, 删除原有的build, install log 文件
    3. 调用colcon编译:

pushd $FW_TARGETDIR/mcu_ws >/dev/null

	rm -rf build install log
	
   	colcon build \
		--merge-install \							#添加包环境变量时,路径较短
		--packages-ignore-regex=.*_cpp \			# 没有查找到.*_cpp的文件
		--metas $COLCON_META \						# 调用my_custom_colcon.meta
		--cmake-args \								# 使用cmake的命令
		"--no-warn-unused-cli" \
		-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=OFF \	# 是否将创建与位置无关的可执行文件或共享库
		-DTHIRDPARTY=ON \
		-DBUILD_SHARED_LIBS=OFF \						# 所有库构建为共享库
		-DBUILD_TESTING=OFF \
		-DCMAKE_BUILD_TYPE=Release \					# 构建类型:Release
		-DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN \				# 交叉编译构建的工具链
		-DCMAKE_VERBOSE_MAKEFILE=ON; \					# 详细输出
  1. mcu_ws/install/lib/*.a生成库文件libmicroros.a

参与构建的包

 rosidl_typesupport_interface [1.46s]
 rmw_implementation_cmake [1.46s]
 test_interface_files [2.57s]
 tracetools [2.73s]
 tracetools_trace [2.92s]
 rosidl_cli [3.06s]
 microcdr [3.68s]
 rcutils [4.11s]
 tracetools_read [2.85s]
 ros2trace [2.39s]
 tracetools_launch [2.45s]
 rosidl_adapter [2.72s]
 rcl_logging_interface [1.99s]
 rosidl_runtime_c [2.22s]
 microxrcedds_client [2.77s]
 rcl_logging_noop [1.35s]
 rosidl_parser [1.77s]
 rmw [2.18s]
 rosidl_cmake [1.64s]
 libyaml_vendor [7.86s]
 rosidl_generator_dds_idl [1.59s]
 rosidl_typesupport_introspection_c [1.75s]
 rosidl_generator_c [1.98s]
 rosidl_typesupport_microxrcedds_c [2.02s]
 micro_ros_utilities [1.59s]
 rosidl_typesupport_c [1.67s]
 rosidl_default_runtime [0.72s]
 rosidl_default_generators [0.73s]
 unique_identifier_msgs [4.04s]
 micro_ros_msgs [4.44s]
 builtin_interfaces [4.51s]
 std_srvs [4.89s]
 lifecycle_msgs [8.08s]
 rmw_microxrcedds [4.35s]
 rosgraph_msgs [5.58s]
 statistics_msgs [6.22s]
 action_msgs [6.68s]
 rosidl_typesupport_microxrcedds_test_msg [2.67s]
 rmw_implementation [2.75s]
 rosidl_typesupport_microxrcedds_c_tests [1.94s]
 rcl_interfaces [15.0s]
 std_msgs [18.0s]
 tracetools_test [4.22s]
 composition_interfaces [8.45s]
 actionlib_msgs [7.62s]
 example_interfaces [20.0s]
 test_msgs [20.6s]
 test_rmw_implementation [1.45s]
 rcl [3.55s]
 rcl_lifecycle [2.72s]
 geometry_msgs [15.7s]
 rcl_action [3.11s]
 rclc [3.27s]
 rclc_lifecycle [3.94s]
 rclc_parameter [4.46s]
 shape_msgs [7.62s]
 trajectory_msgs [7.97s]
 diagnostic_msgs [8.81s]
 nav_msgs [12.9s]
 visualization_msgs [14.9s]
 sensor_msgs [22.4s]
 sensor_msgs_py [1.61s]
 stereo_msgs [3.01s]
 common_interfaces [0.78s]

包与包的依赖关系:

colcon graph --dot | dot -Tpng -o graph.png
#blue=build, red=run, tan=test
# A ---> B :表示 A的构建依赖于B

graph

各个包生成的静态文件:

libactionlib_msgs__rosidl_generator_c.a
libactionlib_msgs__rosidl_typesupport_c.a
libactionlib_msgs__rosidl_typesupport_introspection_c.a
libactionlib_msgs__rosidl_typesupport_microxrcedds_c.a
libaction_msgs__rosidl_generator_c.a
libaction_msgs__rosidl_typesupport_c.a
libaction_msgs__rosidl_typesupport_introspection_c.a
libaction_msgs__rosidl_typesupport_microxrcedds_c.a
libbuiltin_interfaces__rosidl_generator_c.a
libbuiltin_interfaces__rosidl_typesupport_c.a
libbuiltin_interfaces__rosidl_typesupport_introspection_c.a
libbuiltin_interfaces__rosidl_typesupport_microxrcedds_c.a
libcomposition_interfaces__rosidl_generator_c.a
libcomposition_interfaces__rosidl_typesupport_c.a
libcomposition_interfaces__rosidl_typesupport_introspection_c.a
libcomposition_interfaces__rosidl_typesupport_microxrcedds_c.a
libdiagnostic_msgs__rosidl_generator_c.a
libdiagnostic_msgs__rosidl_typesupport_c.a
libdiagnostic_msgs__rosidl_typesupport_introspection_c.a
libdiagnostic_msgs__rosidl_typesupport_microxrcedds_c.a
libexample_interfaces__rosidl_generator_c.a
libexample_interfaces__rosidl_typesupport_c.a
libexample_interfaces__rosidl_typesupport_introspection_c.a
libexample_interfaces__rosidl_typesupport_microxrcedds_c.a
libgeometry_msgs__rosidl_generator_c.a
libgeometry_msgs__rosidl_typesupport_c.a
libgeometry_msgs__rosidl_typesupport_introspection_c.a
libgeometry_msgs__rosidl_typesupport_microxrcedds_c.a
liblifecycle_msgs__rosidl_generator_c.a
liblifecycle_msgs__rosidl_typesupport_c.a
liblifecycle_msgs__rosidl_typesupport_introspection_c.a
liblifecycle_msgs__rosidl_typesupport_microxrcedds_c.a
libmicrocdr.a
libmicro_ros_msgs__rosidl_generator_c.a
libmicro_ros_msgs__rosidl_typesupport_c.a
libmicro_ros_msgs__rosidl_typesupport_introspection_c.a
libmicro_ros_msgs__rosidl_typesupport_microxrcedds_c.a
libmicro_ros_utilities.a
libmicroxrcedds_client.a
libnav_msgs__rosidl_generator_c.a
libnav_msgs__rosidl_typesupport_c.a
libnav_msgs__rosidl_typesupport_introspection_c.a
libnav_msgs__rosidl_typesupport_microxrcedds_c.a
librcl.a
librcl_action.a
librclc.a
librclc_lifecycle.a
librclc_parameter.a
librcl_interfaces__rosidl_generator_c.a
librcl_interfaces__rosidl_typesupport_c.a
librcl_interfaces__rosidl_typesupport_introspection_c.a
librcl_interfaces__rosidl_typesupport_microxrcedds_c.a
librcl_lifecycle.a
librcl_logging_interface.a
librcl_logging_noop.a
librcutils.a
librmw.a
librmw_microxrcedds.a
librosgraph_msgs__rosidl_generator_c.a
librosgraph_msgs__rosidl_typesupport_c.a
librosgraph_msgs__rosidl_typesupport_introspection_c.a
librosgraph_msgs__rosidl_typesupport_microxrcedds_c.a
librosidl_runtime_c.a
librosidl_typesupport_c.a
librosidl_typesupport_introspection_c.a
librosidl_typesupport_microxrcedds_c.a
libsensor_msgs__rosidl_generator_c.a
libsensor_msgs__rosidl_typesupport_c.a
libsensor_msgs__rosidl_typesupport_introspection_c.a
libsensor_msgs__rosidl_typesupport_microxrcedds_c.a
libshape_msgs__rosidl_generator_c.a
libshape_msgs__rosidl_typesupport_c.a
libshape_msgs__rosidl_typesupport_introspection_c.a
libshape_msgs__rosidl_typesupport_microxrcedds_c.a
libstatistics_msgs__rosidl_generator_c.a
libstatistics_msgs__rosidl_typesupport_c.a
libstatistics_msgs__rosidl_typesupport_introspection_c.a
libstatistics_msgs__rosidl_typesupport_microxrcedds_c.a
libstd_msgs__rosidl_generator_c.a
libstd_msgs__rosidl_typesupport_c.a
libstd_msgs__rosidl_typesupport_introspection_c.a
libstd_msgs__rosidl_typesupport_microxrcedds_c.a
libstd_srvs__rosidl_generator_c.a
libstd_srvs__rosidl_typesupport_c.a
libstd_srvs__rosidl_typesupport_introspection_c.a
libstd_srvs__rosidl_typesupport_microxrcedds_c.a
libstereo_msgs__rosidl_generator_c.a
libstereo_msgs__rosidl_typesupport_c.a
libstereo_msgs__rosidl_typesupport_introspection_c.a
libstereo_msgs__rosidl_typesupport_microxrcedds_c.a
libtest_msgs__rosidl_generator_c.a
libtest_msgs__rosidl_typesupport_c.a
libtest_msgs__rosidl_typesupport_introspection_c.a
libtest_msgs__rosidl_typesupport_microxrcedds_c.a
libtracetools.a
libtrajectory_msgs__rosidl_generator_c.a
libtrajectory_msgs__rosidl_typesupport_c.a
libtrajectory_msgs__rosidl_typesupport_introspection_c.a
libtrajectory_msgs__rosidl_typesupport_microxrcedds_c.a
libunique_identifier_msgs__rosidl_generator_c.a
libunique_identifier_msgs__rosidl_typesupport_c.a
libunique_identifier_msgs__rosidl_typesupport_introspection_c.a
libunique_identifier_msgs__rosidl_typesupport_microxrcedds_c.a
libvisualization_msgs__rosidl_generator_c.a
libvisualization_msgs__rosidl_typesupport_c.a
libvisualization_msgs__rosidl_typesupport_introspection_c.a
libvisualization_msgs__rosidl_typesupport_microxrcedds_c.a
libyaml.a

week7

2022/08/015 - 2022/08/020

上周任务

基于cmake编译包,剥离ament,并顺便把它的编译使用到的源文件一起复制出来。

方法:

  • 删除CmakeLists.txt中和ament相关的命令;
  • 手动补充头文件和静态库的链接
  • 通过自定义命令,复制出参与编译的源文件;

完成情况

rmw rcl为核心编译其相关依赖的包,完成了大部分;在该部分包中,ament的主要作用提供依赖关系和搜索路径,rmw_implementation包比较特殊,没有编译成功:rmw_implementation的依赖包rmw_implementation_cmake里面没有c文件,导致编译后什么没有生成,而rmw_implementationCmakeLists.txt出现几个无法识别的命令,导致编译失败。

最复杂的包是rosidl_*相关的包,他们的CmakeList.txt不是为了编译出静态文件和复制公共头文件,而是复制一些python脚本,比如rosidl_default_generators, rosidl_generator_c。这部分和ament的耦合非常严重,剥离ament相关包后会导致不清楚该包的作用和它的上层包如何使用。

周会讨论主题

  • idl、msg相关的包剥离amnet的难度较大,ament似乎还负责调用python脚本的功能,因此,感觉完全剥离ament越来越现实,得寻找突破点;

package 编译日志

包的依赖关系:

graph

基本编译条件

# 交叉编译路径
Toolchain="$PWD""/my_custom_toolchain.cmake"
# install路径
Dir_Install="$PWD""/install"
#当前文件路径
Base_File="$PWD"
#基本编译参数
Base_Param="-DCMAKE_TOOLCHAIN_FILE=${Toolchain}\
        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=OFF \
        -DTHIRDPARTY=ON \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTING=OFF \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_VERBOSE_MAKEFILE=ON \
        -DCMAKE_INSTALL_PREFIX=$Dir_Install \
        -DCMAKE_PREFIX_PATH=$Dir_Install"

1 . Micro-CDR

# 路径:firmware/eProsima/Micro-CDR
#无依赖
# 添加编译宏
External_param="-DUCDR_ISOLATED_INSTALL=OFF"

CmakeLists.txt文件修改

# set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${PROJECT_BINARY_DIR}/temp_install)

set(dir_sources)
# 遍历c 文件 & 把c文件的路径改为绝对路径
FOREACH(list ${cdr_sources}) 
    list(APPEND dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${list})
ENDFOREACH(list)  
# 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${dir_sources}  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)

2. Micro-XRCE-DDS-Client

# 路径:/firmware/eProsima/Micro-XRCE-DDS-Client
# 依赖于Micro-CDR
# 添加编译宏
External_param="-DUCLIENT_ISOLATED_INSTALL=OFF -DUCLIENT_PROFILE_UDP=OFF \
                -DUCLIENT_PIC=OFF -DUCLIENT_PROFILE_UDP=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"

CmakeList.txt文件修改

set(dir_sources)
# 遍历c 文件 & 把c文件的路径改为绝对路径
FOREACH(list ${SRCS}) 
    if(list MATCHES "OFF")
        message(STATUS "=============${list}")
    else()
        list(APPEND dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${list})
    endif()
ENDFOREACH(list)  
# 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${dir_sources}  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)

3. rcutils

# 路径:/firmware/uros/rcutils
# 无依赖
# 编译宏
External_param="-DENABLE_TESTING=OFF -DRCUTILS_NO_FILESYSTEM=ON -DRCUTILS_NO_THREAD_SUPPORT=ON \
                -DRCUTILS_NO_64_ATOMIC=ON -DRCUTILS_AVOID_DYNAMIC_ALLOCATION=ON"

set(dir_sources)
# 遍历c 文件 & 把c文件的路径改为绝对路径
FOREACH(list ${rcutils_sources}) 
  list(APPEND dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${list})  
ENDFOREACH(list)  
#删除.h文件
list(REMOVE_ITEM dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/include/rcutils/logging_macros.h)
# 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${dir_sources}  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)

CmakeList.txt文件修改

# 屏蔽ament相关包,为生成 logging_macros.h 调用了python

set(CMAKE_COMMAND /usr/bin/cmake)
set(PYTHON_EXECUTABLE /usr/bin/python3)



4. rcl_logging_interface

# 路径:firmware/ros2/rcl_logging/rcl_logging_interface
# 依赖 :rcutils
# 编译宏: 无

CmakeList.txt文件修改

# 屏蔽ament相关包,添加依赖rcutils的头文件路径
target_include_directories(${PROJECT_NAME} PUBLIC
  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
  "$<BUILD_INTERFACE:${CMAKE_PREFIX_PATH}/include/>"
  "$<INSTALL_INTERFACE:include>")
  
  # 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/src/logging_dir.c  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)  
  

5. rcl_logging_noop

# 路径:firmware/ros2/rcl_logging/rcl_logging_noop
# 依赖 :rcutils rcl_logging_interface
# 编译宏: 无

CmakeList.txt文件修改

# 屏蔽ament相关包,添加依赖rcutils rcl_logging_interface 头文件 静态库

target_link_libraries(${PROJECT_NAME} PRIVATE
  ${CMAKE_PREFIX_PATH}/lib/librcutils.a)
target_link_libraries(${PROJECT_NAME} PUBLIC
  ${CMAKE_PREFIX_PATH}/lib/librcl_logging_interface.a)

target_include_directories(${PROJECT_NAME} PUBLIC
  "$<BUILD_INTERFACE:${CMAKE_PREFIX_PATH}/include/>"
  "$<INSTALL_INTERFACE:include>")
 
# 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/src/rcl_logging_noop/rcl_logging_noop.cpp  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)  

6. rosidl_typesupport_interface

# 路径:firmware/ros2/rosidl/rosidl_typesupport_interface
# 依赖 :无
# 编译宏: 无

CmakeList.txt文件修改

# 屏蔽ament相关包
# 该cmake仅仅把 macros.h 复制到install/include/rosidl_typesupport_interface目录下

7. rosidl_runtime_c

# 路径:/firmware/ros2/rosidl/rosidl_runtime_c
# 依赖 :rcutils rosidl_typesupport_interface
# 编译宏: 无

CmakeList.txt文件修改

# 屏蔽ament相关包 添加依赖包的头文件 导出源文件

set(rosidl_runtime_c_sources
  "src/message_type_support.c"
  "src/primitives_sequence_functions.c"
  "src/sequence_bound.c"
  "src/service_type_support.c"
  "src/string_functions.c"
  "src/u16string_functions.c"
)

add_library(${PROJECT_NAME} ${rosidl_runtime_c_sources})
target_include_directories(${PROJECT_NAME} PUBLIC
  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
  "$<BUILD_INTERFACE:${CMAKE_PREFIX_PATH}/include/>"
  "$<INSTALL_INTERFACE:include>")


set(dir_sources)
# 遍历c 文件 & 把c文件的路径改为绝对路径
FOREACH(list ${rosidl_runtime_c_sources}) 
  list(APPEND dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${list})  
ENDFOREACH(list)  
# 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${dir_sources}  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)

8. rmw

# 路径:/firmware/ros2/rmw/rmw
# 依赖 :rcutils rosidl_runtime_c
# 编译宏: 无

CmakeList.txt文件修改

# 屏蔽ament相关包 添加依赖包的头文件 导出源文件
target_include_directories(${PROJECT_NAME} PUBLIC
  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
  "$<BUILD_INTERFACE:${CMAKE_PREFIX_PATH}/include/>"
  "$<INSTALL_INTERFACE:include>")
  
  set(DIR_rmw_sources)
# 遍历c 文件 & 把c文件的路径改为绝对路径
FOREACH(list ${rmw_sources}) 
  list(APPEND DIR_rmw_sources ${CMAKE_CURRENT_SOURCE_DIR}/${list})  
ENDFOREACH(list)  
# 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${DIR_rmw_sources}  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)

9. rosidl_typesupport_microxrcedds_c

# 路径:/firmware/uros/rosidl_typesupport_microxrcedds/rosidl_typesupport_microxrcedds_c
# 依赖 :rosidl_runtime_c rosidl_typesupport_interface microcdr
# 编译宏: 无

CmakeList.txt文件修改

target_include_directories(${PROJECT_NAME}
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_PREFIX_PATH}/include/>
    $<INSTALL_INTERFACE:include>
  )
 
 target_link_libraries(${PROJECT_NAME} PUBLIC
  ${CMAKE_PREFIX_PATH}/lib/librosidl_runtime_c.a)
 
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/src/identifier.c  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)  

10. rmw_microxrcedds_c

# 路径:/firmware/uros/rmw_microxrcedds/rmw_microxrcedds_c
# 依赖 :
External_param="-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"

CmakeList.txt文件修改

  set(dir_sources)
# 遍历c 文件 & 把c文件的路径改为绝对路径
FOREACH(list ${SRCS}) 
    if(list MATCHES "OFF")
        message(STATUS "=============${list}")
    else()
        list(APPEND dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${list})
    endif()
ENDFOREACH(list)  
# 添加自定义命令,复制源文件
add_custom_command(TARGET ${PROJECT_NAME}
  POST_BUILD
  COMMAND mkdir ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  COMMAND cp ${dir_sources}  ${CMAKE_PREFIX_PATH}/src/${PROJECT_NAME}
  VERBATIM
)

target_link_libraries(${PROJECT_NAME} PUBLIC
  ${CMAKE_PREFIX_PATH}/lib/libmicrocdr.a
  ${CMAKE_PREFIX_PATH}/lib/libmicroxrcedds_client.a
)

target_include_directories(${PROJECT_NAME}
  PUBLIC
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_PREFIX_PATH}/include/>
  PRIVATE
  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
)

11.rosidl_typesupport_introspection_c

# 路径:/firmware/ros2/rosidl/rosidl_typesupport_introspection_c
# 无依赖

CmakeList.txt文件修改

# 屏蔽ament相关包

12. rosidl_generator_c

# 路径:/firmware/ros2/rosidl/rosidl_typesupport_introspection_c

CmakeList.txt文件修改

# 只复制了一个python文件

13 rosidl_default_generators

week8

2022/08/22 - 2022/08/28

上周任务:

  • 理清msg类型转换为c的流程;

完成情况

  • 没有理清msg转化为c的流程,但是可以找到转化层c的源码;
  • 结合msg源码、rclc、rcl、rmw基于cmake构建microROS静态库。因此,基于固定的microROS版本,可以实现基于scons构建;

注:基于cmake构建出来的静态文件只支持std_msgs包含的数据类型,另外只使用microros_pub_int32在单片机上测试,所以构建出来的静态文件只能说明rclc、rcl、rmw包含完整,不能实现完整的ros2功能(其他的msg类型、srv、action)

周会拟讨论问题

  1. 目前有希望直接通过scons构建microROS:

    优点:

    • microROS包和rtt中的其他软件包使用流程一致;
    • 使用源码构建,可以解决目前为每款单片机的创造一个静态文件的问题;

    缺点:

    • 源代码无法和官方保持同步;
  2. 关于第三问的处理方式;

日志

std_msgs

源码

解析std_msg package需要以下四个package:

  • rosidl_generator_c: 提供ROS接口 ;
  • rosidl_typesupport_introspection_c: 提供消息类型支持;
  • rosidl_default_generators
  • rosidl_typesupport_microxrcedds_c为Micro XRCE-DDS提供接口;

最终生成的 c 可以在build/std_msg下面找到源码(使用microROS提供的命令编译的目录下)

源码文件结构:

haijun@haijun-Lenovo:~/micro_ROS/cmake_microros/std_msgs$ tree -L 3
.
├── std_msgs_rosidl_generator_c
│   ├── CMakeLists.txt
│   └── std_msgs
│       └── msg
├── std_msgs_rosidl_typesupport_c
│   ├── CMakeLists.txt
│   └── std_msgs
│       └── msg
├── std_msgs_rosidl_typesupport_introspection_c
│   ├── CMakeLists.txt
│   └── std_msgs
│       └── msg
└── std_msgs_rosidl_typesupport_microxrcedds_c
    ├── CMakeLists.txt
    └── std_msgs
        └── msg

编译

  • 对应文件单独编译成静态文件

file(GLOB_RECURSE SRC_DIR_LIST ${PROJECT_SOURCE_DIR}/std_msgs/msg/detail/*.c)
add_library(${PROJECT_NAME}  ${SRC_DIR_LIST})
target_include_directories(${PROJECT_NAME} PUBLIC
    ${PROJECT_SOURCE_DIR}
    ${PARA_INCLUDE_PATH}
  )
  install(
    TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
  )

注意:std_msgs_rosidl_typesupport_c需要添加一个宏定义add_definitions(-DROSIDL_TYPESUPPORT_STATIC_TYPESUPPORT)表示使用静态类型

基于cmake构建microros(裁剪版)

使用的文件:

rmw

  • Micro-CDR:实施CDR标准序列化方法的C库 位置: /firmware/eProsima/Micro-CDR
  • Micro-XRCE-DDS-Client:DDS客户端 位置:/firmware/eProsima/Micro-XRCE-DDS-Client
  • rmw:中间件,为不同的DDS实现提供了一个抽象层 位置:/firmware/ros2/rmw/rmw
  • rmw_microxrcedds_c: 为XRCE-DDS(RMW层)提供了中间件实现 位置/firmware/uros/rmw_microxrcedds/rmw_microxrcedds_c

数据类型转化(idl):

  • rosidl_runtime_c:提供定义,初始化和最终化功能以及用于获取和使用rosidl typesupport类型的宏 位置:/firmware/ros2/rosidl/rosidl_runtime_c
  • rosidl_typesupport_microxrcedds_c: 为microxrcedds提供能支持idl的接口 位置:/firmware/uros/rosidl_typesupport_microxrcedds/rosidl_typesupport_microxrcedds_c
  • rosidl_typesupport_c:为idl提供c 语言的接口 位置:/firmware/uros/rosidl_typesupport/rosidl_typesupport_c

rcl

  • rcutils: 为ROS2提供数据结构(C API)位置:firmware/uros/rcutils
  • rcl_logging_interface :提供日志函数 位置/firmware/ros2/rcl_logging/rcl_logging_interface
  • rcl_logging_noop: 提供日志函数 位置:/firmware/ros2/rcl_logging/rcl_logging_noop
  • tracetools:追踪工具 位置:/firmware/uros/tracetools/tracetools
  • rcl: ros客户端库 位置:/firmware/uros/rcl/rcl

rclc

  • rclc:ros客户端c库 位置/firmware/uros/rclc/rclc

std_msg

  • std_msgs_rosidl_generator_c
  • std_msgs_rosidl_typesupport_c
  • std_msgs_rosidl_typesupport_introspection_c
  • std_msgs_rosidl_typesupport_microxrcedds_c

根据以上文件生成的静态文件:

.
├── libmicrocdr.a
├── libmicroxrcedds_client.a
├── librcl.a
├── librclc.a
├── librcl_logging_interface.a
├── librcl_logging_noop.a
├── librcutils.a
├── librmw.a
├── librmw_microxrcedds.a
├── librosidl_runtime_c.a
├── librosidl_typesupport_c.a
├── librosidl_typesupport_microxrcedds_c.a
├── libstd_msgs_rosidl_generator_c.a
├── libstd_msgs__rosidl_typesupport_c.a
├── libstd_msgs_rosidl_typesupport_introspection_c.a
├── libstd_msgs_rosidl_typesupport_microxrcedds_c.a
├── libtracetools.a

合并成一个静态文件:

# 合并静态文件
cd ${Dir_Install}/lib

for file in $(find -name '*.a'); do
    echo ${file}
    folder=$(echo $file | sed -E "s/(.+)\/(.+).a/\2/"); 
    mkdir -p $folder; 
    cd $folder; 
    ar x ../$file;
    for f in *; do 
			mv $f ../$folder-$f; 
		done; 
    cd ../
    rm -rf $folder
done
ar rc libmicroros.a *.obj
rm *.obj

mv libmicroros.a ${Base_File}
echo "mv libmicroros.a to ${Base_File}"

最终生成的静态文件:

1.2M	libmicroros.a

week9

2022/08/29 - 2022/09/04

上周任务

  1. micro_ros_setup中添加rtthread的构建脚本;

完成情况

  • 初步完成:通过micro_ros_setup完成代码下载、编译(microROS & rtthread)

代码:

micro_ros_setup ,新增config/rtthread

git clone -b rtthread https://github.com/navy-to-haijun/micro_ros_setup.git

micro_ros_rtthread: 提供demos&transport

git clone https://github.com/navy-to-haijun/micro_ros_rtthread.git

周会拟讨论问题

  • 当前构建方式(先用clocon编译microROS为静态文件,在使用scons链接静态文件和rtthread一起编译出可执行文件)是否合理;
  • 当前方案的优化指出;
  • 为了工程完整必会提供一个demo和transport的文档,这个文档如何处理

日志

micro_ros_setup:为不同的嵌入式平台提供代码下载、编译、运行的脚本;

  1. micro_ros_setup/config`文件夹下添加rtthread脚本:
tree
.
├── dev_ros2_packages.txt			# 官方提供:ament相关包的索引
├── dev_uros_packages.repos			# 官方提供:
├── generic
│   ├── build.sh					# 提供编译脚本(microROS & rtthread)
│   ├── client-colcon.meta			# 官方提供:基本宏定义 --> microROS 
│   ├── client_uros_packages.repos  # 官方提供:microros相关包
│   ├── configure.sh				# 提供配置脚本:配置demo,使用的通信方式
│   ├── create.sh					# 提供代码的下载:rtthread demos transport
│   └── supported_platforms			# 手动写入支出的板卡
└── list_apps.sh					# 列出所有的demo(辅助脚本)

1 directory, 9 files
  1. 自己提供一个文件夹用于存放demos&transport文件

文件名:micro_ros_rtthread(暂时放到自己的仓库下)

.
├── custom_toolchain.cmake			# 为microROS提供编译预定义
├── examples						# example
│   ├── micro_ros_pub_int32.c
│   └── micro_ros_sub_int32.c
├── Kconfig							# 方便后期menuconfig配置
├── microros_extensions				# 提供通信方式
│   ├── micro_ros_rtt.h
│   └── rtt_serial_transports.c		# serial
├── README.md
├── SConscript						# 编译配置脚本
└── stm32h7xx_hal_msp.c				# 底层驱动配置文件(提供uart1)

执行步骤

1 编译micro_ros_setup

config/rtthread编译(复制)到install中

clocon build
source install/local_setup.sh

2 下载源码

主要通过create_firmware_ws.sh 调用create.sh,实现:

  • 下载microROS的相关代码

  • 下载 rtthread --> firmware/sdk-bsp-stm32h750-realthread-artpi

  • 下载micro_ros_rtthread -->firmware/gcc-arm-none-eabi-5_4-2016q3

  • 下载交叉编译链 -->irmware/sdk-bsp-stm32h750-realthread-artpi/projects/art_pi_wifi/micro_ros_rtthread

ros2 run micro_ros_setup create_firmware_ws.sh  rtthread art-pi

create.sh核心代码

 echo "dowmload code "
        git clone https://github.com/RT-Thread-Studio/sdk-bsp-stm32h750-realthread-artpi.git
        git clone https://github.com/navy-to-haijun/micro_ros_rtthread.git

    echo "dowmload  gcc-arm-none-eabi-5_4"
        wget -c https://armkeil.blob.core.windows.net/developer//sitecore/shell/-/media/Files/downloads/gnu-rm/5_4-2016q3/gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2
        tar -xvf gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2
        rm gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2
    fi

    if [ -e $FW_TARGETDIR/sdk-bsp-stm32h750-realthread-artpi/projects/art_pi_wifi ]; then
        mv  micro_ros_rtthread/ ./sdk-bsp-stm32h750-realthread-artpi/projects/art_pi_wifi
        # soft link
        pushd $FW_TARGETDIR/sdk-bsp-stm32h750-realthread-artpi/projects/art_pi_wifi>/dev/null
           ln -s ../../libraries/ libraries
           ln -s ../../rt-thread/ rt-thread 
        popd >/dev/null
    fi

3. 配置rtthread工程

主要通过configure_firmware.sh 调用configure.sh,实现:

  • cconfig.h提供以下宏定义:
    • 开启UART1 or udp
    • 选中的demo的相关宏定义
  • 为Kconfig添加一个source 使其能找到micro_ros_rtthread
ros2 run micro_ros_setup configure_firmware.sh micro_ros_pub_int32.c -t serial

configure.sh核心代码

if [ "$UROS_TRANSPORT" == "serial" ]; then
		echo "Using serial device."
		echo "add macro definition for  cconfig.h."
		sed -i '$i #define BSP_USING_UART1 ' 			$RTCONIF
		sed -i '$i #define USING_MICROROS ' 			$RTCONIF
		sed -i '$i #define MICROROS_SERIAL ' 			$RTCONIF
		sed -i '$i #define MICROROS_DEVIVE "uart1" ' 	$RTCONIF
		echo "add macro: BSP_USING_UART1; USING_MICROROS; MICROROS_SERIAL; MICROROS_DEVIVE "
		# modify stm32h7xx_hal_msp.c
		cp micro_ros_rtthread/stm32h7xx_hal_msp.c board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c
fi

if [ "$CONFIG_NAME" == "micro_ros_pub_int32.c" ]; then
		sed -i '$i #define MICROS_EXAMPLE_PUB_INT32 ' 	$RTCONIF
		echo "add macro: MICROS_EXAMPLE_PUB_INT32 "
	elif [ "$CONFIG_NAME" == "micro_ros_sub_int32.c" ]; then
		sed -i '$i #define MICROS_EXAMPLE_SUB_INT32 ' 	$RTCONIF
		echo "add macro:define MICROS_EXAMPLE_SUB_INT32 "
	else
		help
	fi

	sed -i '$a source "micro_ros_rtthread/Kconfig" ' 	Kconfig
	echo 'add source :  source "micro_ros_rtthread/Kconfig" --> Kconfig'

4. 编译

通过create_firmware_ws.sh调用create.sh

主要通过configure_firmware.sh 调用configure.sh,实现:

  • 配置交叉编译链 ----> custom_toolchain.cmake & rtconfig.py
  • 编译microROS:最终会生成一个静态文件
  • 编译rtthread
ros2 run micro_ros_setup build_firmware.sh 

​ build.sh核心代码

colcon build \
		--merge-install \
		--packages-ignore-regex=.*_cpp \
		--metas $COLCON_META \
		--cmake-args \
		"--no-warn-unused-cli" \
		-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=OFF \
		-DTHIRDPARTY=ON \
		-DBUILD_SHARED_LIBS=OFF \
		-DBUILD_TESTING=OFF \
		-DCMAKE_BUILD_TYPE=Release \
		-DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN \
		-DCMAKE_VERBOSE_MAKEFILE=ON; \

pushd $RTTHREAD_DIR >/dev/null

	scons --target=vsc
	scons

popd >/dev/null

5. 下载

由于art-pi下载需要调用外部算法,不知道如何写成命令,所有这一步的脚本没有写

问题

micro_ros_rtthread/build/include/rmw/types.h 在编译时会报错误, 错误定位:

#ifndef _WIN32
# define RMW_DECLARE_DEPRECATED(name, msg) name __attribute__((deprecated(msg)))
#else
# define RMW_DECLARE_DEPRECATED(name, msg) name __pragma(deprecated(name))
#endif

为什么_WIN32宏定义被启用, 于是编译之前,修改:

#ifndef _WIN32
# define RMW_DECLARE_DEPRECATED(name, msg) name
#else
# define RMW_DECLARE_DEPRECATED(name, msg) name __pragma(deprecated(name))
#endif

week10

2022/09/05 - 2022/09/10

上周任务

  • 完成下载脚本编写;
  • 将外接串口换成USB虚拟串口;
  • 增加demo;
  • 尝试修复UDP bug;

完成情况

下载脚本编写:

完成,无问题

micro_ros_setup/config/rtthread/generic文件中增加flash.sh 调用 STM32CubeProgrammer 完成下载:

核心代码:

RTTHREAD_DIR=$FW_TARGETDIR/sdk-bsp-stm32h750-realthread-artpi/projects/art_pi_wifi
STLDR_DIR=$FW_TARGETDIR/sdk-bsp-stm32h750-realthread-artpi/debug/stldr/ART-Pi_W25Q64.stldr

STM32_Programmer_CLI -c port=swd -w "$RTTHREAD_DIR/rtthread.bin" 0x90000000 -v -el  $STLDR_DIR

将外接串口换成USB虚拟串口

完成,无问题

增加一个rtconfig.h文件,用于提前配置USB 虚拟串口;

增加demo

demo备注
micro_ros_pub_int32.cuart可用、udp4 可用
micro_ros_sub_int32.cuart可用、udp4 不可用
micro_ros_pub_sub_int32.cuart可用、udp4 不可用
micro_ros_ping_pong.cuart可用、udp4 不可用
micro_ros_addtwoints_server.cservice 客户端:似乎没有进入回调
micro_ros_addtwoints_client.cservice 客户端:回调接收的数据和实际不符合

UDP

参考:

 Micro-XRCE-DDS-Client/src/c/profile/transport/ip/udp/udp_transport_posix_nopoll.c 

对读写进行改写,publisher 没有问题, subscriber能正常建立,但是似乎进不去回调。

问题已经在micro_ros_setup 提出 link

周会拟讨论问题

  1. 是否可以提交pr;
  2. 解决service demos 的问题;

week11

2022/09/13 - 2022/09/18

上周任务

  • 完善第二问:借助scons --target=cmake, 实现将microROS嵌入rtthread,cmake负责编译microROS静态库,后续可以选择可以使用cmake或者scons编译整个工程;
  • 向 wuhanstudio/micro_ros 提交pr 完成第一二问;
  • UDP bug 反馈;

周会拟讨论问题

  • PR
  • UDP 的bug

microROS嵌入rtthread

shell 脚本 + cmake的方式

CMakeLists.txt

# build micro-ROS : make build_microros_lib
add_custom_target(build_microros_lib
	WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/micro-ROS-rtthread-app"
	COMMAND sh generate_microros_library.sh ${CMAKE_C_COMPILER} ${CMAKE_CXX_COMPILER} ${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS}
	COMMENT "build micro-ROS..."
)

# head files
INCLUDE_DIRECTORIES(micro-ROS-rtthread-app/microros/build/include)
INCLUDE_DIRECTORIES(micro-ROS-rtthread-app/transports)

#  teansport: serial
add_definitions(-DMICROROS_SERIAL)
add_definitions(-DMICROROS_DEVIVE="vcom")
list(APPEND PROJECT_SOURCES micro-ROS-rtthread-app/transports/rtt_serial_transports.c)

# example 
# pub_int32
add_definitions(-DMICROS_EXAMPLE_PUB_INT32)
list(APPEND PROJECT_SOURCES micro-ROS-rtthread-app/examples/micro_ros_pub_int32.c)

link_directories(${CMAKE_SOURCE_DIR}/micro-ROS-rtthread-app/microros/build)
LINK_LIBRARIES(microros)

shell 脚本

  • 下载ament相关包
  • 编译ament相关包
  • CMakeLists.txt 获取交叉编译链 相关宏定义,为编译microROS提供编译支持
  • 下载microROS相关包
  • 编译microROS相关包
  • 合并成静态库,打包头文件;

提交PR

  • 改正UDP bug(第一小问)
  • 增加两个example: micro_ros_pub_sub_int32.c; micro_ros_ping_pong.c
  • build static library for microROS by cmake:摆脱为每种内核保留一个静态库。(第二问)

UDP bug 反馈

代码应该没有什么问题,估计是rmw 问题,通过修改 ROS 2RMW_IMPLEMENTATION环境变量改善。刚开始有效果,但是目前没有效果了。

export RMW_IMPLEMENTATION=rmw_fastrtps_dynamic_cpp
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export RMW_IMPLEMENTATION= rmw_cyclonedds_cpp

week12

2022/09/19 - 2022/09/26

上周任务

  • 完成需要在2022开源之夏中提交的文档;
  • 提交PR;
  • 继续修复UDP subscriber & service的问题;

周会拟讨论的问题

  • UDP subscriber
  • 结尾事项;

日志

PR

PR地址: https://github.com/micro-ROS/micro_ros_setup/pull/581 , 目前没有回应

bug

对于service的问题可以确定是rmw 需要使用rmw_fastrtps

export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

对于UDP subscriber, 我使用sub_twist的问题和sub_int32的问题一样:没有回调

测试环境: docker