我叫吴晗,现在是华中科技大学能源学院研究生,专业是工程热物理,今年6月份就要毕业了。虽然我的专业工程热物理看起来好像和 RT-Thread 物联网操作系统、ROS机器人操作系统并没有太大联系,但是在这个学科交叉、专业融合的时代,我觉得专业只会给一个人带来更多的自由,而不是束缚。
最早接触 RT-Thread应该是在半年前,终于考完 GRE 决定好好放松一下,刚好看见 “2018 RT-Thread 物联网开发者沙龙(武汉站)”,就打算趁着周末过去学习体验一下。其实之前我用 buildroot 在 荔枝派nano 上构建 linux 根文件系统的时候,就在官方文档上看到过 RT-Thread 的支持,不过当时 RT-Thread 还没给我留下太深的印象。在周末的分享会上,用官方提供的 env 工具 很方便地就在 STM32 Cortex-M3 上配置好了 RTT 内核,还可以选择各种已经移植好的软件包,RT-Thread一下就吸引了我。用 env 配置 RTT 内核和软件包,给我一种用 buildroot 配置 linux 内核和软件包的感觉,非常轻松愉悦。
在分享会最后的提问环节上,有人提到 RT-Thread 对显示屏 UI 的支持还不算太好,而我刚好在那之前把单色液晶屏驱动库 u8g2 移植到了 arm linux 上,于是分享会回来之后就把 u8g2 移植到了 RT-Thread 上,这样 RT-Thread 就可以使用几十种单色屏了,这也是我第一次给 RT-Thread 移植软件包,虽然有很多不足,但是为我之后移植 rosserial 提供了不少经验,今天要介绍的就是上周移植的机器人操作系统(ROS)软件包 rosserial。
想到把 roserial 移植到 RT-Thread 是因为 RTT 支持的处理器非常多,这样只要把 rosserial 移植到了 RT-Thread 上,那么很多 MCU 就都能作为 ROS 机器人的节点了。这样说不定以后机器人就分为2个部分 ROS + RT-Thread 了:大量的计算用高性能主节点用 Ubuntu 跑 ROS,外设节点用 RT-Thread 采集传感器数据,感觉这样搭配还是挺不错的 ~
ROS (Robots Operating System) 在机器人领域应当是用得相当广了,最早是斯坦福大学的一个软件框架,现在不管是工业机器人,还是娱乐用的机器人都运行着ROS。
一个机器人通常有很多个部件、传感器,为了保证机器人不会因为某一个传感器故障,导致整个系统瘫痪,所以采用了分布式的节点,利用不同节点之间的通讯收集传感器数据和控制指令,当中一个通讯协议就是 rosserial。
有了 rosserial 之后,就可以用一个比较强劲的处理器像 x64,ARM 来进行大量计算,像SLAM、图像识别等,而用一些计算性能不是那么强的 MCU 如 AVR,STM32 M0/M3 来和外设通讯,采集传感器数据,这样整个机器人系统的节点都是可以热插拔替换的,稳定性就很强了。
安装过程可以参照 ROS 的官网,现在官方支持最好的还是 Debian 系列,下面以 Ubuntu 安装 ROS Melodic 为例:
1sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
1sudo sh -c 'echo 'deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main' > /etc/apt/sources.list.d/ros-latest.list'
2sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
3sudo apt update
4sudo apt install ros-melodic-desktop-full
1sudo rosdep init
2rosdep update
3echo 'source /opt/ros/melodic/setup.bash' >> ~/.bashrc
4source ~/.bashrc
1roscore
使用 rosserial 需要在 RT-Thread 的包管理器中选择它,通信方式可以选择TCP/UART,具体路径如下:
1RT-Thread online packages
2 peripheral libraries and drivers --->
3 [*] rosserial: a protocol for Robots Operating System (ROS)
4 Device type (UART) --->
5 (uart2) serial device name
6 roserial examples --->
7 [*] Hello World : hello world example using UART
如果使用 TCP 当然要先确保 rt-thread 有网卡设备,并获取到 IP 地址,例如:
enc28j60 + lwip
ESP8266 + AT Client
同时需要确认 BSD Socket API 支持是打开的:
1RT-Thread Components --->
2 Network --->
3 Socket abstraction layer --->
4 -*- Enable socket abstraction layer
然后就可以生成项目编译上传了
1pkgs --update
2scons --target=mdk5 -s
首先需要在 Ubuntu 上启用 rosserial:
如果使用的串口:
1rosrun rosserial_python serial_node.py /dev/ttyUSB0
如果使用的 TCP:
1rosrun rosserial_python serial_node.py tcp
当 ubuntu 和 rt-thread 用串口或者TCP连接上之后,就可以收到发来的消息了,以 hello world 为例:
1$ rostopic echo /chatter
2
3data: hello world
4---
5data: hello world
6---
7data: hello world
8---
当然,rosserial 还提供了其他各种传感器的数据包格式,这也是使用 ROS 的好处之一了。
项目主页:
https://github.com/wuhanstudio/rt-rosserial
原始项目:
https://github.com/ros-drivers/rosserial
联系客服