ROS教程
这是小弟的学习笔记,有错求请拍,多指教,谢谢
二 树莓派3+ROS-kinetic+mbed/开环二轮差分模型
二轮差分模型介绍
1.二轮差分模型
二轮差分运动模型是目前最为简单方便的机器人运动底盘设计,依靠两个动力轮的电机输出不同达到直线行走和左右转动的目的,左右电机的转向不同即可完成转动,常见于寻迹小车,扫地机器人,送餐机器人等,底盘较为灵活,编程,机械设计都很简单,但缺点是转弯时不能走出顺滑的弧线
2.H桥电机驱动
H桥通常是由4个三极管做成的直流电机控制电路,电路原理图十分像字母H。4根三极管分为左上,左下,右上,右下,对角的一对三极管控制电机的一个运动方向,一侧导通后电机顺时针转,另一侧导通则逆时针转
rosserial_mbed介绍
通常来说,ROS机器人操作系统是在树莓派,miniPC,或者是笔记本电脑等运行以linux为基础的系统的设备上运行的,这类型的设备通常没有GPIO或PWM输出引脚,或者IO功能很弱,比如树莓派,它有GPIO引脚,但需要用python语言去控制或者引入wiringC++库,引脚数目也很少。所以在设计这个移动底盘的时候选择了mbed单片机和树莓派3的组合,mbed单片机负责底层的电机驱动,传感器数据读取任务,树莓派上则运行ROS系统,负责传感器数据的处理及发送控制指令。这就涉及了一个问题,ROS和mbed如何通信呢?
答案是,使用rosserial_mbed库,这个新的接口是在jade和kinetic这两个15年之后才推出的新版本上发布的,旧版本的indigo是没有的。rosserial_mbed库强大的功能在于,我们可以把单片机当作一个节点来看,在上边编写发布者和订阅者,与ROS通过USB串口来通信,不需要使用单片机Tx/Rx引脚,而且USB驱动也无需更改,直接使用mbed的程序烧录数据线,不需要用USB转TTL线
rosserial_mbed/wiki
还有与arduino的库
rosserial_arduino/wiki
连接mbed与ROS
1.mbed上的发布者和订阅者
1)mbed的发布者代码
#include <mbed.h>//mbed程序必须的头文件
#include <ros.h>
#include <std_msgs/String.h>//所涉及的消息类型的头文件
ros::NodeHandle nh;//实例化ROS,给ROS分配一个句柄
std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);
char hello[13] = "hello world!";
DigitalOut led = LED1;
int main() {
nh.initNode();
nh.advertise(chatter);
while (1) {
led = !led;
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
wait_ms(1000);
}
}
从这段ROSwiki给出的例程可以看出,在mbed上用到的语法与在电脑编写发布者节点的语法是一致的,整体框架也一样,所以在mbed上写ROS代码的时候,当作是往ROS框架内添加mbed的代码
2)mbed的订阅者代码
#include <mbed.h>
#include <ros.h>
#include <std_msgs/Empty.h>
ros::NodeHandle nh;
DigitalOut myled(LED1);
void messageCb(const std_msgs::Empty& toggle_msg){
myled = !myled; // blink the led
}
ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb);
int main() {
nh.initNode();
nh.subscribe(sub);
while (1) {
nh.spinOnce();
wait_ms(1);
}
}
订阅者的语法规则以及函数格式也和在电脑上编写节点是一致的
2.DC-motor库
1)mbed