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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
	}
   
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值