Skip to content
Snippets Groups Projects
Commit 1c1a93b1 authored by bucyril's avatar bucyril
Browse files

added area safety check in PPSClient

parent dfcb1ec6
No related branches found
No related tags found
No related merge requests found
...@@ -37,7 +37,7 @@ CONTROLLER_ANGLE = 1 ...@@ -37,7 +37,7 @@ CONTROLLER_ANGLE = 1
CONTROLLER_RATE = 0 CONTROLLER_RATE = 0
RAD_TO_DEG = 57.296 RAD_TO_DEG = 57.296
bag = rosbag.Bag('~/D-Fall-System/pps_ws/src/d_fall_pps/test.bag', 'w') #bag = rosbag.Bag('~/D-Fall-System/pps_ws/src/d_fall_pps/test.bag', 'w')
class PPSRadioClient: class PPSRadioClient:
""" """
......
safeController: "SafeControllerService/RateController" safeController: "SafeControllerService/RateController"
customController: "" customController: "SafeControllerService/RateController"
...@@ -84,16 +84,28 @@ bool safetyCheck(CrazyflieData data, ControlCommand controlCommand) { ...@@ -84,16 +84,28 @@ bool safetyCheck(CrazyflieData data, ControlCommand controlCommand) {
return true; return true;
} }
void coordinatesToLocal(CrazyflieData& cf) {
AreaBounds area = context.localArea;
float originX = (area.xmin + area.xmax) / 2.0;
float originY = (area.ymin + area.ymax) / 2.0;
float originZ = (area.zmin + area.zmax) / 2.0;
cf.x -= originX;
cf.y -= originY;
cf.z -= originZ;
}
//is called when new data from Vicon arrives //is called when new data from Vicon arrives
void viconCallback(const ViconData& viconData) { void viconCallback(const ViconData& viconData) {
for(std::vector<CrazyflieData>::const_iterator it = viconData.crazyflies.begin(); it != viconData.crazyflies.end(); ++it) { for(std::vector<CrazyflieData>::const_iterator it = viconData.crazyflies.begin(); it != viconData.crazyflies.end(); ++it) {
CrazyflieData data = *it; CrazyflieData global = *it;
//ROS_INFO_STREAM(data); if(global.crazyflieName == context.crazyflieName) {
if(data.crazyflieName == context.crazyflieName) {
Controller controllerCall; Controller controllerCall;
controllerCall.request.ownCrazyflie = data;
CrazyflieData local = global;
coordinatesToLocal(local);
controllerCall.request.ownCrazyflie = local;
if(crazyflieEnabled){ if(crazyflieEnabled){
...@@ -101,31 +113,35 @@ void viconCallback(const ViconData& viconData) { ...@@ -101,31 +113,35 @@ void viconCallback(const ViconData& viconData) {
bool success = customController.call(controllerCall); bool success = customController.call(controllerCall);
if(!success) { if(!success) {
ROS_ERROR("Failed to call custom controller, switching to safe controller"); ROS_ERROR("Failed to call custom controller, switching to safe controller");
ROS_ERROR_STREAM("custom controller status: valid: " << customController.isValid() << ", exists: " << customController.exists());
ROS_ERROR_STREAM("custom controller name: valid: " << customController.getService());
usingSafeController = true; usingSafeController = true;
} else {
usingSafeController = safetyCheck(global, controllerCall.response.controlOutput);
if(usingSafeController) {
ROS_INFO_STREAM("safety check failed, switching to safe controller");
}
} }
usingSafeController = true; //debug
} }
if(usingSafeController) { if(usingSafeController) {
bool success = safeController.call(controllerCall); bool success = safeController.call(controllerCall);
if(!success) { if(!success) {
ROS_ERROR_STREAM("Failed to call safe controller, " << safeController.isValid() << ", " << safeController.exists() << ", " << safeController.isPersistent()); ROS_ERROR_STREAM("Failed to call safe controller, valid: " << safeController.isValid() << ", exists: " << safeController.exists());
} }
} }
controlCommandPublisher.publish(controllerCall.response.controlOutput); controlCommandPublisher.publish(controllerCall.response.controlOutput);
bag.write("ViconData", ros::Time::now(), data); bag.write("ViconData", ros::Time::now(), local);
bag.write("ControlOutput", ros::Time::now(), controllerCall.response.controlOutput); bag.write("ControlOutput", ros::Time::now(), controllerCall.response.controlOutput);
} else { //crazyflie disabled } else { //crazyflie disabled
ControlCommand zeroOutput = ControlCommand(); //everything set to zero ControlCommand zeroOutput = ControlCommand(); //everything set to zero
zeroOutput.onboardControllerType = 2; //set to motor_mode zeroOutput.onboardControllerType = 2; //set to motor_mode
controlCommandPublisher.publish(zeroOutput); controlCommandPublisher.publish(zeroOutput);
bag.write("ViconData", ros::Time::now(), data); bag.write("ViconData", ros::Time::now(), local);
bag.write("ControlOutput", ros::Time::now(), zeroOutput); bag.write("ControlOutput", ros::Time::now(), zeroOutput);
} }
} }
...@@ -133,10 +149,6 @@ void viconCallback(const ViconData& viconData) { ...@@ -133,10 +149,6 @@ void viconCallback(const ViconData& viconData) {
} }
void loadParameters(ros::NodeHandle& nodeHandle) { void loadParameters(ros::NodeHandle& nodeHandle) {
if(!nodeHandle.getParam("crazyFlieName", crazyflieName)) {
ROS_ERROR("Failed to get crazyFlieName");
}
if(!nodeHandle.getParam("studentID", studentID)) { if(!nodeHandle.getParam("studentID", studentID)) {
ROS_ERROR("Failed to get studentID"); ROS_ERROR("Failed to get studentID");
} }
...@@ -182,7 +194,7 @@ void loadCustomController() { ...@@ -182,7 +194,7 @@ void loadCustomController() {
return; return;
} }
customController = nodeHandle.serviceClient<Controller>(customControllerName, true); customController = ros::service::createClient<Controller>(customControllerName, true);
ROS_INFO_STREAM("loaded custom controller " << customControllerName); ROS_INFO_STREAM("loaded custom controller " << customControllerName);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment