ROS为上位机与STM32为下位机串口通讯(一)

2023-05-16

 

摘自:https://blog.csdn.net/qq_38422317/article/details/95335967?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

ROS为上位机与STM32为下位机串口通讯(一)

 

Eleven-boy 2019-07-10 15:27:27 1715 收藏 15

分类专栏: ROS学习

版权

STM32通过串口向ROS上位机发送信息

主要实现了STM32 通过串口向ROS上位机发送数据,发布者将接收到的数据发布出去并打印出来,订阅者订阅发布者发布的消息并打印出来,最后通过roslaunch启动。

STM32端

u16 times=0;
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
int main(void)
{   
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);		
	uart_init(115200);	    //波特率115200
	while(1)
	{
			times++;
			printf("%3d\r\n",times);
			if(times>=100) times=0; 
			delay_ms(100);   
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

ROS端

创建工作空间

mkdir -p ~/serial/src
cd ~/serial/src
catkin_init_workspace 
  • 1
  • 2
  • 3

编译

cd ~/serial/
catkin_make
  • 1
  • 2

设置环境变量

echo "source ~/serial/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
  • 1
  • 2

创建功能包

catkin_create_pkg serial_communication roscpp std_msgs
  • 1

在/catkin_ws/src/serial_communication/src/下新建serial_communication_pub.cpp和serial_communication_sub.cpp
serial_communication_pub.cpp内容如下

#include <string>
#include <ros/ros.h>// 包含ROS的头文件
#include <boost/asio.hpp>//包含boost库函数
#include <boost/bind.hpp>
#include <std_msgs/String.h>//ros定义的String数据类型

using namespace std;
using namespace boost::asio;//定义一个命名空间,用于后面的读写操作

unsigned char times_buf[5];//接收区

int main(int argc,char** argv)
{
    ros::init(argc,argv,"serial_communication_pub");//初始化节点
    ros::NodeHandle n;//创建节点句柄
    /*创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String*/
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);
    ros::Rate loop_rate(10);//设置循环频率10Hz

    io_service iosev;
    serial_port sp(iosev, "/dev/ttyUSB0");//定义传输的串口
    sp.set_option(serial_port::baud_rate(115200));//波特率115200
    sp.set_option(serial_port::flow_control());//串口选项允许更改流量控制,默认值0
    sp.set_option(serial_port::parity());//奇偶性,默认值为none
    sp.set_option(serial_port::stop_bits()); //停止位,默认值为1
    sp.set_option(serial_port::character_size(8));  //数据位,默认值为8

    while(ros::ok())
    {
        read(sp,buffer(times_buf));
        string str(&times_buf[0],&times_buf[4]);//将数组转化为字符串

        std_msgs::String msg;
        std::stringstream ss;
        ss << str;

        msg.data = ss.str();

        ROS_INFO("%s",msg.data.c_str());//打印接受到的字符串

        chatter_pub.publish(msg);         //发布消息

        ros::spinOnce();

        loop_rate.sleep();       
    }
    iosev.run();
    return 0;
}


serial_communication_sub.cpp内容如下

#include <ros/ros.h>
#include <std_msgs/String.h>

//接收到订阅消息后,进入消息回调函数执行任务
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I hear:%s",msg->data.c_str());
}

int main(int argc, char **argv)
{
    /* code for main function */
    ros::init(argc, argv, "serial_communication_sub");//初始化ROS节点
    
    ros::NodeHandle n;//创建节点句柄

    /*创建一个Subscriber,订阅名为chatter的话题,注册回调函数chatterCallback*/
    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
    
    ros::spin();//循环等待回调函数
    return 0;
}

打开 ~/serial/src/serial_communication/CMakeLists.txt, 最后面加上:

add_executable(serial_communication_pub src/serial_communication_pub.cpp)
target_link_libraries(serial_communication_pub ${catkin_LIBRARIES})

add_executable(serial_communication_sub src/serial_communication_sub.cpp)
target_link_libraries(serial_communication_sub ${catkin_LIBRARIES})
  • 1
  • 2
  • 3
  • 4
  • 5

保存
在/catkin_ws/src/serial_communication/下新建文件夹launch
并在launch文件夹下新建一个serial_communication_pub.launch文件
未见内容如下

<launch>
	<node pkg="serial_communication" type="serial_communication_pub" name="serial_communication_pub" output="screen" />
	<node pkg="serial_communication" type="serial_communication_sub" name="serial_communication_sub" output="screen" />
</launch>
  • 1
  • 2
  • 3
  • 4

写好后记得再次编译

cd ~/serial/
catkin_make
  • 1
  • 2

最后运行

autolabor@autolabor-host:~$ roslaunch serial_communication serial_communication_pub.launch 
... logging to /home/autolabor/.ros/log/b1175c24-a2e2-11e9-8d53-000c299981e9/roslaunch-autolabor-host-11059.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://autolabor-host:40439/

SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.13

NODES
  /
    serial_communication_pub (serial_communication/serial_communication_pub)
    serial_communication_sub (serial_communication/serial_communication_sub)

auto-starting new master
process[master]: started with pid [11069]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to b1175c24-a2e2-11e9-8d53-000c299981e9
process[rosout-1]: started with pid [11082]
started core service [/rosout]
process[serial_communication_pub-2]: started with pid [11099]
process[serial_communication_sub-3]: started with pid [11100]
[ INFO] [1562743016.360922738]:  51
[ INFO] [1562743016.365478840]: I hear: 51
[ INFO] [1562743016.460078115]:  52
[ INFO] [1562743016.460510462]: I hear: 52
[ INFO] [1562743016.560876337]:  53
[ INFO] [1562743016.561298464]: I hear: 53
[ INFO] [1562743016.664422539]:  54
[ INFO] [1562743016.664840175]: I hear: 54
[ INFO] [1562743016.761167086]:  55
[ INFO] [1562743016.761580444]: I hear: 55
[ INFO] [1562743016.860703796]:  56
[ INFO] [1562743016.861023292]: I hear: 56
[ INFO] [1562743016.973725366]:  57
[ INFO] [1562743016.974084649]: I hear: 57
[ INFO] [1562743017.060380804]:  58
[ INFO] [1562743017.060940934]: I hear: 58
[ INFO] [1562743017.160667823]:  59
[ INFO] [1562743017.161122159]: I hear: 59
[ INFO] [1562743017.260142425]:  60
[ INFO] [1562743017.260559162]: I hear: 60
[ INFO] [1562743017.360150478]:  61
[ INFO] [1562743017.362249269]: I hear: 61
[ INFO] [1562743017.460271112]:  62
[ INFO] [1562743017.460853910]: I hear: 62

运行之前要先

sudo minicom

否则打印出的数据有问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS为上位机与STM32为下位机串口通讯(一) 的相关文章

  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新

随机推荐