海军 · 2023年10月10日 · 宁夏

【XR806开发板试用】+microROS移植

前言

由于microROS移植的移植比较繁琐本文只介绍移植流程,关于流程实现的细节,请参考文章中的链接。如果只是想体验microROS,可以直接clone 已经移植好的代码。
其他关于移植的旁支笔记,可以关注微信公众号:“嵌入式的佛系达人”进行了解。

移植可行性分析

micrROS主要针对中高端的32位单片机,其占用内存根据节点数量和消息类型变化而变化,一般来说,micro-ROS 需要数十 KB 的RAM ,其支持主要硬件如下:

板卡

image.png

详细支持硬件详见链接1
支持平台

  • FreeRTOS;
  • ThreadX;
  • Arduino;
  • Zephyr;
  • ...

其更详细的支持平台,见micr-ROS仓库[2]

XR806的CPU为Arm-Star ARMv8-M,288KB SRAM,160KB Code ROM. 和16Mbit Flash。从内存上来说,满足要求。另外本次测评的是XR806 FreeRTOS 的SDK,也属于miro-ROS的支持平台之中,加大将miroROS移植到XR806中的可能性。

对于外设,一般都使用uart和UDP。XR806也满足要求。

综上,将miroROS移植到XR806中,具有可行性;

micro-ROS框架

 title=

从框架可以看出,FreeRTOS系统是很容易接入micro-ROS,关于micro-ROS框架的详细描述,请参考官网或Robot Operating System (ROS)这本书籍

移植

1. microROS静态库编译

由于microROS静态库的编译比较繁琐,本文直接提供编译好的静态库:

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

如果有想了解microROS静态库的移植细节,请查看以下链接:

XR806-micro-ROS移植-串口通信

2. 添加接口函数

micro-ROS和PC上的ROS服务端通信需要实现rmw_uros_set_custom_transportAPI 中的内容:

rmw_uros_set_custom_transport(
    true, // Framing enabled here. Using Stream-oriented mode.
    (void *) &args,
    my_custom_transport_open,
    my_custom_transport_close,
    my_custom_transport_write,
    my_custom_transport_read
);

从定义来说,则是实现通信方式的初始化,读、写三个功能

本次实现uart和udp通信,关于实现细节,请参考以下两篇链接:

使用

前提条件:xr806的FReeRTOS SDK可以正常使用

1 code

下载SDK

mkdir xr806_sdk 
cd xr806_sdk
git clone https://sdk.aw-ol.com/git_repo/XR806/xr806_sdk/xr806_sdk.git

下载移植好microROS代码

# code 
cd project/demo
git clone https://github.com/navy-to-haijun/microROS_XR806.git

文件必须放在demo路径下,否则会编译出错
文件结结构:

.
├── book        # 参考资料
│   └── Robot_Operating_System_(ROS).pdf
├── command.c
├── command.h
├── example        # 测试demo
│   ├── micro_ros_pub_int32.c        # 测试订阅
│   ├── micro_ros_pub_sub.c            # 测试发布
│   └── micro_ros_sub_int32.c        # 同时测试发布和订阅
├── gcc
│   ├── defconfig
│   └── Makefile                    # 编译规则
├── image
│   └── xr806
├── main.c                            # 组函数
├── microros                        # 移植好的microROS
│   ├── include                        # microROS头文件
│   └── libmicroros.a                # microROS静态文件库
├── prj_config.h
├── readme.md
└── transport                        # 实现microROS的通信
    ├── microros_xr806.h
    ├── serial_transport.c            # uart通信实现
    └── udp_transport.c                # udp 通信实现
  • 该demo提供microROS的静态库和相关头文件;
  • 提供两种通信方式:udp和串口,通过microros_xr806.h中的宏定义#define MICROROS_UDP#define MICROROS_SERIAL决定UPD相关代码是否被编译;
  • 提供三个测试demo;通过microros_xr806.h中的宏定义#define MICROROS_PUB_INT32#define MICROROS_SUB_INT32, MICROROS_PUB_SUB决定哪个demo测试被编译;

2 宏定义选择

/*microROS相关宏定义*/
/*通信方式*/
#define MICROROS_UDP 
// #define MICROROS_SERIAL

/*demo选择*/
// #define MICROROS_PUB_INT32
// #define MICROROS_SUB_INT32
#define MICROROS_PUB_SUB

通信方式选择udp,demo选择MICROROS\\\_PUB\\\_SUB

3 编译

cp project/demo/microROS_XR806/gcc/defconfig .config
#检查SDK的配置是否正常
 make menuconfig
 # 清理,切换工程时需要
 make build_clean
 # 编译成镜像文件
 make build -j6

4 下载

cd tools
./phoenixMC -i ../out/microros_system.img

效果

https://www.bilibili.com/video/BV1PC4y1d7si/?aid=789383752&cid=1291779869&page=null

该视频中,microROS在xr806中实现一个节点xr806_pub_sub,两个话题:

  • xr806_pub_Int32:实现发布功能;
  • xr806_sub_Int32:实现订阅功能;

实现xr806和PC上的ROS2的双向通信。

推荐阅读
关注数
13823
内容数
139
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息