趣味で作ってるロボット用ソフトウェア
 All Classes Files Functions Enumerations Enumerator Friends Pages
バッテリー情報の取得

概要

ここでは、ルンバのバッテリー情報を取得する方法を説明します。
具体的には、充電中かどうかの取得と、充電する基地への移動を指示できます。

roomba_battery_charging.jpg

充電中かの取得

hrk::Roomba_driver::is_charging() を利用します。
このメソッドを呼び出すことで、充電中かどうかが取得できます。

充電する基地への移動

hrk::Roomba_driver::dock() を利用します。

以下に dock() メソッドを用いて充電の開始を指示するサンプルを紹介します。 dock() メソッドを呼び出した後に、実際に充電を開始したかを is_charging() を用いて監視しています。

#include <cstdlib>
#include <iostream>
#include "Roomba_driver.h"
#include "robot_utils.h"
#include "point_utils.h"
#include "delay.h"
#include "ticks.h"
#include "log_printf.h"
#include <cstdio>
using namespace hrk;
using namespace std;
int main(int argc, char *argv[])
{
static_cast<void>(argc);
static_cast<void>(argv);
if (!robot.open("/dev/ttyUSB0")) {
cerr << FILE_POSITION() << robot.what() << endl;
return 1;
}
// 充電を指示
robot.dock();
// 充電状態を確認する
const double Timeout_second = 10.0;
long first_ticks = ticks_sec();
long spent_time;
PositionF previous_position = robot.position();
do {
long current_ticks = ticks_sec();
spent_time = current_ticks - first_ticks;
// 移動しなくなったら、基地への移動が完了したとみなして電源を切る
// 最初に移動し始めるまでの数秒間は、この判定を行わないようにする
PositionF current_position = robot.position();
if ((spent_time > 4.0) &&
(distance_to(PointF(current_position.x(), current_position.y()),
PointF(previous_position.x(),
previous_position.y())) <= 0)) {
robot.power_down();
}
previous_position = current_position;
// 充電を開始したら、処理を抜ける
if (robot.is_charging()) {
cout << "dock success!" << endl;
return 0;
}
delay_sec(0.1);
} while (spent_time < Timeout_second);
cout << "dock fail." << endl;
return 1;
}