快速上手micro ros在RT-Thread上

电子说

1.2w人已加入

描述

快速上手micro ros && RT-Thread(serial和udp方式)

1.准备工作
克隆GitHub:RT-Thread主仓:

$ git clone https://github.com/RT-Thread/rt-thread.git
克隆 env-windows:

$ git clone --recursive --depth 1 https://github.com/RT-Thread/env-windows.git
克隆下来的 env-windows 可以放在D盘,同时双击打开 env.exe,待启动ConEmu终端后将其注册到右键列表

ROS

克隆指定win_arm-gcc分支micro_ros_rtthread_component仓库

$ git clone -b win_arm-gcc https://github.com/kurisaW/micro_ros_rtthread_component.git
目录层次如下:

├─micro_ros_rtthread_component
│ ├─.images
│ ├─builder
│ │ ├─extra_packages
│ │ ├─metas
│ │ ├─microros_utils
│ │ └─patchs
│ │ ├─foxy
│ │ └─humble
│ ├─docs
│ ├─examples
│ ├─include
│ ├─package
│ │ └─micro_ros_rtthread_package
│ └─src
这里我们只需要micro_ros_rtthread_package目录!!注意不要复制错了,将这个目录复制到.env-windowspackages目录下,之后micro_ros_rtthread_component目录就可以删掉了,同时我们修改.env-windowspackagesKconfig内容如下:

source "$PKGS_DIR/packages/Kconfig"
source "$PKGS_DIR/micro_ros_rtthread_package/Kconfig"

2.指定bsp
选择一份 bsp 进行 micro_ros 的开发,这里我使用的是 RTT 最近出的星火Spark

$ cd .rt-threadbspstm32stm32f407-rt-spark
去官网下载 gcc-arm-none-eabi-10-2020-q4-major-win32工具链,注意不用配置到环境变量中,以免发生冲突

修改 bsp 工程下的 rtconfig.py 文件,指定 gcc 工具链

ROS

回到.rt-threadbspstm32stm32f407-rt-spark目录下,打开 ConEmu 执行如下命令

$ pkgs --update
$ cd packages

此处克隆 micro_ros 配置仓库

$ git clone -b win_arm-gcc https://github.com/kurisaW/micro_ros_rtthread_component.git

生成CMakeLists.txt

$ cd ..
$ scons --target=cmake
此时我们在当前目录下就可以看见一个 CMakeLists.txt文件了,同时我们进入目录.rt-threadbspstm32stm32f407-rt-sparkpackagesmicro_ros_rtthread_componentbuilder,找到toolchain.cmake文件,参考前面生成的CMakeLists.txt文件修改toolchain.cmake

ROS

再次回到.rt-threadbspstm32stm32f407-rt-spark目录下,打开 ConEmu 勾选配置:

[ ] micro-ROS package for RTThread
[
] Include examples
Distribution (Foxy) --->
Memory configuration --->
ROS node communication mode (serial) --->
其中在Memory configuration中的Publishers和Subscribers这两个参数值要求大于2,因为在 micro_ros 的示例工程:micro_ros_ping_pong要求至少两个发布者和两个订阅者,同时我们选择通信模式为 serial

此外,我们需要一个串口进行通信,根据板载情况勾选一个串口设备,并确保该串口成功创建,同时我们使用 vscode 打开文件packagesmicro_ros_rtthread_componentsrcrtt_serial_transport.c,搜索宏MICRO_ROS_SERIAL_NAME并修改为你新创建的串口设备名

3.编译准备工作
首先去官网安装如下工具:

python(大于python36)
cmake(大于v3.22)

打开windows powershell(管理员),安装如下工具:

1.scons工具

$ pip3 install scons

