12 #include <robotcontrol.h>
15 #include <dynamic_reconfigure/server.h>
16 #include <geometry_msgs/Quaternion.h>
17 #include <geometry_msgs/Twist.h>
18 #include <imu_filter_madgwick/imu_filter.h>
19 #include <nav_msgs/Odometry.h>
20 #include <geometry_msgs/TwistWithCovarianceStamped.h>
21 #include <ros/package.h>
23 #include <std_msgs/Float32MultiArray.h>
24 #include <tf/transform_broadcaster.h>
25 #include <tf2/LinearMath/Quaternion.h>
26 #include <tf/transform_listener.h>
27 #include <sensor_msgs/Imu.h>
30 #include <robot/RobotConfig.h>
82 rc_kill_existing_process(2.0);
83 rc_enable_signal_handler();
88 rc_gpio_init(
S0, GPIOHANDLE_REQUEST_OUTPUT);
89 rc_gpio_init(
S1, GPIOHANDLE_REQUEST_OUTPUT);
90 rc_gpio_init(
S2, GPIOHANDLE_REQUEST_OUTPUT);
91 rc_gpio_init(
LINE_LED, GPIOHANDLE_REQUEST_OUTPUT);
92 rc_mpu_config_t conf = rc_mpu_default_config();
94 conf.enable_magnetometer = 1;
95 conf.gpio_interrupt_pin_chip = 3;
96 conf.gpio_interrupt_pin = 21;
97 conf.dmp_sample_rate = 100;
98 conf.compass_time_constant = 10;
99 conf.dmp_fetch_accel_gyro = 1;
100 conf.mag_sample_rate_div = 1;
101 rc_mpu_initialize_dmp(&
data, conf);
110 void twistCallback(
const geometry_msgs::Twist::ConstPtr &msg)
121 ROS_INFO_STREAM(
"Parameter reconfigure requested.");
131 int main(
int argc,
char **argv)
133 ros::init(argc, argv,
"robot_node");
135 ros::Subscriber sub = n.subscribe(
"cmd_vel", 1000,
twistCallback);
136 line_raw_pub = n.advertise<std_msgs::Float32MultiArray>(
"line_sensors_raw", 1000);
137 twist_pub = n.advertise<geometry_msgs::TwistWithCovarianceStamped>(
"twist_beagle", 1000);
139 imu_pub = n.advertise<sensor_msgs::Imu>(
"imu_beagle", 1000);
142 std::string base_link_tf;
143 std::string imu_link_tf;
145 if (n.getParam(
"odom_tf", odom_tf) && n.getParam(
"base_link_tf", base_link_tf)
146 && n.getParam(
"imu_link_tf", imu_link_tf)){}
149 ROS_ERROR(
"Failed to get param.");
153 dynamic_reconfigure::Server<robot::RobotConfig> server;
154 dynamic_reconfigure::Server<robot::RobotConfig>::CallbackType f;
156 server.setCallback(f);
160 ros::Duration(0.5).sleep();
168 double start_time = ros::Time::now().toSec();
169 ROS_INFO_STREAM(
"Sensor calibration in progress...");
187 ROS_INFO_STREAM(
"Sensor calibration complete...");
198 float v_left = s_left /
DT;
199 float v_right = s_right /
DT;
217 float s_total = (s_left + s_right) / 2.0;
223 ros::Time current_time = ros::Time::now();
224 geometry_msgs::TwistWithCovarianceStamped measured_twist;
225 measured_twist.header.stamp = current_time;
226 measured_twist.header.frame_id = base_link_tf;
227 measured_twist.twist.twist.linear.x =
v_robot;
228 measured_twist.twist.twist.linear.y = 0 ;
229 measured_twist.twist.twist.angular.z =
w_robot;
231 measured_twist.twist.covariance[0] = 0.1;
232 measured_twist.twist.covariance[7] = 0.1;
233 measured_twist.twist.covariance[14] = 0.1;
234 measured_twist.twist.covariance[21] = 0.1;
235 measured_twist.twist.covariance[28] = 0.1;
236 measured_twist.twist.covariance[35] = 0.1;
241 sensor_msgs::Imu imu;
242 imu.header.stamp = current_time;
243 imu.header.frame_id = base_link_tf;
244 geometry_msgs::Quaternion imu_quat = tf::createQuaternionMsgFromRollPitchYaw(0.0, 0.0, 0.0);
246 imu.orientation = imu_quat;
247 imu.angular_velocity.x = 0;
248 imu.angular_velocity.y = 0;
251 imu.linear_acceleration.y = 0.0;
252 imu.linear_acceleration.z = 0;
254 imu.orientation_covariance[0] = 0.1;
255 imu.orientation_covariance[4] = 0.1;
256 imu.orientation_covariance[8] = 0.1;
258 imu.angular_velocity_covariance[0] = 0.1;
259 imu.angular_velocity_covariance[4] = 0.1;
260 imu.angular_velocity_covariance[8] = 0.1;
262 imu.linear_acceleration_covariance[0] = 0.1;
263 imu.linear_acceleration_covariance[4] = 0.1;
264 imu.linear_acceleration_covariance[8] = 0.1;
278 rc_encoder_cleanup();
280 rc_remove_pid_file();