最新消息:380元/半年,推荐全网最具性价比的一站式编程学习平台码丁实验室

ROS与Arduino-SRF08 Ultrasonic Ranger(SRF08超声波测距仪)

ROS1/一代机器人系统 少儿编程 1812浏览 0评论
ROS与Arduino教程

友情提示:380元/半年,儿童学编程,就上码丁实验室

SRF08 Ultrasonic Ranger(SRF08超声波测距仪)

说明

  • 这个教程展示通过Arduino和SRF08超声波测距仪进行测距。SRF08通过SPI/I2C与Arduino进行通讯。

硬件

  • Arduino UNO或其他
  • SRF08 Ultrasonic Ranger (SRF08 Arduino library 下载)

连接图

ROS与Arduino-SRF08 Ultrasonic Ranger(SRF08超声波测距仪)

  • 额外需增加两个1.8k欧的上拉电阻

代码

/*
 * 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);

  publisher_timer = millis() + 4000; //publish once a second

  }

  nh.spinOnce();
}
  • 使用Arduino Wire库处理I2C相应的读写操作。

测试

  1. 新窗口打开
$ roscore
  1. 新窗口打开,/dev/ttyUSB0为Arduino的设备端口号
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
  1. 新窗口打开
rostopic echo sonar

您必须 登录 才能发表评论!