lee_position_controller_node.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2015 Fadri Furrer, ASL, ETH Zurich, Switzerland
3  * Copyright 2015 Michael Burri, ASL, ETH Zurich, Switzerland
4  * Copyright 2015 Mina Kamel, ASL, ETH Zurich, Switzerland
5  * Copyright 2015 Janosch Nikolic, ASL, ETH Zurich, Switzerland
6  * Copyright 2015 Markus Achtelik, ASL, ETH Zurich, Switzerland
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 #include <ros/ros.h>
23 
25 
27 
28 namespace rotors_control {
29 
31  const ros::NodeHandle& nh, const ros::NodeHandle& private_nh)
32  :nh_(nh),
33  private_nh_(private_nh){
35 
39 
43 
46 
47  motor_velocity_reference_pub_ = nh_.advertise<mav_msgs::Actuators>(
49 
51  true, false);
52 }
53 
55 
57 
58  // Read parameters from rosparam.
59  GetRosParameter(private_nh_, "position_gain/x",
62  GetRosParameter(private_nh_, "position_gain/y",
65  GetRosParameter(private_nh_, "position_gain/z",
68  GetRosParameter(private_nh_, "velocity_gain/x",
71  GetRosParameter(private_nh_, "velocity_gain/y",
74  GetRosParameter(private_nh_, "velocity_gain/z",
77  GetRosParameter(private_nh_, "attitude_gain/x",
80  GetRosParameter(private_nh_, "attitude_gain/y",
83  GetRosParameter(private_nh_, "attitude_gain/z",
86  GetRosParameter(private_nh_, "angular_rate_gain/x",
89  GetRosParameter(private_nh_, "angular_rate_gain/y",
92  GetRosParameter(private_nh_, "angular_rate_gain/z",
97 }
99 }
100 
102  const geometry_msgs::PoseStampedConstPtr& pose_msg) {
103  // Clear all pending commands.
105  commands_.clear();
106  command_waiting_times_.clear();
107 
108  mav_msgs::EigenTrajectoryPoint eigen_reference;
109  mav_msgs::eigenTrajectoryPointFromPoseMsg(*pose_msg, &eigen_reference);
110  commands_.push_front(eigen_reference);
111 
113  commands_.pop_front();
114 }
115 
117  const trajectory_msgs::MultiDOFJointTrajectoryConstPtr& msg) {
118  // Clear all pending commands.
120  commands_.clear();
121  command_waiting_times_.clear();
122 
123  const size_t n_commands = msg->points.size();
124 
125  if(n_commands < 1){
126  ROS_WARN_STREAM("Got MultiDOFJointTrajectory message, but message has no points.");
127  return;
128  }
129 
130  mav_msgs::EigenTrajectoryPoint eigen_reference;
131  mav_msgs::eigenTrajectoryPointFromMsg(msg->points.front(), &eigen_reference);
132  commands_.push_front(eigen_reference);
133 
134  for (size_t i = 1; i < n_commands; ++i) {
135  const trajectory_msgs::MultiDOFJointTrajectoryPoint& reference_before = msg->points[i-1];
136  const trajectory_msgs::MultiDOFJointTrajectoryPoint& current_reference = msg->points[i];
137 
138  mav_msgs::eigenTrajectoryPointFromMsg(current_reference, &eigen_reference);
139 
140  commands_.push_back(eigen_reference);
141  command_waiting_times_.push_back(current_reference.time_from_start - reference_before.time_from_start);
142  }
143 
144  // We can trigger the first command immediately.
146  commands_.pop_front();
147 
148  if (n_commands > 1) {
150  command_waiting_times_.pop_front();
152  }
153 }
154 
156 
157  if(commands_.empty()){
158  ROS_WARN("Commands empty, this should not happen here");
159  return;
160  }
161 
162  const mav_msgs::EigenTrajectoryPoint eigen_reference = commands_.front();
164  commands_.pop_front();
166  if(!command_waiting_times_.empty()){
168  command_waiting_times_.pop_front();
170  }
171 }
172 
173 void LeePositionControllerNode::OdometryCallback(const nav_msgs::OdometryConstPtr& odometry_msg) {
174 
175  ROS_INFO_ONCE("LeePositionController got first odometry message.");
176 
177  EigenOdometry odometry;
178  eigenOdometryFromMsg(odometry_msg, &odometry);
180 
181  Eigen::VectorXd ref_rotor_velocities;
182  lee_position_controller_.CalculateRotorVelocities(&ref_rotor_velocities);
183 
184  // Todo(ffurrer): Do this in the conversions header.
185  mav_msgs::ActuatorsPtr actuator_msg(new mav_msgs::Actuators);
186 
187  actuator_msg->angular_velocities.clear();
188  for (int i = 0; i < ref_rotor_velocities.size(); i++)
189  actuator_msg->angular_velocities.push_back(ref_rotor_velocities[i]);
190  actuator_msg->header.stamp = odometry_msg->header.stamp;
191 
193 }
194 
195 }
196 
197 int main(int argc, char** argv) {
198  ros::init(argc, argv, "lee_position_controller_node");
199 
200  ros::NodeHandle nh;
201  ros::NodeHandle private_nh("~");
202  rotors_control::LeePositionControllerNode lee_position_controller_node(nh, private_nh);
203 
204  ros::spin();
205 
206  return 0;
207 }
void eigenTrajectoryPointFromMsg(const trajectory_msgs::MultiDOFJointTrajectoryPoint &msg, EigenTrajectoryPoint *trajectory_point)
#define ROS_INFO_ONCE(...)
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
void stop()
void setPeriod(const Duration &period, bool reset=true)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void CommandPoseCallback(const geometry_msgs::PoseStampedConstPtr &pose_msg)
void start()
void MultiDofJointTrajectoryCallback(const trajectory_msgs::MultiDOFJointTrajectoryConstPtr &trajectory_reference_msg)
#define ROS_WARN(...)
void GetRosParameter(const ros::NodeHandle &nh, const std::string &key, const T &default_value, T *value)
static constexpr char COMMAND_ACTUATORS[]
void GetVehicleParameters(const ros::NodeHandle &nh, VehicleParameters *vehicle_parameters)
void SetTrajectoryPoint(const mav_msgs::EigenTrajectoryPoint &command_trajectory)
void publish(const boost::shared_ptr< M > &message) const
static constexpr char ODOMETRY[]
void OdometryCallback(const nav_msgs::OdometryConstPtr &odometry_msg)
static constexpr char COMMAND_POSE[]
int main(int argc, char **argv)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
ROSCPP_DECL void spin()
mav_msgs::EigenTrajectoryPointDeque commands_
#define ROS_WARN_STREAM(args)
void eigenTrajectoryPointFromPoseMsg(const geometry_msgs::Pose &msg, EigenTrajectoryPoint *trajectory_point)
void SetOdometry(const EigenOdometry &odometry)
void CalculateRotorVelocities(Eigen::VectorXd *rotor_velocities) const
LeePositionControllerNode(const ros::NodeHandle &nh, const ros::NodeHandle &private_nh)
static constexpr char COMMAND_TRAJECTORY[]
void eigenOdometryFromMsg(const nav_msgs::OdometryConstPtr &msg, EigenOdometry *odometry)
Definition: common.h:71
LeePositionControllerParameters controller_parameters_


rotors_control
Author(s): Fadri Furrer, Michael Burri, Mina Kamel, Janosch Nikolic, Markus Achtelik
autogenerated on Mon Feb 28 2022 23:38:55