void PositionCommand::dynamic(uav_commander::PIDControlConfig &config, uint32_t level) { if (config.PID_Control) { ros::NodeHandle n_priv("~"); n_priv.param<double>("kp_x" , config.Kp_x , 0.71); n_priv.param<double>("kp_y" , config.Kp_y , 0.72); n_priv.param<double>("kp_z" , config.Kp_z , 0.73); n_priv.param<double>("kp_w" , config.Kp_w , 0.74); n_priv.param<double>("ki_x" , config.Ki_x , 0.71); n_priv.param<double>("ki_y" , config.Ki_y , 0.72); n_priv.param<double>("ki_z" , config.Ki_z , 0.73); n_priv.param<double>("ki_w" , config.Ki_w , 0.74); n_priv.param<double>("kd_x" , config.Kd_x , 0.71); n_priv.param<double>("kd_y" , config.Kd_y , 0.72); n_priv.param<double>("kd_z" , config.Kd_z , 0.73); n_priv.param<double>("kd_w" , config.Kd_w , 0.74); } config.PID_Control = 0; Kp << config.Kp_x , config.Kp_y , config.Kp_z , 0 , 0 , config.Kp_w; Ki << config.Ki_x , config.Ki_y , config.Ki_z , 0 , 0 , config.Ki_w; Kd << config.Kd_x , config.Kd_y , config.Kd_z , 0 , 0 , config.Kd_w; control_info_msg.Kp.x = config.Kp_x ; control_info_msg.Kp.y = config.Kp_y ; control_info_msg.Kp.z = config.Kp_z ; control_info_msg.Kp.r = 0 ; control_info_msg.Kp.p = 0 ; control_info_msg.Kp.w = config.Kp_w ; control_info_msg.Ki.x = config.Ki_x ; control_info_msg.Ki.y = config.Ki_y ; control_info_msg.Ki.z = config.Ki_z ; control_info_msg.Ki.r = 0 ; control_info_msg.Ki.p = 0 ; control_info_msg.Ki.w = config.Ki_w ; control_info_msg.Kd.x = config.Kd_x ; control_info_msg.Kd.y = config.Kd_y ; control_info_msg.Kd.z = config.Kd_z ; control_info_msg.Kd.r = 0 ; control_info_msg.Kd.p = 0 ; control_info_msg.Kd.w = config.Kd_w ; }
int main(int argc, char **argv) { // ROS node ros::init(argc, argv, "move_quad"); ros::NodeHandle n; ros::NodeHandle n_priv("~"); ros::Rate loop_rate(150); // create an object move_tube move_robot_obj(n); while(ros::ok()) { move_robot_obj.move(0, 0 , 0 ); sleep(2); } return 0; }
int main(int argc, char **argv) { std::cout << "MAIN" << std::endl ; /** * The ros::init() function needs to see argc and argv so that it can perform * any ROS arguments and name remapping that were provided at the command line. For programmatic * remappings you can use a different version of init() which takes remappings * directly, but for most command-line programs, passing argc and argv is the easiest * way to do it. The third argument to init() is the name of the node. * * You must call one of the versions of ros::init() before using any other * part of the ROS system. */ ros::init(argc, argv, "potential_field"); /** * NodeHandle is the main access point to communications with the ROS system. * The first NodeHandle constructed will fully initialize this node, and the last * NodeHandle destructed will close down the node. */ ros::NodeHandle n; ros::NodeHandle n_priv("~"); // parameters double a_max; double ro; double freq; double robot_mass; double robot_radius; double kp_x; double kp_y; double kp_z; double kd_x; double kd_y; double kd_z; // Control gains n_priv.param<double>("Kp_x", kp_x, 1.0); n_priv.param<double>("Kp_y", kp_y, 1.0); n_priv.param<double>("Kp_z", kp_z, 1.0); n_priv.param<double>("Kp_x", kd_x, 1.0); n_priv.param<double>("Kp_y", kd_y, 1.0); n_priv.param<double>("Kp_z", kd_z, 1.0); Eigen::Vector3d kp(kp_x,kp_y,kp_z); Eigen::Vector3d kd(kd_x,kd_y,kd_z); double laser_max_distance; //initialize operational parameters n_priv.param<double>("laser_max_distance", laser_max_distance, 0.2); n_priv.param<double>("ro", ro, 3.0); n_priv.param<double>("frequency", freq, 10.0); n_priv.param<double>("acc_max", a_max, 1.0); n_priv.param<double>("robot_mass", robot_mass, 1.0); n_priv.param<double>("robot_radius", robot_radius, 0.2); ros::Rate loop_rate(freq); std::string pose_topic_name = "/RosAria/pose" ; std::string sonar_topic_name = "/RosAria/sonar"; ForceField potential_field(n, freq, ro, kp, kd, laser_max_distance, robot_mass, robot_radius, pose_topic_name, sonar_topic_name); while(ros::ok()) { ros::spinOnce(); loop_rate.sleep(); } return 0; }
int main(int argc, char **argv) { ros::init(argc, argv, "uav_commander"); ros::NodeHandle n; ros::NodeHandle n_priv("~"); std::string base_marker_id; std::string head_marker_id; double freq; n_priv.param<double>("freq", freq, 50.0); n_priv.param<std::string>("base_marker_id", base_marker_id, "teste"); n_priv.param<std::string>("head_marker_id", head_marker_id, "teste2"); /////////// // Gains // /////////// // Proportional (kd) double kp_x; double kp_y; double kp_z; double kp_roll; double kp_pitch; double kp_yaw; n_priv.param<double>("kp_x", kp_x, 0.5); n_priv.param<double>("kp_y", kp_y, 1.0); n_priv.param<double>("kp_z", kp_z, 1.0); n_priv.param<double>("kp_roll", kp_roll, 0.0); n_priv.param<double>("kp_pitch", kp_pitch, 0.0); n_priv.param<double>("kp_yaw", kp_yaw, 1.0); Eigen::Matrix<double,6,1> Kp; Kp << kp_x,kp_y,kp_z, kp_roll, kp_pitch,kp_yaw; // Derivative (kd) double kd_x; double kd_y; double kd_z; double kd_roll; double kd_pitch; double kd_yaw; n_priv.param<double>("kd_x", kd_x, 1.0); n_priv.param<double>("kd_y", kd_y, 1.0); n_priv.param<double>("kd_z", kd_z, 1.0); n_priv.param<double>("kd_roll", kd_roll, 0.0); n_priv.param<double>("kd_pitch", kd_pitch, 0.0); n_priv.param<double>("kd_yaw", kd_yaw, 1.0); Eigen::Matrix<double,6,1> Kd; Kd << kd_x,kd_y,kd_z, kd_roll, kd_pitch,kd_yaw; std::cout << "Kp gains:" << Kp << std::endl; std::cout << "Kd gains:" << Kd << std::endl; PositionCommand position_commander(n,base_marker_id,head_marker_id, freq, Kp, Kd); ros::Rate loop_rate(50); while (ros::ok()) { ros::spinOnce(); loop_rate.sleep(); } return 0; /*//ros::Publisher uav_commands = n.advertise<pctx_control::Control>("sendPCTXControl", 1000); //ros::Subscriber sub = n.subscribe("TrackerPosition", 1000, getUpdatedPose); ros::Rate loop_rate(15); int count = 0; std::vector<int16_t> controlValues(9,0); double k = 3; while (ros::ok()) { pctx_control::Control controlMessage; int val = count%1020;//int(sin((count%180)*PI/180.0)*1020); //controlValues[0] = controlValues[1] =controlValues[2] =controlValues[3] =controlValues[4] =controlValues[5] =controlValues[6] =controlValues[7] =controlValues[8] = val; controlValues[0] = k*y; controlMessage.values = controlValues; ROS_DEBUG("UAV_Commander broadcasting to all channels value:%d",controlValues[0]); uav_commands.publish(controlMessage); ros::spinOnce(); loop_rate.sleep(); count+=10; }*/ }
int main(int argc, char **argv) { ros::init(argc, argv, "controller"); ros::NodeHandle n; ros::NodeHandle n_priv("~"); // parameters double freq; n_priv.param<double>("frequency", freq, 10.0); double kp_x; double kp_y; double kp_z; double kp_roll; double kp_pitch; double kp_yaw; n_priv.param<double>("kp_x", kp_x, 1.0); n_priv.param<double>("kp_y", kp_y, 1.0); n_priv.param<double>("kp_z", kp_z, 1.0); n_priv.param<double>("kp_roll", kp_roll, 1.0); n_priv.param<double>("kp_pitch", kp_pitch, 1.0); n_priv.param<double>("kp_yaw", kp_yaw, 1.0); Eigen::Matrix<double,6,1> Kp; Kp << kp_x, kp_y, kp_z, kp_roll, kp_pitch, kp_yaw; double kd_x; double kd_y; double kd_z; double kd_roll; double kd_pitch; double kd_yaw; n_priv.param<double>("kd_x", kd_x, 1.0); n_priv.param<double>("kd_y", kd_y, 1.0); n_priv.param<double>("kd_z", kd_z, 1.0); n_priv.param<double>("kd_roll", kd_roll, 1.0); n_priv.param<double>("kd_pitch", kd_pitch, 1.0); n_priv.param<double>("kd_yaw", kd_yaw, 1.0); Eigen::Matrix<double,6,1> Kd; Kd << kd_x, kd_y, kd_z, kd_roll, kd_pitch, kd_yaw; double bd_x; double bd_y; double bd_z; double bd_roll; double bd_pitch; double bd_yaw; n_priv.param<double>("bd_x", bd_x, 1.0); n_priv.param<double>("bd_y", bd_y, 1.0); n_priv.param<double>("bd_z", bd_z, 1.0); n_priv.param<double>("bd_roll", bd_roll, 1.0); n_priv.param<double>("bd_pitch", bd_pitch, 1.0); n_priv.param<double>("bd_yaw", bd_yaw, 1.0); Eigen::Matrix<double,6,1> Bd; Bd << bd_x, bd_y, bd_z, bd_roll, bd_pitch, bd_yaw; double lambda_x; double lambda_y; double lambda_z; double lambda_roll; double lambda_pitch; double lambda_yaw; n_priv.param<double>("lambda_x", lambda_x, 1.0); n_priv.param<double>("lambda_y", lambda_y, 1.0); n_priv.param<double>("lambda_z", lambda_z, 1.0); n_priv.param<double>("lambda_roll", lambda_roll, 0.0); n_priv.param<double>("lambda_pitch", lambda_pitch, 0.0); n_priv.param<double>("lambda_yaw", lambda_yaw, 0.0); Eigen::Matrix<double,6,6> lambda; lambda << lambda_x, 0, 0, 0 ,0, 0, 0, lambda_y, 0, 0, 0, 0, 0, 0, lambda_z, 0, 0, 0, 0, 0, 0, lambda_roll, 0, 0, 0, 0, 0, 0, lambda_pitch, 0, 0, 0, 0, 0, 0, lambda_yaw; double slave_min_x; double slave_min_y; double slave_min_z; double slave_min_roll; double slave_min_pitch; double slave_min_yaw; n_priv.param<double>("slave_min_x", slave_min_x, 1.0); n_priv.param<double>("slave_min_y", slave_min_y, 1.0); n_priv.param<double>("slave_min_z", slave_min_z, 1.0); n_priv.param<double>("slave_min_roll", slave_min_roll, 1.0); n_priv.param<double>("slave_min_pitch", slave_min_pitch, 1.0); n_priv.param<double>("slave_min_yaw", slave_min_yaw, 1.0); Eigen::Matrix<double,6,1> slave_min; slave_min << slave_min_x, slave_min_y, slave_min_z, slave_min_roll, slave_min_pitch, slave_min_yaw; double slave_max_x; double slave_max_y; double slave_max_z; double slave_max_roll; double slave_max_pitch; double slave_max_yaw; n_priv.param<double>("slave_max_x", slave_max_x, 1.0); n_priv.param<double>("slave_max_y", slave_max_y, 1.0); n_priv.param<double>("slave_max_z", slave_max_z, 1.0); n_priv.param<double>("slave_max_roll", slave_max_roll, 1.0); n_priv.param<double>("slave_max_pitch", slave_max_pitch, 1.0); n_priv.param<double>("slave_max_yaw", slave_max_yaw, 1.0); Eigen::Matrix<double,6,1> slave_max; slave_max << slave_max_x, slave_max_y, slave_max_z, slave_max_roll, slave_max_pitch, slave_max_yaw; Eigen::Matrix<double,6,1> slave_size=slave_max-slave_min; double slave_velocity_min_x; double slave_velocity_min_y; double slave_velocity_min_z; double slave_velocity_min_roll; double slave_velocity_min_pitch; double slave_velocity_min_yaw; n_priv.param<double>("slave_velocity_min_x", slave_velocity_min_x, 1.0); n_priv.param<double>("slave_velocity_min_y", slave_velocity_min_y, 1.0); n_priv.param<double>("slave_velocity_min_z", slave_velocity_min_z, 1.0); n_priv.param<double>("slave_velocity_min_roll", slave_velocity_min_roll, 1.0); n_priv.param<double>("slave_velocity_min_pitch", slave_velocity_min_pitch, 1.0); n_priv.param<double>("slave_velocity_min_yaw", slave_velocity_min_yaw, 1.0); Eigen::Matrix<double,6,1> slave_velocity_min; slave_velocity_min << slave_velocity_min_x, slave_velocity_min_y, slave_velocity_min_z, slave_velocity_min_roll, slave_velocity_min_pitch, slave_velocity_min_yaw; double slave_velocity_max_x; double slave_velocity_max_y; double slave_velocity_max_z; double slave_velocity_max_roll; double slave_velocity_max_pitch; double slave_velocity_max_yaw; n_priv.param<double>("slave_velocity_max_x", slave_velocity_max_x, 1.0); n_priv.param<double>("slave_velocity_max_y", slave_velocity_max_y, 1.0); n_priv.param<double>("slave_velocity_max_z", slave_velocity_max_z, 1.0); n_priv.param<double>("slave_velocity_max_roll", slave_velocity_max_roll, 1.0); n_priv.param<double>("slave_velocity_max_pitch", slave_velocity_max_pitch, 1.0); n_priv.param<double>("slave_velocity_max_yaw", slave_velocity_max_yaw, 1.0); Eigen::Matrix<double,6,1> slave_velocity_max; slave_velocity_max << slave_velocity_max_x, slave_velocity_max_y, slave_velocity_max_z, slave_velocity_max_roll, slave_velocity_max_pitch, slave_velocity_max_yaw; Eigen::Matrix<double,6,1> slave_velocity_size=slave_velocity_max-slave_velocity_min; double master_min_x; double master_min_y; double master_min_z; double master_min_roll; double master_min_pitch; double master_min_yaw; n_priv.param<double>("master_min_x", master_min_x, 1.0); n_priv.param<double>("master_min_y", master_min_y, 1.0); n_priv.param<double>("master_min_z", master_min_z, 1.0); n_priv.param<double>("master_min_roll", master_min_roll, 1.0); n_priv.param<double>("master_min_pitch", master_min_pitch, 1.0); n_priv.param<double>("master_min_yaw", master_min_yaw, 1.0); Eigen::Matrix<double,6,1> master_min; master_min << master_min_x, master_min_y, master_min_z, master_min_roll, master_min_pitch, master_min_yaw; double master_max_x; double master_max_y; double master_max_z; double master_max_roll; double master_max_pitch; double master_max_yaw; n_priv.param<double>("master_max_x", master_max_x, 1.0); n_priv.param<double>("master_max_y", master_max_y, 1.0); n_priv.param<double>("master_max_z", master_max_z, 1.0); n_priv.param<double>("master_max_roll", master_max_roll, 1.0); n_priv.param<double>("master_max_pitch", master_max_pitch, 1.0); n_priv.param<double>("master_max_yaw", master_max_yaw, 1.0); Eigen::Matrix<double,6,1> master_max; master_max << master_max_x, master_max_y, master_max_z, master_max_roll, master_max_pitch, master_max_yaw; Eigen::Matrix<double,6,1> master_size=master_max-master_min; std::cout << "SLAVE VELOCITY SIZE:" << slave_velocity_size << std::endl; bool is_master; n_priv.param<bool>("is_master", is_master, true); //Controller controller; if(is_master) { Eigen::Matrix<double,6,1> slave_to_master_scale; slave_to_master_scale << fabs(master_size(0,0)/slave_size(0,0)), fabs(master_size(1,0)/slave_size(1,0)), fabs(master_size(2,0)/slave_size(2,0)), fabs(master_size(3,0)/slave_size(3,0)), fabs(master_size(4,0)/slave_size(4,0)), fabs(master_size(5,0)/slave_size(5,0)); Eigen::Matrix<double,6,1> slave_velocity_master_pose_scale; slave_velocity_master_pose_scale << fabs(master_size(0,0)/slave_velocity_size(0,0)), fabs(master_size(1,0)/slave_velocity_size(1,0)), fabs(master_size(2,0)/slave_velocity_size(2,0)), fabs(master_size(3,0)/slave_velocity_size(3,0)), fabs(master_size(4,0)/slave_velocity_size(4,0)), fabs(master_size(5,0)/slave_velocity_size(5,0)); MasterController controller(n, freq, Kp, Kd, Bd, lambda, slave_to_master_scale, slave_velocity_master_pose_scale, master_min, master_max, slave_min, slave_max, slave_velocity_min, slave_velocity_max); ros::Rate loop_rate(freq); while (ros::ok()) { ros::spinOnce(); loop_rate.sleep(); } } else { Eigen::Matrix<double,6,1> master_to_slave_scale; master_to_slave_scale << fabs(slave_size(0,0)/master_size(0,0)), fabs(slave_size(1,0)/master_size(1,0)), fabs(slave_size(2,0)/master_size(2,0)), fabs(slave_size(3,0)/master_size(3,0)), fabs(slave_size(4,0)/master_size(4,0)), fabs(slave_size(5,0)/master_size(5,0)); Eigen::Matrix<double,6,1> master_pose_slave_velocity_scale; master_pose_slave_velocity_scale << fabs(slave_velocity_size(0,0)/master_size(0,0)), fabs(slave_velocity_size(1,0)/master_size(1,0)), fabs(slave_velocity_size(2,0)/master_size(2,0)), fabs(slave_velocity_size(3,0)/master_size(3,0)), fabs(slave_velocity_size(4,0)/master_size(4,0)), fabs(slave_velocity_size(5,0)/master_size(5,0)); std::cout << master_size(0,0) << " " << slave_velocity_size(0,0) << std::endl; std::cout << "before:" <<master_pose_slave_velocity_scale << std::endl; SlaveController controller(n, freq, Kp, Kd, Bd, lambda, master_to_slave_scale, master_pose_slave_velocity_scale, master_min, master_max, slave_min, slave_max, slave_velocity_min, slave_velocity_max); ros::Rate loop_rate(freq); while (ros::ok()) { ros::spinOnce(); loop_rate.sleep(); } } return 0; }
int main(int argc, char **argv) { ros::init(argc, argv, "uav_commander"); ros::NodeHandle n; ros::NodeHandle n_priv("~"); //////////////////////////// // Load object part types // //////////////////////////// std::vector<std::string> robot_ids; std::vector<Eigen::Matrix<double,4,1, Eigen::DontAlign> > desired_formation; XmlRpc::XmlRpcValue swarm; n_priv.getParam("swarm", swarm); ROS_INFO_STREAM("Loading swarm of " << swarm.size() << " robots."); std::map<std::string, XmlRpc::XmlRpcValue>::iterator i; for (i = swarm.begin(); i != swarm.end(); i++) { robot_ids.push_back(i->first); Eigen::Matrix<double,4,1, Eigen::DontAlign> pose; double x=i->second["pose"]["x"]["value"]; double y=i->second["pose"]["y"]["value"]; double z=i->second["pose"]["z"]["value"]; double yaw=i->second["pose"]["yaw"]["value"]; pose << x, y,z, yaw; desired_formation.push_back(pose); } SwarmFormationControl swarm_formation(n,robot_ids,desired_formation); ros::Publisher goal_pub=n.advertise<geometry_msgs::PoseStamped>("swarm_goal",10); geometry_msgs::PoseStamped goal_msg; goal_msg.pose.position.x=0.0; goal_msg.pose.position.y=0.0; goal_msg.pose.position.z=1.0; // static tf::TransformBroadcaster brr; // tf::Transform transform; // int increment=1; // tf::Quaternion q; // q.setRPY(0, 0, 0); // transform.setRotation(q); // transform.setOrigin( tf::Vector3(0.1, 0.1, 1.0+0.01) ); ros::AsyncSpinner spinner(4); spinner.start(); ros::Rate loop_rate(20); while (ros::ok()) { // ++increment; // transform.setOrigin( tf::Vector3(1.0, 1.0, 1.0) ); // transform.setOrigin( tf::Vector3(0.1+increment*0.001, 0.1+increment*0.001, 1.0+increment*0.001) ); // q.setRPY(0, 0, 0+increment*0.001); // transform.setRotation(q); // brr.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", "swarm_goal")); swarm_formation.updateCentroid(); loop_rate.sleep(); goal_msg.pose.position.x+=0.01; goal_msg.pose.position.z+=0.001; goal_pub.publish(goal_msg); } spinner.stop(); return 0; }