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
- 使用STM32发布一个stm32_topic主题,之后STM32往该主题里面发送相应的数据,
通过ubuntu终端使用rostopic echo /stm32_topic可以查看到该主题里面的内容。
//主题stm32_topic
std_msgs::String str_msg;
ros::Publisher pub("stm32_topic", &str_msg);
- 使用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);
- 初始化、等待连接、并且发布订阅话题,在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端进行对比)
-
环境搭建ROS环境(我的pc端环境是ubuntu20.04)(这一步自行进行搭建)
-
在PC端使用以下指令下载rosserial包
git clone https://github.com/ros-drivers/rosserial.git //下载rosserial包 如果不能下载,更新一下再进行下载,可能需要下载git
- 在PC端使用以下指令编译rosserial包
catkin_make//编译rosserial包 如果不能编译,可能是没有下载catkin_make
- 打开一个终端,运行roscore,出现以下画面是运行成功的。
roscore //编译成功之后使用该指令运行roscore
- 新打开一个终端,将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
- 终端打印以下内容,出现我们想要的话题内容:
- 使用以下指令查看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);
}
}