add trajectory setpoint handling
This commit is contained in:
@@ -22,6 +22,7 @@ find_package(rosidl_default_generators REQUIRED)
|
|||||||
|
|
||||||
rosidl_generate_interfaces(${PROJECT_NAME}
|
rosidl_generate_interfaces(${PROJECT_NAME}
|
||||||
"srv/SetAttitude.srv"
|
"srv/SetAttitude.srv"
|
||||||
|
"srv/SetTrajectory.srv"
|
||||||
"srv/SetVelocity.srv"
|
"srv/SetVelocity.srv"
|
||||||
"srv/TakePicture.srv"
|
"srv/TakePicture.srv"
|
||||||
"srv/SetVehicleControl.srv"
|
"srv/SetVehicleControl.srv"
|
||||||
|
|||||||
7
src/drone_services/srv/SetTrajectory.srv
Normal file
7
src/drone_services/srv/SetTrajectory.srv
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# control mode velocity or position, refer to drone_services/msg/DroneControlMode.msg
|
||||||
|
int8 control_mode
|
||||||
|
# x, y, z values
|
||||||
|
float32[3] values
|
||||||
|
float32 yaw
|
||||||
|
---
|
||||||
|
bool success
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <px4_msgs/msg/vehicle_attitude.hpp>
|
#include <px4_msgs/msg/vehicle_attitude.hpp>
|
||||||
|
|
||||||
#include <drone_services/srv/set_attitude.hpp>
|
#include <drone_services/srv/set_attitude.hpp>
|
||||||
|
#include <drone_services/srv/set_trajectory.hpp>
|
||||||
#include <drone_services/msg/drone_control_mode.hpp>
|
#include <drone_services/msg/drone_control_mode.hpp>
|
||||||
|
|
||||||
#include <std_srvs/srv/empty.hpp>
|
#include <std_srvs/srv/empty.hpp>
|
||||||
@@ -46,7 +47,8 @@ public:
|
|||||||
vehicle_attitude_subscription_ = this->create_subscription<px4_msgs::msg::VehicleAttitude>("/fmu/out/vehicle_attitude", qos, std::bind(&PX4Controller::on_attitude_receive, this, std::placeholders::_1));
|
vehicle_attitude_subscription_ = this->create_subscription<px4_msgs::msg::VehicleAttitude>("/fmu/out/vehicle_attitude", qos, std::bind(&PX4Controller::on_attitude_receive, this, std::placeholders::_1));
|
||||||
control_mode_subscription_ = this->create_subscription<drone_services::msg::DroneControlMode>("/drone/control_mode", qos, std::bind(&PX4Controller::on_control_mode_receive, this, std::placeholders::_1));
|
control_mode_subscription_ = this->create_subscription<drone_services::msg::DroneControlMode>("/drone/control_mode", qos, std::bind(&PX4Controller::on_control_mode_receive, this, std::placeholders::_1));
|
||||||
|
|
||||||
set_attitude_service_ = this->create_service<drone_services::srv::SetAttitude>("/drone/set_attitude", std::bind(&PX4Controller::set_setpoint, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
set_attitude_service_ = this->create_service<drone_services::srv::SetAttitude>("/drone/set_attitude", std::bind(&PX4Controller::handle_attitude_setpoint, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
|
set_trajectory_service_ = this->create_service<drone_services::srv::SetTrajectory>("/drone/set_trajectory", std::bind(&PX4Controller::handle_trajectory_setpoint, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
disarm_service_ = this->create_service<std_srvs::srv::Empty>("/drone/disarm", std::bind(&PX4Controller::handle_disarm_request, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
disarm_service_ = this->create_service<std_srvs::srv::Empty>("/drone/disarm", std::bind(&PX4Controller::handle_disarm_request, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
arm_service_ = this->create_service<std_srvs::srv::Empty>("/drone/arm", std::bind(&PX4Controller::handle_arm_request, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
arm_service_ = this->create_service<std_srvs::srv::Empty>("/drone/arm", std::bind(&PX4Controller::handle_arm_request, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
// create timer to send vehicle attitude setpoints every second
|
// create timer to send vehicle attitude setpoints every second
|
||||||
@@ -64,6 +66,7 @@ private:
|
|||||||
rclcpp::Subscription<drone_services::msg::DroneControlMode>::SharedPtr control_mode_subscription_;
|
rclcpp::Subscription<drone_services::msg::DroneControlMode>::SharedPtr control_mode_subscription_;
|
||||||
|
|
||||||
rclcpp::Service<drone_services::srv::SetAttitude>::SharedPtr set_attitude_service_;
|
rclcpp::Service<drone_services::srv::SetAttitude>::SharedPtr set_attitude_service_;
|
||||||
|
rclcpp::Service<drone_services::srv::SetTrajectory>::SharedPtr set_trajectory_service_;
|
||||||
rclcpp::Service<std_srvs::srv::Empty>::SharedPtr disarm_service_;
|
rclcpp::Service<std_srvs::srv::Empty>::SharedPtr disarm_service_;
|
||||||
rclcpp::Service<std_srvs::srv::Empty>::SharedPtr arm_service_;
|
rclcpp::Service<std_srvs::srv::Empty>::SharedPtr arm_service_;
|
||||||
|
|
||||||
@@ -96,7 +99,7 @@ private:
|
|||||||
// result quaternion
|
// result quaternion
|
||||||
std::array<float, 4> q = {0, 0, 0, 0};
|
std::array<float, 4> q = {0, 0, 0, 0};
|
||||||
|
|
||||||
void set_setpoint(
|
void handle_attitude_setpoint(
|
||||||
const std::shared_ptr<rmw_request_id_t> request_header,
|
const std::shared_ptr<rmw_request_id_t> request_header,
|
||||||
const std::shared_ptr<drone_services::srv::SetAttitude::Request> request,
|
const std::shared_ptr<drone_services::srv::SetAttitude::Request> request,
|
||||||
const std::shared_ptr<drone_services::srv::SetAttitude::Response> response)
|
const std::shared_ptr<drone_services::srv::SetAttitude::Response> response)
|
||||||
@@ -139,6 +142,38 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handle_trajectory_setpoint(
|
||||||
|
const std::shared_ptr<rmw_request_id_t> request_header,
|
||||||
|
const std::shared_ptr<drone_services::srv::SetTrajectory::Request> request,
|
||||||
|
const std::shared_ptr<drone_services::srv::SetTrajectory::Response> response)
|
||||||
|
{
|
||||||
|
if (request->control_mode != CONTROL_MODE_VELOCITY || request->control_mode != CONTROL_MODE_POSITION)
|
||||||
|
{
|
||||||
|
RCLCPP_INFO(this->get_logger(), "Got invalid control mode: %d", request->control_mode);
|
||||||
|
response->success = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (request->control_mode == CONTROL_MODE_VELOCITY)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
velocity[i] = request->values[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (request->control_mode == CONTROL_MODE_POSITION)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
position[i] = request->values[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
last_angle = request->yaw;
|
||||||
|
response->success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief disarms the drone when a call to the disarm service is made
|
* @brief disarms the drone when a call to the disarm service is made
|
||||||
*
|
*
|
||||||
@@ -256,6 +291,7 @@ private:
|
|||||||
void send_setpoint()
|
void send_setpoint()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
setpoint_count++;
|
setpoint_count++;
|
||||||
if (setpoint_count == 20)
|
if (setpoint_count == 20)
|
||||||
{
|
{
|
||||||
@@ -270,7 +306,8 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
send_attitude_setpoint();
|
send_attitude_setpoint();
|
||||||
/*
|
*/
|
||||||
|
|
||||||
RCLCPP_INFO(this->get_logger(), "current values: %f %f %f %f", last_setpoint[0], last_setpoint[1], last_setpoint[2], last_thrust);
|
RCLCPP_INFO(this->get_logger(), "current values: %f %f %f %f", last_setpoint[0], last_setpoint[1], last_setpoint[2], last_thrust);
|
||||||
if (!flying)
|
if (!flying)
|
||||||
{
|
{
|
||||||
@@ -295,7 +332,7 @@ private:
|
|||||||
send_position_setpoint();
|
send_position_setpoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_attitude_receive(const px4_msgs::msg::VehicleAttitude::SharedPtr msg)
|
void on_attitude_receive(const px4_msgs::msg::VehicleAttitude::SharedPtr msg)
|
||||||
|
|||||||
Reference in New Issue
Block a user