2.GNU make工具,可以参考该issue(https://github.com/kurisaW/micro_ros_rtthread_component/issues/5),这里我选择的是使用choco安装make

$ Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
$ choco install make

为了防止在下载过程中 GitHub 仓库拉取失败,可以下一个 Fastgithub 来加速 GitHub

4.开始编译
回到.rt-threadbspstm32stm32f407-rt-spark目录下,鼠标右键打开 windows powershell ,输入如下命令:

scons --build_microros
此时我们就可以看到 python 会自动安装依赖包并且开始下载 microros所需的依赖库,并且该依赖库的安装位置位于 C:UsersUSERAppDataLocalTempmicro下,这里的配置项主要位于packagesmicro_ros_rtthread_componentbuilderSConscript文件中,由于不同的工具链和平台所使用的一些标准C库函数有不同差异,所以目前我是基于 cortex-M4 适配了 micro_ros 库,在packagesmicro_ros_rtthread_componentbuildermicroros_utilsrepositories.py文件中更改了一些仓库分支为我修改的仓库分支,后续会以补丁文件的形式发布

ROS

编译完成后会使用 ar 将所有依赖的 micro_ros 库文件动态链接成 packagesmicro_ros_rtthread_componentbuilderlibmicroroslibmicroros.a文件,同时将C:Users20537AppDataLocalTempmicromcuinstallinclude目录复制到packagesmicro_ros_rtthread_componentbuilderlibmicrorosinclude目录下

编译完成后我们就得到了 rt-thread.elf 文件,可以使用 STM32CubeProgrammer 工具进行烧录到星火Spark上

5.WSL安装及 usbipd 支持
WSL安装:WSL的安装具体可以看网上怎么操作的,此处不再赘述

Docker安装:打开wsl终端,使用官网脚本一键安装即可

$ curl -fsSL https://test.docker.com -o test-docker.sh
$ sudo sh test-docker.sh

6.serial测试
相关命令:

windows powershell端

$ usbipd wsl list // 查看系统USB设备列表
$ usbipd wsl attach --hardware-id "usb-id" // 连接usb至wsl

wsl ubuntu20.04(注意:目前支持的microros版本:foxy支持的ubuntu版本为ubuntu20.04)

$ sudo docker run -it -v /dev:/dev --privileged microros/micro-ros-agent:foxy serial --dev /dev/ttyACM0 // 运行docker microros:foxy代理
$ ros2 topic list // 查看ros topic列表
$ ros2 topic echo /micro_ros_rtt_subscriber // 打印话题详情
$ ros2 topic pub /micro_ros_rtt_subscriber std_msgs/msg/Int32 data: 10 // 发布topic data值为10

7.udp4测试
准备工作
1.首先需要在linux本地 搭建好 ROS 环境

请注意:我们安装的ros版本为 foxy

2.搭建 micro-ros 构建环境

打开linux终端,按照如下步骤一步步走:

激活ros:foxy环境

$ source /opt/ros/foxy/setup.bash

创建工作区并拉取micro_ros_setup仓库

** mkdir /home/**user/microros_ws && cd /home/$user/microros_ws
$ git clone -b foxy https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

更新rosdep

$ sudo apt update
$ export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml
$ rosdep update --include-eol-distros
$ rosdep install --from-paths src --ignore-src -y
$ sudo apt-get install python3-pip

colcon编译

$ colcon build
$ source install/local_setup.bash

创建一份固件工作区

$ ros2 run micro_ros_setup create_firmware_ws.sh host

构建固件

$ ros2 run micro_ros_setup build_firmware.sh
$ source install/local_setup.bash

创建microros代理

$ ros2 run micro_ros_setup create_agent_ws.sh

构建代理

$ ros2 run micro_ros_setup build_agent.sh
$ source install/local_setup.bash
完成上述工作后我们micro ros的代理环境就准备就绪了

关键代码

开启micro_ros 代理

ros2 run micro_ros_agent micro_ros_agent udp4 --port 9999
udp测试流程

几点说明
1.为什么编译不使用 ConEmu :因为 ConEmu 内部集成的是 python27 ,而 micro_ros 编译所需的 python 版本最低为 python36,建议使用 python38 及以上版本

2.如果是使用的串口方式通信,不推荐在虚拟机上运行docker microros 代理,虚拟机似乎会造成消息的多次转发,导致无法正常接收到数据,建议使用 windows wsl服务

3.如果是使用UDP通信的话,并且在wsl中运行 agent ,需要允许 WLS 的出入站规则,可以打开windows powershell ,并输入如下代码:

允许 WSL 入站规则,请打开 Windows PowerShell ,并输入如下命令

$ New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow

允许 WSL 出站规则,请打开 Windows PowerShell ,并输入如下命令

$ New-NetFirewallRule -DisplayName "WSL" -Direction Outbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
4.如果使用udp通信不建议使用docker运行agent,docker不能直接外部访问IP,建议还是在linux本地搭建好 micro-ros代理环境

5.具体的实现细节在此处没有具体说明,如果是基于其他平台移植,并且想要一起学习的可以艾特我一起讨论,后面会考虑对多个架构进行支持适配

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分