0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread如何使用串口或者无线和ROS连接

STM32单片机 来源:STM32单片机 2020-05-29 17:05 次阅读

引言

这篇文档主要介绍 RT-Thread 如何使用串口或者无线和 ROS 连接,会包含这么些内容:

第一部分:ROS 环境搭建

第二部分:RT-Thread rosserial 软件包

第二部分:RT-Thread 添加 USART2 和 PWM

第三部分:RT-Thread 使用 ESP8266 AT 固件联网

这里先介绍一下什么是 ROS?为什么要和 ROS 连接?

机器人操作系统 ROS (Robots Operating System) 最早是斯坦福大学的一个软件框架,现在不管是工业机器人,还是娱乐用的机器人都运行着 ROS。

图片来源网络,如有侵权请联系删除

一个机器人通常有很多个部件、传感器,为了保证机器人不会因为某一个传感器故障,导致整个系统瘫痪,所以采用了分布式的节点,利用不同节点之间的通讯收集传感器数据和控制指令,这篇文档后面会使用到的通讯协议就是rosserial。 和 ROS 连接的好处在于,一方面由 ROS 管理各个机器人节点更稳定,另一方面 ROS 现在已经有了非常多成熟的软件包,使用 ROS 就可以非常方便的为自己的机器人添加摄像头图像识别、激光雷达建图导航等高级功能。 不过这篇文档只会涉及 RT-Thread 和 ROS 建立基本的连接,实现小车的运动控制,之后可能会有后续文档介绍如何连接激光雷达建图,并进行全局路径规划。

这篇文章假定大家都已经会用 RT-Thread 的 env 工具下载软件包,生成项目上传固件到 stm32 上,并且熟悉 Ubuntu 的基本使用。

1 ROS 简介

这里的开发环境搭建其实是需要搭建 2 份,一份是小车上的 ARM 开发板 (树莓派,NanoPi 什么的),另一个则是自己的电脑,因为我们希望把电脑作为 ROS 从节点,连接到小车上的 ROS 主节点,不过开发板和电脑的 ROS 安装是一模一样的。

既然要和 ROS 连接,那么首先就得要有一个正常运行的 ROS。安装 ROS 其实非常简单,这里推荐使用 Ubuntu 18 (开发板推荐系统用 Armbian),因为官方对 Ubuntu 的支持优先级是最高的,安装教程也可以参照官网:http://wiki.ros.org/melodic/Installation/Ubuntu 只需要输入下面的 4 行命令,就在 Ubuntu 上装好了 ROS。

1sudosh-c'echo"debhttps://mirror.tuna.tsinghua.edu.cn/ros/ubuntu$(lsb_release-sc)main">/etc/apt/sources.list.d/ros-latest.list' 2sudoapt-keyadv--keyserver'hkp://keyserver.ubuntu.com:80'--recv-keyC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 3sudoaptupdate 4sudoaptinstallros-melodic-ros-base上面我使用了清华大学的镜像源,这样从国内下载 ROS 会快很多,而且我只安装了 ROS 的基本软件包,没有安装图形化软件包 gviz,gazebo 什么的,因为后面也没有用到。

1.2 ROS 环境初始化

ROS 安装好之后还需要进行初始化,不过也是只有短短几行命令:

1sudorosdepinit 2rosdepupdate 3 4echo"source/opt/ros/melodic/setup.bash">>~/.bashrc 5source~/.bashrc 1.3 启动 ROS 启动 ROS 的话我们需要确保它是常驻后台运行的,所以我们可以使用 tmux:1roscore

在 tmux 里启动了 ROS 主节点后,我们就可以 Ctrl + B D 退出了,而 ROS 主节点依旧在后台运行。

1.4 参考文献

Armbian:https://www.armbian.com/

ROS Melodic 安装//wiki.ros.org/melodic/Installation/Ubuntu

2 RT-Thread 串口连接 ROS

这一部分会介绍如何使用串口将运行着 RT-Thread 的 STM32 开发板和运行着 ROS 的 ARM 开发板连接,看起来差不多就是这样。

