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:
将克隆的文件夹插入项目


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



改变布局


我们进行优化


好吧,现在我们要对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的状态。