Rosserial和STM32

ROS机器人操作系统是用于创建机器人系统的功能强大的平台,其中包括开发项目所需的一切,从最简单的软件组件(称为“节点”)和数据交换协议到真正的凉亭机器人平台的仿真环境。 通常,ROS与Arduino平台上的此类微控制器结合使用。 互联网上充斥着许多关于ROS和Arduino的教程。

目前尚无关于将ROS机器人操作系统与STM32微控制器结合使用的信息。 互联网上只有很多问题。



开始吧


要使用STM32,我们需要STM32CubeMX和SystemworkbenchforSTM32。 关于它们在网络上的安装有很多信息,我们将不再赘述。

要配置控制器,请转到STM32CubeMX

创建一个新项目。



我们将选择一个具有STM32f103c8t6的微控制器。



在外围,我们表示已连接外部石英谐振器,其中有两个



配置可用于启用控制器调试的结论(展望未来,如果项目使用C ++,则调试可能无法进行)



让我们配置端口13的输出C,将内置LED与其连接。



设置UART引脚。



转到Lock_configuration并按照图片进行设置。



让我们继续进行外围设备的详细配置


串口

设置数据交换速率。



DMA设置。





配置中断,需要在UART上指定一个全局中断



GPIO设置




项目构建设置




我们在等你聚会



我们打开项目,



为STM32的System Workbench创建项目


在SW4STM32中打开了该项目,添加了一些外围控件,对其进行了组装,并刷新了控制器,但没有得到任何结果。

因此,我们根据以下说明创建一个新项目,并传输STM32CubeMX获得的配置。

为STM32的System Workbench创建项目


1)单击文件>新建> C项目

2)C项目
1)输入项目名称
2)选择项目类型:可执行文件> Ac6 STM32 MCU项目
3)选择工具链:Ac6 STM32 MCU GCC
4)点击“下一步”



3)选择一个微控制器
1)点击“创建新的自定义板”
1)保存新板定义
2)输入新板的名称:STM32F103
3)选择一个芯片板:STM32F1
4)选择MSU:STM32F103RCTx
5)点击确定。
2)选择您刚刚创建的板!
1)选择一个系列:STM32F1
2)选择一块板:STM32F103
3)点击“下一步”



4)我们连接库HAL



5)点击完成

添加文件


将多维数据集创建的src和inc文件的内容复制到我们的文件中,还复制STM32F103C8Tx_FLASH.ld



要测试STM32本身和while循环中代码的运行状况,请编写以下行

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(100); 

在这里,我们只是使LED闪烁。

组装期间,stm32f1xx_hal_msp.c文件中可能会出现问题。

与void函数HAL_MspInit(void)相关的错误如下修复。
使用HAL_Driver库打开文件夹,转到/ src,打开文件stm32f1xx_hal_msp_template.c并注释掉相同的功能:



重新组装(应正确组装)

我忘了提到控制器固件所需的st-flash实用程序。

 $ sudo apt-get install cmake $ sudo apt-get install libusb-1.0.0 $ git clone github.com/texane/stlink.git $ cd stlink $ make release $ cd build/Release; sudo make install $ sudo ldconfig 

使用ST链接

ST链路检测检查:

 $ st-info —probe 

作为回应,我们应该看到类似以下内容的内容:

 Found 1 stlink programmers serial: 563f7206513f52504832153f openocd: "\x56\x3f\x72\x06\x51\x3f\x52\x50\x48\x32\x15\x3f" flash: 262144 (pagesize: 2048) sram: 65536 chipid: 0x0414 descr: F1 High-density device 

要刷新控制器,请转到我们项目的文件夹,然后通过以下命令刷新控制器:

 cd workspace/ros_stm32_2/ st-flash write Debug/ros_stm32_2.bin 0x8000000 

已检查。 一切正常。 我们继续前进。

由于ROS库是用C ++编写的,因此我们将项目转换为C ++项目,并更改.cpp中的main.c,stm32f1xx_hal_msp.c,stm32f1xx_it.c文件的格式

我们正在使用不断增长的库和在STM32上运行rosserial所需的文件来克隆我的存储库。

 git clone https://gitlab.com/ivliev123/ros_lib 

将克隆的文件夹插入项目





让我们转到项目设置(属性),首先,连接库,转到...







改变布局





我们进行优化





好吧,现在我们要对main.cpp进行一些更改,因为它几乎是空的,我们要做的第一件事是连接ROS库以及用于与ROS主题或这些主题的数据类型进行交互的库。

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

创建一个发布该主题并接受的节点

 void led_cb( const std_msgs::UInt16& cmd_msg){ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); } ros::NodeHandle nh; std_msgs::String str_msg; ros::Publisher chatter("chatter", &str_msg); ros::Subscriber<std_msgs::UInt16> sub("led", led_cb); 

初始化main中的节点和主题。

  nh.initNode(); nh.advertise(chatter); nh.subscribe(sub); 

我们还添加了变量,以适应​​时间和发布内容。

 const char * hello = "Hello World!!"; int chatter_interval = 1000.0 / 2; int chatter_last = HAL_GetTick(); 

在while循环中,我们将得到以下内容。 一段时间后,我们将发布短语。

  if (nh.connected()) { if(HAL_GetTick() - chatter_last > chatter_interval) { str_msg.data = hello; chatter.publish(&str_msg); chatter_last = HAL_GetTick(); } } nh.spinOnce(); 

整理一个项目。

可能会出现以下错误:







重新组装并闪烁。

现在与ROS直接交互。
在一个终端中,运行ROS。

 roscore 

在下一次运行该节点。

 rosrun rosserial_python serial_node.py /dev/ttyUSB0 

我们得到以下

 [INFO] [1551788593.109252]: ROS Serial Python Node [INFO] [1551788593.124198]: Connecting to /dev/ttyUSB0 at 57600 baud [INFO] [1551788595.233498]: Requesting topics... [INFO] [1551788595.258554]: Note: publish buffer size is 2048 bytes [INFO] [1551788595.259532]: Setup publisher on chatter [std_msgs/String] [INFO] [1551788595.275572]: Note: subscribe buffer size is 2048 bytes [INFO] [1551788595.276682]: Setup subscriber on led [std_msgs/UInt16] 

接下来,在新的终端窗口中,查看主题

 rostopic list 

我们得到以下主题:

 /chatter /diagnostics /led /rosout /rosout_agg 

在聊天的主题中,控制器发布短语。

我们可以通过团队听

 rostopic echo /chatter 



现在将数据发送到主题领导。

 rostopic pub /led std_msgs/UInt16 "data: 0" 

而且我们必须更改LED的状态。

Source: https://habr.com/ru/post/zh-CN443022/


All Articles