这里说明一下不同开发板的分工,STM32 运行着 RT-Thread 负责控制电机,接收传感器信息;ARM 运行着 ROS 负责进行全局控制,例如给小车发出前进的指令。

2.1 RT-Thread 配置

首先我们需要打开 usart2,因为 usart1 被 msh 使用了,保留作为调试还是挺方便的。

在 CubeMX 里我打开了 USART2,另外还打开了 4 路 PWM,因为我后面使用了 2 个电机,每个电机需要 2 路 PWM 分别控制前进和后退。 接下来还需要在 menuconfig 里面打开对应的选项,考虑到有的开发板默认的 bsp 可能没有这些选项,可以修改 board/Kconfig 添加下面的内容。串口的配置:

1menuconfigBSP_USING_UART 2bool"EnableUART" 3defaulty 4selectRT_USING_SERIAL 5ifBSP_USING_UART 6configBSP_USING_UART1 7bool"EnableUART1" 8defaulty 9 10configBSP_UART1_RX_USING_DMA 11bool"EnableUART1RXDMA" 12dependsonBSP_USING_UART1&&RT_SERIAL_USING_DMA 13defaultn 14 15configBSP_USING_UART2 16bool"EnableUART2" 17defaulty 18 19configBSP_UART2_RX_USING_DMA 20bool"EnableUART2RXDMA" 21dependsonBSP_USING_UART2&&RT_SERIAL_USING_DMA 22defaultn 23endifPWM 的配置:1menuconfigBSP_USING_PWM 2bool"Enablepwm" 3defaultn 4selectRT_USING_PWM 5ifBSP_USING_PWM 6menuconfigBSP_USING_PWM3 7bool"Enabletimer3outputpwm" 8defaultn 9ifBSP_USING_PWM3 10configBSP_USING_PWM3_CH1 11bool"EnablePWM3channel1" 12defaultn 13configBSP_USING_PWM3_CH2 14bool"EnablePWM3channel2" 15defaultn 16configBSP_USING_PWM3_CH3 17bool"EnablePWM3channel3" 18defaultn 19configBSP_USING_PWM3_CH4 20bool"EnablePWM3channel4" 21defaultn 22endif 23endif

这样我们在 env 下就可以看到有对应的配置了,

除此之外,我们还需要选择 rosserial 软件包:

可以看到上面默认的串口就是 USART2,这样我们就可以生成对应的工程了:

1pkgs--update 2scons--target=mdk5-s如果我们打开 Keil 项目,首先需要把 main.c 修改为 main.cpp,因为 rosserial 很多数据格式的定义都是用 C++ 写的,所以如果要使用 rosserial 库,我们先得把后缀改为 cpp,这样 Keil 就会用 C++ 编译器编译。

下面是 main.cpp 的内容,其实就是初始化了电机,然后发布了 2 个话题 (topic),一个是 /vel_x 告诉 ROS 当前小车的速度,一个是 /turn_bias 告诉 ROS 当前小车的旋转速度。同时又订阅了一个话题 /cmd_vel,用来接收从 ROS 发出的控制指令。 代码不是特别长,我也添加了一些注释,所以这里就不一行行分析了。

