软件使用的是STM32CubeIDE,所以配置、代码均是在这个IDE中完成的,我会把工程直接传上来,所以写的就简洁一点,部分配置或者说明可在上篇文章中查看。
先说明下,ROS是ROS1,运行平台是Ubuntu18.04,Ubuntu上配合的程序是rosserial,目前只测试了ROS的topic,且没有除开发板之外的实物,有需求可以自己拓展。
配置芯片使用的是STM32F427VIT6,需要配置RCC、SYS、TIM2、TIM9、USART1。时钟由于芯片不一致,所以先配置的120MHz,后期在代码中再修改为240M,定时器是直接用240M来配的;串口波特率57600,需要配置中断、DMA、上拉;TIM9是用来输出PWM的,模仿脉冲,当然电机驱动器通信方式多样,我均没有实施条件。
按照上面说明的配置完成后,下面来配置ROS部分。
-将ROS相关的文件夹拷贝到inc目录下(除软件生成的外均需复制)
-分别在inc和src目录下新建mainpp.h和mainpp.cpp,新建setup()和loop()函数并放到main.c中的init和死循环中。
-增加其他程序,下面一个是代码,一个是图片。
#include <mainpp.h>
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int16.h>
void command_callback(const std_msgs::String &rxbuff);
ros::NodeHandle nh;
std_msgs::String GD32_to_pc_word;
std_msgs::Int16 biu_biu;
ros::Subscriber<std_msgs::String> cmd_sub("pc_to_GD32", command_callback);
ros::Publisher GD32_to_pc("GD32_to_pc", &GD32_to_pc_word);
ros::Publisher biu("biu", &biu_biu);
void command_callback(const std_msgs::String &rxbuff) {
GD32_to_pc_word = rxbuff;
GD32_to_pc.publish(&GD32_to_pc_word);
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
nh.getHardware()->flush();
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
nh.getHardware()->reset_rbuf();
}
void setup(void) {
nh.initNode();
nh.advertise(GD32_to_pc);
nh.subscribe(cmd_sub);
nh.advertise(biu);
biu_biu.data = 0;
}
void loop(void) {
HAL_Delay(1000);
if(biu_biu.data<1000){
biu.publish(&biu_biu);
biu_biu.data++;
}else{
biu_biu.data=0;
}
nh.spinOnce();
}
-代码说明
--setup部分是初始化部分,即初始化节点、收发话题名称。
--loop部分是发布话题名称为biu的话题,话题格式是int16,且自增。
--其他则是收发话题定义和回调函数。
--图中没有PWM输出部分,在上传的代码中有。
-Ubuntu终端输入
--启动rosserial节点
--订阅话题rostopic echo /biu 和rostopic echo /GD32_to_pc,订阅后可以看到有输出了。
--发布话题命令rostopic pub -1 /pc_to_GD32 data:”[value]” ,[value]为任意字符串,发布后能看到/GD32_to_pc话题有输出且PWM有输出。
注意事项:
1、移植编译过程中会出现错误或警告,我这边解决了,如果使用其他软件,不保证完全能用。
2、不能通过串口调试助手查看单片机发出的数据。
3、如果需要使用自定义的话题格式,可以按照提供的头文件来写,其中MD5这个一串字符,需要在Ubuntu上新建同样的格式,到rosmaster注册后运行get MD5命令来获取。
原作者:东东_dxGGN2
|