STM32F407移植ROS,使用PC端ROS和STM32F407端通过rosserial进行通信

本文介绍了如何在STM32F407上移植ROS并使用rosserial进行与PC端Ubuntu的通信,包括发布和订阅主题、GPIO控制以及PC端环境的搭建和串口节点的运行。
摘要由CSDN通过智能技术生成

STM32F407移植ROS,使用PC端ROS和STM32F407端通过rosserial进行通信

一、STM32端(我使用的是STM32F4)

  • 参考文章1,STM32F1:https://blog.csdn.net/qq_36349536/article/details/82773064
  • 参考文章2,STM32F4:https://blog.csdn.net/qq_19598969/article/details/116176009
  • 参考文章3,HAL库(非标准库):https://blog.csdn.net/qq_37416258/article/details/84844051
  1. 使用STM32发布一个stm32_topic主题,之后STM32往该主题里面发送相应的数据,
    通过ubuntu终端使用rostopic echo /stm32_topic可以查看到该主题里面的内容。
//主题stm32_topic
std_msgs::String str_msg;
ros::Publisher pub("stm32_topic", &str_msg);

在这里插入图片描述

  1. 使用STM32 订阅一个pc_topic话题,之后在pc端可以使用指令往该话题推送消息
//从主题读取消息
// 回调函数,处理接收到的消息
void topicCallback(const std_msgs::String& msg) {
  // 打印接收到的消息内容
//	str_msg.data = "Hello from STM32";
	pub.publish(&msg);//将消息发布到主题
	//进行pc端发送过来的数据比较
	if( strncmp(msg.data,"Hello",5) == 0){
		GPIO_ResetBits(GPIOB, GPIO_Pin_0);
	}else{
		GPIO_SetBits(GPIOB, GPIO_Pin_0);
	}
   
}
ros::Subscriber<std_msgs::String> sub("pc_topic", topicCallback);

在这里插入图片描述

  1. 初始化、等待连接、并且发布订阅话题,在pc端如果打印**robot_Star Connected!**说明连接成功。
    在这里插入图片描述
	nh.initNode();                         //初始化
	while (!nh.connected())                //等待连接
	{
		nh.spinOnce();

		nh.advertise(pub);
		nh.subscribe(sub);

	} 		
  
	nh.loginfo("robot_Star Connected!");   //打印连接成功  

二、PC(ubuntu端)(注意这里从第四步可以配合以上STM32端进行对比)

  1. 环境搭建ROS环境(我的pc端环境是ubuntu20.04)(这一步自行进行搭建)

  2. 在PC端使用以下指令下载rosserial包

git clone https://github.com/ros-drivers/rosserial.git //下载rosserial包  如果不能下载,更新一下再进行下载,可能需要下载git

  1. 在PC端使用以下指令编译rosserial包
catkin_make//编译rosserial包   如果不能编译,可能是没有下载catkin_make
  1. 打开一个终端,运行roscore,出现以下画面是运行成功的。
roscore //编译成功之后使用该指令运行roscore

在这里插入图片描述

  1. 新打开一个终端,将usb-ttl连接到ubuntu,使用指令查看串口,一般情况下是ttyUSB0
ls /dev/ttyUSB*

6.运行串口节点,等待,配合stm32程序,如果出现 "robot_Star Connected!"则说明连接成功。
接下来就可以进行主题发布和订阅了

rosrun rosserial_python serial_node.py /dev/ttyUSB0
这一步可能报错没有包rosserial_python,解决办法如下:
https://blog.csdn.net/weixin_43700534/article/details/124078821

在这里插入图片描述
6. 新建一个终端,在终端输入以下指令可以查看到我们的话题列表。

rostopic list 
  • 终端打印以下内容,出现我们想要的话题内容:
    在这里插入图片描述
  1. 使用以下指令查看STM32发布话题stm32_topic 里面的内容:
rostopic echo /stm32_topic 

在这里插入图片描述
8. 新建一个终端,在终端往STM32订阅的话题pc_topic里推送消息。

rostopic pub /pc_topic std_msgs/String "data: 'Hello'"
  • 终端情况是这样的:
    在这里插入图片描述
  • 再结合我们STM32里面的回调函数代码,可以清晰看出,内容是符合我们预想的情况。当话题pc_topic里面有消息推送时,将该消息推送到话题stm32_topic,同时终端打印话题stm32_topic内容。
// 回调函数,处理接收到的消息
void topicCallback(const std_msgs::String& msg) {
  // 打印接收到的消息内容
//	str_msg.data = "Hello from STM32";
	pub.publish(&msg);//将消息发布到主题
	//进行pc端发送过来的数据比较
	if( strncmp(msg.data,"Hello",5) == 0){
		GPIO_ResetBits(GPIOB, GPIO_Pin_0);
	}else{
		GPIO_SetBits(GPIOB, GPIO_Pin_0);
	}
   
}
  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ROS(Robot Operating System)是一个开源的机器人操作系统,它提供了一系列的软件库和工具,用于帮助开发者构建机器人应用程序。而STM32是一系列由意法半导体(STMicroelectronics)公司开发的32位微控制器。 在ROS中与STM32进行串口通信,可以通过以下步骤实现: 1. 首先,在STM32的固件中编写串口通信的代码,包括初始化串口、发送数据和接收数据的功能。STM32提供了一些库函数来简化这些操作,例如HAL库或者LL库。 2. 在ROS中,使用serial库来进行串口通信。可以通过以下命令安装serial库: ``` sudo apt-get install ros-<distro>-serial ``` 其中,`<distro>`是你所使用ROS版本,例如`melodic`或`noetic`。 3. 在ROS中创建一个节点(Node),节点是ROS中最基本的执行单元,用于处理数据和执行操作。在该节点中,可以使用serial库来打开STM32所连接的串口,并进行数据的发送和接收。你可以根据需要编写相应的ROS节点来实现特定的功能。 4. 在ROS节点中,可以使用ROS的消息机制来定义并发布接收到的数据。例如,你可以定义一个自定义消息类型来表示从STM32接收到的数据,并将其发布到ROS话题(Topic)上,以供其他节点订阅和使用。 5. 如果需要向STM32发送数据,可以创建一个订阅该话题的节点,并在其中编写相应的代码来解析数据并通过串口发送给STM32。 通过以上步骤,你可以在ROS中实现与STM32的串口通信。请注意,具体的实现细节可能会因ROS的版本和你所使用STM32型号而有所不同,你需要根据实际情况进行相应的调整和修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值