controller.cpp
Go to the documentation of this file.
2 #include <ros/ros.h>
3 
4 
5 #define sqrt_2 1.41421356237
6 // #define wheel_rad 0.12
7 // #define diag_dist 0.31112698372
8 
9 controller::controller(ros::NodeHandle& nh, ros::NodeHandle& nh_private):nh_(nh), nh_private_(nh_private)
10 {
11  init_vars();
12  get_params();
13 
14  vel_sub = nh_.subscribe("cmd_vel", 5, &controller::cmd_vel_cb, this);
15  odom_sub_ = nh_.subscribe("odom", 1, &controller::odom_cb, this);
16 
17  front_right_cmd_pub = nh_.advertise<std_msgs::Float64>("/omnibase/front_right_joint_velocity_controller/command",10);
18  front_left_cmd_pub = nh_.advertise<std_msgs::Float64>("/omnibase/front_left_joint_velocity_controller/command",10);
19  back_right_cmd_pub = nh_.advertise<std_msgs::Float64>("/omnibase/back_right_joint_velocity_controller/command",10);
20  back_left_cmd_pub = nh_.advertise<std_msgs::Float64>("/omnibase/back_left_joint_velocity_controller/command",10);
21 
22  stop_bot();
23 
24  ROS_INFO("-----------------------------------------");
25  ROS_INFO(" Controller Initialized");
26  ROS_INFO("-----------------------------------------");
27 }
28 
29 
31 {
32  omega_1.data = 0;
33  omega_2.data = 0;
34  omega_3.data = 0;
35  omega_4.data = 0;
36 
37  x_dot = 0;
38  y_dot = 0;
39  yaw = 0;
40 }
41 
42 void controller::odom_cb(const nav_msgs::Odometry &odom){
44  geometry_msgs::TransformStamped transformStamped;
45 
46  transformStamped.header.stamp = ros::Time::now();
47  transformStamped.header.frame_id = "world";
48  transformStamped.child_frame_id = "origin_link";
49  transformStamped.transform.translation.x = odom.pose.pose.position.x;
50  transformStamped.transform.translation.y = odom.pose.pose.position.y;
51  transformStamped.transform.translation.z = odom.pose.pose.position.z;
52 
53  transformStamped.transform.rotation.x = odom.pose.pose.orientation.x;
54  transformStamped.transform.rotation.y = odom.pose.pose.orientation.y;
55  transformStamped.transform.rotation.z = odom.pose.pose.orientation.z;
56  transformStamped.transform.rotation.w = odom.pose.pose.orientation.w;
57 
58  br.sendTransform(transformStamped);
59 }
60 
61 void controller::cmd_vel_cb(const geometry_msgs::Twist &vel)
62 {
63  if (vel.linear.x < -max_lin_vel)
64  x_dot = -max_lin_vel;
65  else if (abs(vel.linear.x) < max_lin_vel)
66  x_dot = vel.linear.x;
67  else
69 
70  if (vel.linear.y < -max_lin_vel)
71  y_dot = -max_lin_vel;
72  else if (abs(vel.linear.y) < max_lin_vel)
73  y_dot = vel.linear.y;
74  else
76 
77  if (vel.angular.z > max_angular_vel){
79  }
80  else if (vel.angular.z < -max_angular_vel){
82  }
83  else{
84  yaw = vel.angular.z;
85  }
86 
87  // Converting the velocity to wheel velocity
88  omega_1.data = sqrt_2*(y_dot + x_dot) + 2 * yaw * diag_dist;
89  omega_2.data = sqrt_2*(-x_dot + y_dot) + 2 * yaw * diag_dist;
90  omega_3.data = sqrt_2*(x_dot - y_dot) + 2 * yaw * diag_dist;
91  omega_4.data = sqrt_2*(-x_dot - y_dot) + 2 * yaw * diag_dist;
92  omega_1.data /= 1*wheel_rad;
93  omega_2.data /= 1*wheel_rad;
94  omega_3.data /= 1*wheel_rad;
95  omega_4.data /= 1*wheel_rad;
96 
97  vel_publish();
98 }
99 
101 {
106 }
107 
109 {
110  for (int i = 0; i < 100; i++){
115  }
116 }
117 
119 {
120  if (nh_.hasParam("max_linear_velocity"))
121  nh_.getParam("max_linear_velocity", max_lin_vel);
122  else
123  max_lin_vel = 2;
124 
125  if (nh_.hasParam("max_angular_velocity"))
126  nh_.getParam("max_angular_velocity", max_angular_vel);
127  else
128  max_angular_vel = 2;
129 
130  if (nh_.hasParam("vel_mul_constant"))
131  nh_.getParam("vel_mul_constant", vel_mul);
132  else
133  vel_mul = 2;
134 
135  if (nh_.hasParam("diag_dist"))
136  nh_.getParam("diag_dist", diag_dist);
137 
138  if (nh_.hasParam("wheel_rad"))
139  nh_.getParam("wheel_rad", wheel_rad);
140 
141 }
ros::NodeHandle nh_
Definition: controller.h:30
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
std_msgs::Float64 omega_2
Definition: controller.h:43
float max_lin_vel
Definition: controller.h:49
float vel_mul
Definition: controller.h:47
void get_params()
Definition: controller.cpp:118
void vel_publish()
Definition: controller.cpp:100
ros::Publisher back_left_cmd_pub
Definition: controller.h:39
ros::Subscriber odom_sub_
Definition: controller.h:34
float y_dot
Definition: controller.h:44
void publish(const boost::shared_ptr< M > &message) const
float x_dot
Definition: controller.h:44
std_msgs::Float64 omega_4
Definition: controller.h:43
ros::Subscriber vel_sub
Definition: controller.h:33
std_msgs::Float64 omega_1
Definition: controller.h:43
ros::Publisher back_right_cmd_pub
Definition: controller.h:38
float yaw
Definition: controller.h:45
#define ROS_INFO(...)
bool getParam(const std::string &key, std::string &s) const
ros::Publisher front_right_cmd_pub
Definition: controller.h:36
#define sqrt_2
Definition: controller.cpp:5
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void sendTransform(const geometry_msgs::TransformStamped &transform)
bool hasParam(const std::string &key) const
ros::Publisher front_left_cmd_pub
Definition: controller.h:37
void cmd_vel_cb(const geometry_msgs::Twist &vel)
Definition: controller.cpp:61
void odom_cb(const nav_msgs::Odometry &)
Definition: controller.cpp:42
void stop_bot()
Definition: controller.cpp:108
float diag_dist
Definition: controller.h:47
static Time now()
void init_vars()
Definition: controller.cpp:30
float max_angular_vel
Definition: controller.h:49
float wheel_rad
Definition: controller.h:47
std_msgs::Float64 omega_3
Definition: controller.h:43
controller(ros::NodeHandle &nh, ros::NodeHandle &nh_private)
Definition: controller.cpp:9


omnibase_control
Author(s): Harshal Deshpande , Mihir Kulkarni
autogenerated on Mon Feb 28 2022 23:01:32