1#include 2#include 3#include 4 5#include 6#include 7#include 8#include"motors.h" 9 10ros::NodeHandlenh; 11MotorControlmtr(1,2,3,4);//Motor 12 13boolmsgRecieved=false; 14floatvelX=0,turnBias=0; 15charstat_log[200]; 16 17//接收到命令时的回调函数 18voidvelCB(constgeometry_msgs::Twist&twist_msg) 19{ 20velX=twist_msg.linear.x; 21turnBias=twist_msg.angular.z; 22msgRecieved=true; 23} 24 25//Subscriber 26ros::Subscribersub("cmd_vel",velCB); 27 28//Publisher 29std_msgs::Float64velX_tmp; 30std_msgs::Float64turnBias_tmp; 31ros::Publisherxv("vel_x",&velX_tmp); 32ros::Publisherxt("turn_bias",&turnBias_tmp); 33 34staticvoidrosserial_thread_entry(void*parameter) 35{ 36//Initmotors,specif>ytherespectivemotorpins 37mtr.initMotors(); 38 39//Initnode> 40nh.initNode(); 41 42//订阅了一个话题/cmd_vel接收控制指令 43nh.subscribe(sub); 44 45//发布了一个话题/vel_x告诉ROS小车速度 46nh.advertise(xv); 47 48//发布了一个话题/turn_bias告诉ROS小车的旋转角速度 49nh.advertise(xt); 50 51mtr.stopMotors(); 52 53while(1) 54{ 55//如果接收到了控制指令 56if(msgRecieved) 57{ 58velX*=mtr.maxSpd; 59mtr.moveBot(velX,turnBias); 60msgRecieved=false; 61} 62 63velX_tmp.data=velX; 64turnBias_tmp.data=turnBias/mtr.turnFactor; 65 66//更新话题内容 67xv.publish(&velX_tmp); 68xt.publish(&turnBias_tmp); 69 70nh.spinOnce(); 71} 72} 73 74intmain(void) 75{ 76//启动一个线程用来和ROS通信 77rt_thread_tthread=rt_thread_create("rosserial",rosserial_thread_entry,RT_NULL,2048,8,10); 78if(thread!=RT_NULL) 79{ 80rt_thread_startup(thread); 81rt_kprintf("[rosserial]Newthreadrosserial "); 82} 83else 84{ 85rt_kprintf("[rosserial]Failedtocreatethreadrosserial "); 86} 87returnRT_EOK; 88}

另外还有对应的电机控制的代码,不过这个大家的小车不同,驱动应当也不一样,我这里由于小车电机上没有编码器,所以全部是开环控制的。

motors.h

