ROS与STM32通信-rosserial

文章目录

    • 硬件
      • 接线
    • 软件
      • STM32CubeMX配置
    • rosserial
    • 移植
    • 上位机订阅-下位机发布
      • 上位机订阅
      • 下位机发布
      • 通信
    • 上位机发布-下位机订阅
      • 上位机发布
      • 下位机订阅
      • 通信

硬件

  • STM32F103c8t6
  • OLED(I2C)
  • USB2TTL
  • Stlink

接线

OLED(GPIO模拟I2C)

硬件引脚
OLEDSCLPA4
OLEDSDAPA5

USART1

硬件引脚作用
RXPA9USART1_TX
TXPA10USART1_RX

LED

硬件引脚
LED0PC13
LED1PC15

软件

  • STM32CubeMX
  • Clion

STM32CubeMX配置

  • SYS->Debug->Serial Wire
  • RCC->HSE->Crystal/Ceramic Resonator
  • PC15->OutPut ,Label为LED0
  • PC13->OutPut ,Label为LED1
  • TIM1->Clock Source->Internal Clock
  • 时钟树,时钟设置为72M
  • USART1->Asynchronous Baud Rate: 115200

设置DMA

image-20230727095227292

开启串口中断

image-20230727095301013

rosserial

rosserial是ROS中的一个重要模块,它实现了ROS通信协议与各类嵌入式硬件平台之间的桥接,大大简化了ROS在底层硬件上的移植和应用。rosserial通过消息序列化和常用串行通信接口,实现了ROS主机和嵌入式客户端之间的消息交互,为各种嵌入式平台提供了C++和Python的ROS客户端库,使得在这些硬件上也能方便地使用ROS的通信架构来进行节点管理、话题通信和服务调用。rosserial还支持动态主题和服务,以较小的代码占用实现ROS功能,具有很强的可移植性。因此,rosserial是ROS物联网和机器人应用不可或缺的重要组件,极大地便利了ROS在各类嵌入式系统和小型机器人产品上的移植应用和开发。

rosserial_WIKI

image-20230727103754363

rosserial_stm32 Github地址

本文资源包stm32f103c8t6_rosserial, CSDN资源下载

移植

下载上述资源stm32f103c8t6_rosserial

git clone https://github.com/GHigher12/STM32f103c8t6_rosserial.git

or 直接在CSDN下载

将RosLibs文件夹添加到stm32工作文件里

image-20230727160334430

还有Core文件夹中的mainpp.h , round.h, mainpp.cpp

此时如果用Clion作为开发环境还需要修改CMakeList.txt

包含文件的路径

main.c使用

//...
#include "mainpp.h"
//...
int main(void)
{
//...setup();while (1){loop();}/* USER CODE END 3 */
}

上位机订阅-下位机发布

上位机订阅

python订阅 demo01_sub_py.py

#! /usr/bin/env python
import rospy
from std_msgs.msg import Stringif __name__ == "__main__":rospy.init_node("ros_pc_pub")pub = rospy.Publisher("pc_to_stm32",String,queue_size=10)msg = String()msg_front = "ros_2_stm32->"count = 0rate = rospy.Rate(1)while not rospy.is_shutdown():msg.data = msg_front + str(count)pub.publish(msg)rate.sleep()rospy.loginfo("发布的数据为:%s",msg.data)count += 1

c++订阅 demo01_sub_c.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>void doMsg(const std_msgs::String::ConstPtr &msg)
{ROS_INFO("订阅的数据为: %s", msg->data.c_str());
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc, argv, "ros_pc_sub");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("stm32_to_pc", 10, doMsg);ros::spin();return 0;
}

安装rosserial_python

sudo apt-get install ros-noetic-rosserial-python

下位机发布

mainpp.cpp

