ROS + STM32 + mbed

目前的进度是, 首先, 用mbed, 在stm32 f103RB nucleo板子上, 跑一个简单的publisher, 然后用usb连接到PC上的ROS.

mbed的main.cpp:

/*
 * rosserial Publisher Example
 * Prints "hello world!"
 */

/*
*  left_forward    PC_0
*  left_backward   PC_3
*  right_forward   PC_2
*  right_backward  PC_1
*  left_pwm        PA_6
*  right_pwm       PA_7
*  encoder_left_a_add_int PC_10
*  encoder_left_b_add_int PC_11
*  encoder_right_a_add_int PC_12
*  encoder_right_b_add_int PD_2
*
*/

#include"mbed.h"
#include <ros.h>
#include <string>
#include <std_msgs/String.h>
#include <iomanip>
#include <locale>
#include <sstream>
#define PWM_STEP 0.001f

DigitalOut myled(LED1);
ros::NodeHandle  nh;

std_msgs::String str_msg;

ros::Publisher chatter("chatter", &str_msg);

DigitalOut left_forward(PC_0);
DigitalOut left_backward(PC_3);

DigitalOut right_forward(PC_2);
DigitalOut right_backward(PC_1);

DigitalOut led(LED1);
PwmOut left_pwm(PA_6);
PwmOut right_pwm(PA_7);

InterruptIn button(USER_BUTTON);

InterruptIn encoder_left_a_add_int(PC_10);
InterruptIn encoder_left_b_add_int(PC_11);

InterruptIn encoder_right_a_add_int(PC_12);
InterruptIn encoder_right_b_add_int(PD_2);

float leftPwmOut=0.0f;
float rightPwmOut=0.0f;

int pwmDirection=1;

long long left_encoder_counter = 0;
long long right_encoder_counter = 0;

void left_encoder(void)
{
    left_encoder_counter++;
}

void right_encoder(void)
{
    right_encoder_counter++;
}

void setup(void)
{
    left_forward=1;
    left_backward=0;
    right_forward=1;
    right_backward=0;

    left_pwm.period_us(100);
    right_pwm.period_us(100);
    //left_pwm.write(0.50f);
    //moto_pwm.write(1.0f);
    encoder_left_a_add_int.rise(&left_encoder);
    encoder_left_b_add_int.rise(&left_encoder);

    encoder_right_a_add_int.rise(&right_encoder);
    encoder_right_b_add_int.rise(&right_encoder);
}

float getPwm(float pwmout)
{
    float result=0.0;

    if(pwmDirection) {
        result = pwmout + PWM_STEP;
        if(result >= 1.0f) {
            result = 1.0f;
            pwmDirection = 0;
        }
    } else {
        result = pwmout - PWM_STEP;
        if(result <= 0.0f) {
            result = 0.0f;
            pwmDirection = 1.0f;
        }
    }
    return result;
}

void publishChatter()
{
    std::stringstream ss;
    ss<<"[odom]L:"<<left_encoder_counter<<",R:"<<right_encoder_counter;

    const std::string tmp = ss.str();
    const char* cstr = tmp.c_str();
    str_msg.data=cstr;
    chatter.publish( &str_msg );
    nh.spinOnce();
}
int main()
{

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

    //int i = 12345;

    setup();
    //button.rise(&adder);
    //encoder_add_int.rise(&encoder);
    //nh.initNode();
    //nh.advertise(chatter);
    while(1) {

        leftPwmOut=getPwm(leftPwmOut);
        rightPwmOut=getPwm(rightPwmOut);

        //right_pwm.write(rightPwmOut);
        //left_pwm.write(leftPwmOut);
        right_pwm.write(0.4f);
        left_pwm.write(0.4f);

        //myled = 1; // LED is ON
        wait(0.01); // 10 ms
        //myled = 0; // LED is OFF
        //wait(0.2); // 1 sec
        publishChatter();
    }

}

每隔10ms publish一次获得的编码器累加值.

ROS端用:

$ rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0

跑一个py脚本, 跟nucleo通讯, 同时发布/chatter

接着用Eclipse起一个节点, 接收chatter, 回调的时候, 将msg/string转一下, 然后计算vx, vy, vth, dl, dr, post跟twist, 拼一起, 做成一个odom的tf, 然后广告tf跟广播odom topic.

关于怎么在Eclipse里面简单的加入一个其他cpp的.h文件, 搞了我大半天...我啥时候才能入门c++... 我滴天呐...

tf的echo, 从base_link到odom:

时间: 2024-10-13 20:58:25

ROS + STM32 + mbed的相关文章

ROS+mbed

