前言
由于microROS移植的移植比较繁琐本文只介绍移植流程,关于流程实现的细节,请参考文章中的链接。如果只是想体验microROS,可以直接clone 已经移植好的代码。
其他关于移植的旁支笔记,可以关注微信公众号:“嵌入式的佛系达人”进行了解。
移植可行性分析
micrROS主要针对中高端的32位单片机,其占用内存根据节点数量和消息类型变化而变化,一般来说,micro-ROS 需要数十 KB 的RAM ,其支持主要硬件如下:
板卡
详细支持硬件详见链接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框架
从框架可以看出,FreeRTOS系统是很容易接入micro-ROS,关于micro-ROS框架的详细描述,请参考官网或Robot Operating System (ROS)这本书籍
移植
1. microROS静态库编译
由于microROS静态库的编译比较繁琐,本文直接提供编译好的静态库:
git clone https://github.com/navy-to-haijun/microROS_XR806.git
如果有想了解microROS静态库的移植细节,请查看以下链接:
2. 添加接口函数
micro-ROS和PC上的ROS服务端通信需要实现rmw_uros_set_custom_transport
API 中的内容:
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通信,关于实现细节,请参考以下两篇链接:
- uart通信:XR806-micro-ROS移植-串口通信
- udp通信:XR806的micro-ROS移植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的双向通信。