#include <mainpp.h>
#include <ros.h>
#include <std_msgs/String.h>
#include "main.h"ros::NodeHandle nh;std_msgs::String stm32_to_pc_word;ros::Publisher stm32_to_pc("stm32_to_pc", &stm32_to_pc_word);void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){nh.getHardware()->flush();
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){nh.getHardware()->reset_rbuf();
}
char hello[13] = "hello ros!";
u8 cnt = 0;
void setup(void)
{nh.initNode();nh.advertise(stm32_to_pc);
}void loop(void)
{cnt+=1;sprintf(oledBuf,"stm32_2_ros->%d",cnt);OLED_ShowString(0,24,(u8*)oledBuf,16);OLED_Refresh();stm32_to_pc_word.data = oledBuf;HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);HAL_Delay(1000);stm32_to_pc.publish(&stm32_to_pc_word);nh.spinOnce();
}

编译将程序烧录到stm32中

通信

将usb2ttl连接好usart1,连接电脑

执行下列命令

lsusb
ls /dev/ttyUSB*
sudo chmod 777 /dev/ttyUSB0

image-20230727162511985

启动rosserial_python节点

roscore
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0 _baud:=115200

出现以下内容则表示运行正常

[INFO] [1690446448.903399]: ROS Serial Python Node
[INFO] [1690446448.908570]: Connecting to /dev/ttyUSB0 at 115200 baud
[INFO] [1690446451.013146]: Requesting topics...
[INFO] [1690446451.772474]: Note: publish buffer size is 512 bytes
[INFO] [1690446451.774498]: Setup publisher on stm32_to_pc [std_msgs/String]

可使用rostopic echo /stm32_to_pc查看话题

image-20230727163158146

不过这里会出现[ERROR] [1690446652.290474]: Lost sync with device, restarting...报错,导致收发频率不一致,博主现在还没解决,如有读者有解决办法,可在评论留言。

python订阅

cd ~/catkin_ws
source ./devel/setup.bash
rosrun hello_vscode demo01_sub_py.py

image-20230727163637705

c++订阅

cd ~/catkin_ws
source ./devel/setup.bash
rosrun hello_vscode demo01_sub_c

image-20230727163815409

下位机显示

image-20230727165726493

查看rqt_graph

image-20230727163848358

上位机发布-下位机订阅

上位机发布

python发布 demo01_pub_py.py

#! /usr/bin/env python
import rospy
from std_msgs.msg import Stringif __name__ == "__main__":rospy.init_node("ros_pc_pub")pub = rospy.Publisher("pc_to_stm32",String,queue_size=10)msg = String()msg_front = "ros_2_stm32->"count = 0rate = rospy.Rate(1)while not rospy.is_shutdown():msg.data = msg_front + str(count)pub.publish(msg)rate.sleep()rospy.loginfo("发布的数据为:%s",msg.data)count += 1

c++发布 demo01_pub_c.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc, argv, "ros_pc_pub");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<std_msgs::String>("pc_to_stm32", 10);std_msgs::String msg;ros::Rate rate(1);int count = 0;ros::Duration(3).sleep();while (ros::ok){count++;std::stringstream ss;ss << "ros_2_stm32->" << count;msg.data = ss.str();pub.publish(msg);ROS_INFO("发布的数据为: %s", ss.str().c_str());rate.sleep();ros::spinOnce();  //处理回调函数}return 0;
}

下位机订阅

mainpp.cpp

#include <mainpp.h>
#include <ros.h>
#include <std_msgs/String.h>
#include "main.h"
void command_callback( const std_msgs::String& rxbuff);ros::NodeHandle nh;std_msgs::String stm32_to_pc_word;ros::Subscriber<std_msgs::String> cmd_sub("pc_to_stm32", command_callback);void command_callback(const std_msgs::String &rxbuff)
{char oled_rxbuff[128];stm32_to_pc_word = rxbuff;snprintf(oled_rxbuff, sizeof(oled_rxbuff), "%s", rxbuff.data);OLED_ShowString(0,24, (u8*)oled_rxbuff,16);OLED_Refresh();
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){nh.getHardware()->flush();
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){nh.getHardware()->reset_rbuf();
}
void setup(void)
{nh.initNode();nh.subscribe(cmd_sub);
}void loop(void)
{HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);HAL_Delay(1000);nh.spinOnce();
}