1#include 2 3classMotorControl{ 4public: 5//Var 6rt_uint32_tmaxSpd; 7floatmoveFactor; 8floatturnFactor; 9 10MotorControl(intfl_for,intfl_back, 11intfr_for,intfr_back); 12voidinitMotors(); 13voidrotateBot(intdir,floatspd); 14voidmoveBot(floatspd,floatbias); 15voidstopMotors(); 16private: 17structrt_device_pwm*pwm_dev; 18//Thepins 19intfl_for; 20intfl_back; 21intfr_for; 22intfr_back; 23intbl_for; 24intbl_back; 25intbr_for; 26intbr_back; 27}; motors.c1#include 2#include 3#include"motors.h" 4 5#definePWM_DEV_NAME"pwm3" 6 7MotorControl::MotorControl(intfl_for,intfl_back, 8intfr_for,intfr_back) 9{ 10this->maxSpd=500000; 11this->moveFactor=1.0; 12this->turnFactor=3.0; 13 14this->fl_for=fl_for; 15this->fl_back=fl_back; 16 17this->fr_for=fr_for; 18this->fr_back=fr_back; 19} 20 21voidMotorControl::initMotors(){ 22/*查找设备*/ 23this->pwm_dev=(structrt_device_pwm*)rt_device_find(PWM_DEV_NAME); 24if(pwm_dev==RT_NULL) 25{ 26rt_kprintf("pwmsamplerunfailed!can'tfind%sdevice! ",PWM_DEV_NAME); 27} 28rt_kprintf("pwmfound%sdevice! ",PWM_DEV_NAME); 29rt_pwm_set(pwm_dev,fl_for,maxSpd,0); 30rt_pwm_enable(pwm_dev,fl_for); 31 32rt_pwm_set(pwm_dev,fl_back,maxSpd,0); 33rt_pwm_enable(pwm_dev,fl_back); 34 35rt_pwm_set(pwm_dev,fr_for,maxSpd,0); 36rt_pwm_enable(pwm_dev,fr_for); 37 38rt_pwm_set(pwm_dev,fr_back,maxSpd,0); 39rt_pwm_enable(pwm_dev,fr_back); 40} 41 42//小车运动 43voidMotorControl::moveBot(floatspd,floatbias){ 44floatsL=spd*maxSpd; 45floatsR=spd*maxSpd; 46intdir=(spd>0)?1:0; 47 48if(bias!=0) 49{ 50rotateBot((bias>0)?1:0,bias); 51return; 52} 53 54if(sL< -moveFactor * maxSpd) 55    { 56        sL = -moveFactor * maxSpd; 57    } 58    if( sL >moveFactor*maxSpd) 59{ 60sL=moveFactor*maxSpd; 61} 62 63if(sR< -moveFactor * maxSpd) 64    { 65        sR = -moveFactor * maxSpd; 66    } 67    if( sR >moveFactor*maxSpd) 68{ 69sR=moveFactor*maxSpd; 70} 71 72if(sL< 0)  73    { 74        sL *= -1; 75    } 76 77    if (sR < 0)  78    { 79        sR *= -1; 80    } 81 82    rt_kprintf("Speed Left: %ld ", (rt_int32_t)sL); 83    rt_kprintf("Speed Right: %ld ", (rt_int32_t)sR); 84 85    if(dir) 86    { 87        rt_pwm_set(pwm_dev, fl_for, maxSpd, (rt_int32_t)sL); 88        rt_pwm_set(pwm_dev, fl_back, maxSpd, 0); 89        rt_pwm_set(pwm_dev, fr_for, maxSpd, (rt_int32_t)sR); 90        rt_pwm_set(pwm_dev, fr_back, maxSpd, 0); 91    } 92    else 93    { 94        rt_pwm_set(pwm_dev, fl_for, maxSpd, 0); 95        rt_pwm_set(pwm_dev, fl_back, maxSpd, (rt_int32_t)sL); 96        rt_pwm_set(pwm_dev, fr_for, maxSpd, 0); 97        rt_pwm_set(pwm_dev, fr_back, maxSpd, (rt_int32_t)sR); 98    } 99 100    rt_thread_mdelay(1); 101} 102 103 104// 小车旋转 105void MotorControl::rotateBot(int dir, float spd) { 106    float s = spd * maxSpd; 107    if (dir < 0)  108    { 109        s *= -1; 110    } 111    if(dir) 112    { 113        // Clockwise 114        rt_pwm_set(pwm_dev, fl_for, maxSpd, (rt_int32_t)s); 115        rt_pwm_set(pwm_dev, fl_back, maxSpd, 0); 116        rt_pwm_set(pwm_dev, fr_for, maxSpd, 0); 117        rt_pwm_set(pwm_dev, fr_back, maxSpd, (rt_int32_t)s); 118    } 119    else 120    { 121        // Counter Clockwise 122        rt_pwm_set(pwm_dev, fl_for, maxSpd, 0); 123        rt_pwm_set(pwm_dev, fl_back, maxSpd, (rt_int32_t)s); 124        rt_pwm_set(pwm_dev, fr_for, maxSpd, (rt_int32_t)s); 125        rt_pwm_set(pwm_dev, fr_back, maxSpd, 0); 126    } 127    rt_thread_mdelay(1); 128} 129 130//Turn off both motors 131void MotorControl::stopMotors()  132{ 133    rt_pwm_set(pwm_dev, fl_for, maxSpd, 0); 134    rt_pwm_set(pwm_dev, fl_back, maxSpd, 0); 135    rt_pwm_set(pwm_dev, fr_for, maxSpd, 0); 136    rt_pwm_set(pwm_dev, fr_back, maxSpd, 0); 137}一共只需要这么一点代码就可以实现和 ROS 的连接了,所以其实 ROS 也不是那么神秘,它就是因为简单好用所以才这么受欢迎的。 既然 RT-Thread 已经配置好了,下一步就是 ROS 的配置了。

2.2 ROS 配置

我们把上面 RT-Thread 的固件传到板子上以后,可以用一个 USB-TTL 一边和 STM32 控制板的 USART2 连接,另一边插到 ARM 控制板的 USB 口,接下来就可以建立连接了,在 ARM 板上输入命令:

1$rosrunrosserial_pythonserial_node.py/dev/ttyUSB0如果看到下面的输出,那就成功建立连接了:1tpl@nanopineoplus2:~$rosrunrosserial_pythonserial_node.py/dev/ttyUSB0 2[INFO][1567239474.258919]:ROSSerialPythonNode 3[INFO][1567239474.288435]:Connectingto/dev/ttyUSB0at57600baud 4[INFO][1567239476.425646]:Requestingtopics... 5[INFO][1567239476.464336]:Note:publishbuffersizeis512bytes 6[INFO][1567239476.471349]:Setuppublisheronvel_x[std_msgs/Float64] 7[INFO][1567239476.489881]:Setuppublisheronturn_bias[std_msgs/Float64] 8[INFO][1567239476.777573]:Note:subscribebuffersizeis512bytes 9[INFO][1567239476.785032]:Setupsubscriberoncmd_vel[geometry_msgs/Twist]

2.3 ROS 控制小车

既然已经成功建立连接了,下一步就是写小车控制的代码了。 我们先初始化一个工作区间:

1$mkdircatkin_workspace&&cdcatkin_workspace 2$catkin_init_workspace

接下来创建一个软件包:

1$cdsrc 2$catkin_create_pkgmy_first_pkgrospy 这样就会自动在 src 目录创建一个 ROS 软件包了。 我们在 catkin_workspace/src/my_first_pkg/src 目录下新建一个文件 ros_cmd_vel_pub.py:1#!/usr/bin/python 2 3importrospy 4fromgeometry_msgs.msgimportTwist 5frompynput.keyboardimportKey,Listener 6 7vel=Twist() 8vel.linear.x=0 9 10defon_press(key): 11 12try: 13if(key.char=='w'): 14print("Forward") 15vel.linear.x=0.8 16vel.angular.z=0 17 18if(key.char=='s'): 19print("Backward") 20vel.linear.x=-0.8 21vel.angular.z=0 22 23if(key.char=='a'): 24print("CounterClockwise") 25vel.linear.x=0 26vel.angular.z=-0.8 27 28if(key.char=='d'): 29print("Clockwise") 30vel.linear.x=0 31vel.angular.z=0.8 32 33returnFalse 34 35exceptAttributeError: 36print('specialkey{0}pressed'.format(key)) 37returnFalse 38 39defon_release(key): 40vel.linear.x=0 41vel.angular.z=0 42 43returnFalse 44 45#InitNode 46rospy.init_node('my_cmd_vel_publisher') 47pub=rospy.Publisher('cmd_vel',Twist,queue_size=10) 48 49#Setrate 50rate=rospy.Rate(10) 51 52listener=Listener(on_release=on_release,on_press=on_press) 53 54whilenotrospy.is_shutdown(): 55print(vel.linear.x) 56pub.publish(vel) 57vel.linear.x=0 58vel.angular.z=0 59rate.sleep() 60 61ifnotlistener.running: 62listener=Listener(on_release=on_release,on_press=on_press) 63listener.start() 这就是我们的 python 控制程序了,可以使用键盘的 wasd 控制小车前进后退,顺时针、逆时针旋转。我们需要给它添加可执行权限:1$chmodu+x./ros_cmd_vel_pub.py

这样就可以编译软件包了,在 catkin_worspace 目录下。

1$catkin_make 2$sourcedevel/setup.bash

我们终于就可以启动程序从电脑上控制小车运动了:

1rosrunmy_first_pkgros_cmd_vel_pub.py 可以看到用 ROS 实现小车控制其实代码量并不算多,只需要在自己小车原有的代码上发布一些话题,告诉 ROS 小车当前的状态,并且订阅一个话题接收 ROS 的控制指令就可以了。

2.4 参考文献

ros-pibot:https://github.com/wuhanstudio/ros-pibot

3 RT-Thread 无线连接 ROS

3.1 rosserial 配置

其实无线连接和有线连接几乎是一模一样的,只不过是先用 ESP8266 使自己的控制板能连上网,然后用 tcp 连接和 ROS 通信,关于 RT-Thread 使用 ESP8266 上网的教程可以参照官网:https://www.rt-thread.org/document/site/application-note/components/at/an0014-at-client/,非常详细了,我这里就不重复了。 确保开发板有网络连接后,我们就可以在 rosserial 里面配置为使用 tcp 连接:

我们只需要在上一部分的 main.cpp 里添加一行代码:

1//设置ROS的IP端口号 2nh.getHardware()->setConnection("192.168.1.210",11411); 3 4//添加在节点初始化之前 5nh.initNode();开发板就能通过 tcp 连接和 ROS 通信了,非常方便。

3.2 ROS 配置

由于我们使用了 tcp 连接,所以 ROS 上自然也要开启一个服务器了,之前是使用的串口建立连接,现在就是使用 tcp 了:

1$rosrunrosserial_pythonserial_node.pytcp

其他的代码完全不需要改变,这样我们就实现了一个 ROS 无线控制的小车了。

3.3 参考文献

RT-Thread 使用 ESP8266 上网:

https://www.rt-thread.org/document/site/application-note/components/at/an0014-at-client/

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

    关注

    14

    文章

    1483

    浏览量

    74502
  • 智能车
    +关注

    关注

    21

    文章

    395

    浏览量

    76691
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38865
  • ROS
    ROS
    +关注

    关注

    1

    文章

    271

    浏览量

    16673

原文标题:RT-Thread+STM32实现智能车目标识别系统的教程

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32L051上使用RT-Thread (四、串口通讯)

    应用篇-在STM32L051上使用RT-Thread 第四篇,巧妙的使用信号量处理串口通讯。
    的头像 发表于 06-28 10:59 4591次阅读
    STM32L051上使用<b class='flag-5'>RT-Thread</b> (四、<b class='flag-5'>串口</b>通讯)

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4402次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    RT-Thread+STM32实现智能车目标识别系统的教程

    RT-Thread+STM32实现智能车目标识别系统的教程引言这篇文档主要介绍 RT-Thread 如何使用串口或者无线
    发表于 05-20 16:55

    RT-Thread如何使用串口或者无线ROS连接

    这篇文档主要介绍 RT-Thread 如何使用串口或者无线ROS 连接,会包含这么些内容:第
    发表于 12-28 07:02

    RT-Thread+STM32实现智能车目标识别系统的教程 精选资料推荐

    引言这篇文档主要介绍 RT-Thread 如何使用串口或者无线ROS 连接,会包含这么些内容
    发表于 08-23 06:47

    RT-Thread实时操作系统与ROS2是怎样进行通信的

    加工装配之前,先在模拟环境确保可以实现预期的运动,也避免了不必要的试错过程。当然,Gazebo 也可以和实际的机器人连接进行联合调试 :RT-ThreadROS那么问题来了,前面提到 R
    发表于 04-01 11:38

    如何使用RT-Thread串口设备

    即可。引入了带设备管理框架的实时操作系统 RT-Thread 后,串口的使用则与裸机或者其它 RTOS 有很大的不同之处。RT-Thread 中自带 I/O 设备管理层,将各种各样的硬
    发表于 10-25 11:05

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT-Thread实时操作系统的编程指南
    发表于 11-26 16:06 0次下载

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-Inside的开发板——iBox物联网开发套
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b>开发,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    记录——基于 RT-Thread 实现 USB 虚拟串口

    记录——基于 RT-Thread 实现 USB 虚拟串口记录一下我在正点原子 F429 阿波罗开发板上实现 USB 虚拟串口的过程,希望可以帮助到其他想要学习 USB 的人。首先,我更新了一下
    发表于 12-02 17:21 6次下载
    记录——基于 <b class='flag-5'>RT-Thread</b> 实现 USB 虚拟<b class='flag-5'>串口</b>

    RT-Thread开源作品秀】基于RT-Thread的星务平台研究

    本作品为了验证星务软件在RT-Thread系统运行的可行性,底层是否能够驱动星务软件,同时扩展RT-Thread应用范围。ART-Pi作为卫星下位机,...
    发表于 01-25 18:26 5次下载
    【<b class='flag-5'>RT-Thread</b>开源作品秀】基于<b class='flag-5'>RT-Thread</b>的星务平台研究

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 3989次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    快速上手micro rosRT-Thread

    快速上手micro ros && RT-Thread(serial和udp方式)
    的头像 发表于 10-26 16:13 383次阅读
    快速上手micro <b class='flag-5'>ros</b>在<b class='flag-5'>RT-Thread</b>上