rosserial允许您轻松地将基于Arduino的硬件与ROS结合起来。本教程将解释如何将SRF08超声波传感器与Arduino配合使用。
你需要一个Arduino,一个SRF08超声波传感器,以及一种将超声波传感器连接到你的Arduino的方法,比如面包板或者一个protoboard。
SRF08 Arduino库可以从Sonar_srf08.zip下载。
1. 硬件设置
下面是为典型的Arduino连接SRF08传感器的图表。
唯一需要的额外电路是两个1.8kOhm上拉电阻,如下所示。
2 程序
接下来,打开您的Arduino IDE并复制下面的代码。
/*
* rosserial SRF08 Ultrasonic Ranger Example
*
* This example is calibrated for the SRF08 Ultrasonic Ranger.
*/
#include <Sonar_srf08.h> //SRF08 specific library专用的库
#include <WProgram.h>
#include <Wire.h>
#include <ros.h>
#include <std_msgs/Float32.h>
//Set up the ros node and publisher
//标准流程和程序
std_msgs::Float32 sonar_msg;
ros::Publisher pub_sonar("sonar", &sonar_msg);
ros::NodeHandle nh;
Sonar_srf08 MySonar; //create MySonar object
#define CommandRegister 0x00
int New_Address = 248; //0xF8
#define ResultRegister 0x02
float sensorReading =0;
char unit = 'i'; // 'i' for inches , 'c' for centimeters
//设置,要不就是读取传感器数据专用的设置
void setup()
{
MySonar.connect();
MySonar.changeAddress(CommandRegister, New_Address);
New_Address += 4;
nh.initNode();
nh.advertise(pub_sonar);
}
long publisher_timer;
void loop()
{
if (millis() > publisher_timer) {
// step 1: request reading from sensor
MySonar.setUnit(CommandRegister, New_Address, unit);
//pause
delay(70);
// set register for reading
MySonar.setRegister(New_Address, ResultRegister);
// read data from result register
//读取数据
sensorReading = MySonar.readData(New_Address, 2);
sonar_msg.data = sensorReading;
pub_sonar.publish(&sonar_msg);
//间隔4秒
publisher_timer = millis() + 4000; //publish once a second
}
nh.spinOnce();
}
本例中的特殊代码是使用Arduino的Wire库。
Wire是一个I2C库,可简化对I2C总线的读写操作。
也可以参考《基于ROS使用Arduino控制超声波传感器》:https://blog.csdn.net/qq_27806947/article/details/83279019
启动应用程序
roscore
rostopic echo sonar