通信

python发布

rosrun hello_vscode demo01_pub_py.py

image-20230727165011538

c++发布

rosrun hello_vscode demo01_pub_c

image-20230727165221524

下位机显示

image-20230727165700807

查看rqt_graph

image-20230727165258149

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS3 Flexbox

Flex 是 Flexible Box 的缩写&#xff0c;意为弹性盒子布局。 CSS3中一种新的布局模式&#xff1a;W3C在2009年提出的一种布局方案&#xff0c;一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。其目的是提供一种更加有效的方式来对一个容器…

深度学习入门(二):神经网络整体架构

一、前向传播 作用于每一层的输入&#xff0c;通过逐层计算得到输出结果 二、反向传播 作用于网络输出&#xff0c;通过计算梯度由深到浅更新网络参数 三、整体架构 层次结构&#xff1a;逐层变换数据 神经元&#xff1a;数据量、矩阵大小&#xff08;代表输入特征的数量…

打造完美直播体验:美颜技术与美型SDK的融合

随着直播行业的蓬勃发展&#xff0c;主播们对于直播体验的要求也日益提高。其中&#xff0c;美颜技术和美型SDK的融合为主播们带来了前所未有的完美直播体验。本文将深入探讨美颜技术和美型SDK的原理与应用&#xff0c;以及这两者如何协同工作&#xff0c;为直播行业带来更具吸…

Clion开发stm32之微妙延迟(采用nop指令实现)

前言 需要借助逻辑分析仪动态调整参数此次测试的开发芯片为stm32f103vet6 延迟函数 声明 #define NOP_US_DELAY_MUL_CNT 5 /*nop 微妙延迟需要扩大的倍数(根据实际动态修改)*/ void bsp_us_delay_nop(uint32_t us);void bsp_ms_delay_nop(uint32_t ms);定义 void bsp_us_dela…

【QT 网络云盘客户端】——获取用户文件列表信息

目录 1.获取用户文件列表信息分析 2.设置图标属性 3.向服务器获取文件的数量 4.向服务器获取文件信息列表 4.显示图标 1.获取用户文件列表信息分析 1.将QListWidget设置为图标模式 2. 当我们点击"按下载量升序","按下载量降序",“更新” 菜单选项 都会…

【SQL Server】DBCC CHECKDB只是一个数据库维护命令吗?

日期&#xff1a;2023年7月27日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

JVM简述

JDK&JRE&JVMJVM运行时内存结构图方法区堆区栈区程序计数器本地方法栈 JVM 的主要组成部分及其作用 JDK&JRE&JVM JVM就是java虚拟机&#xff0c;一台虚拟的机器&#xff0c;用来运行java代码 但并不是只有这台机器就可以的&#xff0c;java程序在运行时需要依赖…

sql查询语句大全-详细讲解(格式、示例)

目录 范围查询 BETWEEN...AND in 为空 模糊查询 去重查询 AND OR 排序查询 聚合函数 1.count&#xff1a;计算个数 2.max&#xff1a;计算最大值 3.min&#xff1a;计算最小值 4.sum&#xff1a;计算和 5.avg&#xff1a;计算平均数 分组查询 group by 分组后…

观察者模式、中介者模式和发布订阅模式

观察者模式 定义 观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都将得到通知&#xff0c;并自动更新 观察者模式属于行为型模式&#xff0c;行为型模式关注的是对象之间的通讯&#xff0c;观察者模式…

Pytorch(一)

目录 一、基本操作 二、自动求导机制 三、线性回归DEMO 3.1模型的读取与保存 3.2利用GPU训练时 四、常见的Tensor形式 五、Hub模块 一、基本操作 操作代码如下: import torch import numpy as np#创建一个矩阵 x1 torch.empty(5,3)# 随机值 x2 torch.rand(5,3)# 初始化…

NoSQL之Redis配置使用