试了一下, 用stm32F103RB nucleo的板子, 跑mbed, 跟ros的库, 发布一个std_msg/String, 为什么不直接发布里程? 因为经常报message比buffer大的错误. 没办法, 只好先用stm32通过串口, 发布有用的x, y, 跟yaw值, string格式, 然后ROS端起一个节点去解析string, 转成里程跟tf. stm32端: /* * rosserial Publisher Example * Prints "hello world!"

ROS之STM32来啦

mbed是ARM自己high的一个所谓IoT的平台, 甚至不惜做了一个巨难用的在线编译IDE, 蛋疼欲裂, 内个字体非常非常反人类, 唯一的解决办法是用chrome浏览器, 然后下一个叫mbedEditor++的插件, 修改编译器的代码字体, 不然你迟早要瞎. OK, 进入正题, 我现在玩的ROS还是基于PC平台的, 如果要用PC来控制电机, 并收集电机的里程数据, 也就是说, 要将ROS跟模拟量之间连接起来, 有几个方案: http://wiki.ros.org/rosserial: 用Aru

ROS+mbed 发布tf里程信息

#include "mbed.h" #include <ros.h> #include <ros/time.h> #include <tf/transform_broadcaster.h> ros::NodeHandle nh; geometry_msgs::TransformStamped t; tf::TransformBroadcaster broadcaster; char base_link[] = "/base_link&quo

ROS+mbed 订阅者

从ROS端如果要发送消息给mbed, 聪明的我知道了, 估计要用订阅者, 让mbed去订阅一个制定的topic, 问题来了, 能否订阅两个topic? 稍后再试. mbed上面是这样的: #include "mbed.h" #include <ros.h> #include <std_msgs/UInt16.h> ros::NodeHandle nh; //Servo servo(D8); DigitalOut myled(LED1); void servo_c

使用mbed进行STM32板子的开发

keil太难用!keil太难用!keil太难用! keil点亮一个灯都超麻烦,什么鬼东西. mbed可以网络编程,打破了mac和windows的壁垒!写好,编译,然后下下来,在拖到板子里.就直接烧进去了! mbed有自己封装好的库,"mbed.h",可以使用C++来写代码,重载好爽啊!!!!! 总之,ARM的开发可以和Arduino一样简单!!!! 看一下由三个LED组成的流水灯的代码: #include "mbed.h" //声明输出口 //D8什么的选好板子后已

mbed的ticker问题

最近发现一个很严重的问题, 在给mbed的subscriber频繁(1秒10次)发消息的时候, nucleo莫名其妙就挂了. 因为最终, vel消息肯定要传递到底盘驱动mcu上的, 10赫兹的频率也不算高吧, 然后一步步把pwm控制去掉, 发现以前没发现的问题: 1. mbed单独publish topic, 一直没问题. 2. 如果从ROS发消息去mbed, 去到某个固定的时刻, mbed/nucleo就挂掉了, 判断的标准是, publish没有了, rosserial python显示连接

本科小白学ROS 和 SLAM(一):杂谈

本人最近才迷恋上ROS(Robot Operating System),准确的说应该是6月中旬,具体的记不清了(可能是年纪大了,容易健忘).对于一个电子DIY的狂热爱好者来说,我在校的梦想就是做一个属于自己的一个高大上的机器人.近几年机器学习,人工智能那是相当火啊,尤其是在央视春晚播了机器人之后,可以说中国的机器人产业是爆发式的增长(核心技术都是国外的,像芯片,算法之类的还是老外的). 先介绍一下自己的情况吧,本人现在已经大三了,主修的是自动化(在广东的一所二本工科学校).在刚上大学的时候,内心

mbed学习之 PWMOUT

PWM通过一个周期内不同占空比来表征模拟量,应用非常广泛.mbed中提供了一个PWM类,来对PWM进行操作,可以分别设置占空比,周期,以及脉冲宽度. 因为这里是使用单片机内部TIM来生成PWM波的,所以并不是所有的IO都支持PWM输出,具体哪些Pin脚支持,需要自己查datasheet,首先第一步,先创建 PWM对象: PwmOut mypwm(PB_0); // PB0 pin输出PWM波 接下来可以设置PWM的占空比 mypwm.write(0.1); // 0-->1之间,表示从0%-10

ST推出新软件STM32Cube ,让STM32微控制器应用设计变得更容易、更快、更好用

功能强大的STM32Cube 新软件平台由设计工具.中间件和硬件抽象层组成,让客户能够集中精力创新 意法半导体(STMicroelectronics,简称ST)针对STM32微控制器推出一套免费的功能强大的设计工具及软件STM32Cube. 新开发平台可简化客户的开发项目,缩短项目研发周期,并进一步强化STM32在电子设计人员心目中解决创新难题的首选微控制器的地位. STM32Cube 开发平台包括STM32CubeMX图形界面配置器及初始化C代码生成器和各种类型的嵌入式软件. 配置初始化工具能