目录 一、关系数据库与非关系型数据库 1.1.关系型数据库的概述 1.2关系型数据库的优缺点 1.2.1优点 1.2.2缺点 1.3.非关系型数据库的概述 二.关系数据库与非关系型数据库的区别 2.1数据存储方式不同 2.2扩展方式不同 2.3对事务性的支持不同 2.4非关系型数据库产生背景 2…

浅析嵌入式GUI框架-LVGL

LVGL是什么&#xff1f; LVGL (Light and Versatile Graphics Library) 是最流行的免费开源嵌入式图形库&#xff0c;可为任何 MCU、MPU 和显示类型创建漂亮的 UI。 嵌入式GUI框架对比 Features/框架LVGLFlutter-elinuxArkUI(鸿蒙OS)AWTKQTMIniGUIemWinuC/GUI柿饼UI跨平台…

【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

文章目录 前言struct tags 的使用使用反引号避免使用空格避免重复使用标准化的 tag 名称多个 tag 值 struct tags 的原理struct tags 的优势常用的 struct tags参考文章&#xff1a; 前言 在 Go 语言中&#xff0c;struct 是一种常见的数据类型&#xff0c;它可以用来表示复杂…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(8)-Fiddler如何设置捕获会话

1.简介 前边几篇宏哥介绍了Fiddler界面内容以及作用。今天宏哥就讲解和分享如何设置Fiddler后&#xff0c;我们就可以捕获会话&#xff0c;进行抓包了。 2.捕获会话的设备 常见的捕获会话的设备分为PC&#xff08;电脑&#xff09;端和手机&#xff08;Android和IOS苹果&…

Bert经典变体学习

ALBert ALBERT就是为了解决模型参数量大以及训练时间过长的问题。ALBERT最小的参数只有十几M, 效果要比BERT低1-2个点&#xff0c;最大的xxlarge也就200多M。可以看到在模型参数量上减少的还是非常明显的&#xff0c;但是在速度上似乎没有那么明显。最大的问题就是这种方式其实…

使用CRM分析数据有哪些功能?

CRM数据分析软件可以帮助企业增强竞争力&#xff0c;并更好地了解客户需求及市场变化&#xff0c;助力企业数据分析&#xff0c;并提供实时更新的数据和分析结果&#xff0c;CRM数据分析软件的主要特点是什么&#xff1f;包括以下6个特点。 CRM数据分析软件的主要功能通常包括…

SpringBoot 和 Vue 参数类型不对应,导致method parameter is not present

org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter id for method parameter type String is not present 客户端&#xff1a; requestUserInfoById()const requestUserInfoById async (id?: string) > {} 服务器端&am…

亚马逊云科技全新Amazon Bedrock,助力客户构建生成式AI应用

亚马逊云科技近日在纽约峰会上宣布全面扩展其全托管基础模型服务Amazon Bedrock&#xff0c;包括新增Cohere作为基础模型供应商&#xff0c;加入Anthropic和Stability AI的最新基础模型&#xff0c;并发布变革性的新功能Amazon Bedrock Agents功能。客户无需管理任何基础设施&a…

ChatGPT统计“一到点就下班”的人数

ChatGPT统计“一到点就下班”的人数 1、到点下班 Chatgpt统计各部门F-D级员工到点下班人数占比&#xff0c;是在批评公司内部存在到点下班现象。 根据图片&#xff0c;该占比的计算方法是&#xff1a;最后一次下班卡在17:30-17:40之间&#xff0c;且1-5月合计有40天以上的人…

OpenCV图像处理-视频分割静态背景-MOG/MOG2/GMG

视频分割背景 1.概念介绍2. 函数介绍MOG算法MOG2算法GMG算法 原视频获取链接 1.概念介绍 视频背景扣除原理&#xff1a;视频是一组连续的帧&#xff08;一幅幅图组成&#xff09;&#xff0c;帧与帧之间关系密切(GOP/group of picture)&#xff0c;在GOP中&#xff0c;背景几乎…