7 #include <robotcontrol.h>
10 #include <dynamic_reconfigure/server.h>
11 #include <geometry_msgs/Quaternion.h>
12 #include <geometry_msgs/Twist.h>
13 #include <imu_filter_madgwick/imu_filter.h>
14 #include <nav_msgs/Odometry.h>
15 #include <geometry_msgs/TwistWithCovarianceStamped.h>
16 #include <ros/package.h>
18 #include <std_msgs/Float32MultiArray.h>
19 #include <tf/transform_broadcaster.h>
20 #include <tf2/LinearMath/Quaternion.h>
21 #include <tf/transform_listener.h>
22 #include <sensor_msgs/Imu.h>
25 #include <robot/RobotConfig.h>
76 rc_kill_existing_process(2.0);
77 rc_enable_signal_handler();
82 rc_gpio_init(
S0, GPIOHANDLE_REQUEST_OUTPUT);
83 rc_gpio_init(
S1, GPIOHANDLE_REQUEST_OUTPUT);
84 rc_gpio_init(
S2, GPIOHANDLE_REQUEST_OUTPUT);
85 rc_gpio_init(
LINE_LED, GPIOHANDLE_REQUEST_OUTPUT);
86 rc_mpu_config_t conf = rc_mpu_default_config();
88 conf.enable_magnetometer = 1;
89 conf.gpio_interrupt_pin_chip = 3;
90 conf.gpio_interrupt_pin = 21;
91 conf.dmp_sample_rate = 100;
92 conf.compass_time_constant = 10;
93 conf.dmp_fetch_accel_gyro = 1;
94 conf.mag_sample_rate_div = 1;
95 rc_mpu_initialize_dmp(&
data, conf);
107 for (
int i = 1; i <= 6; i++)
116 for (
int i = 1; i <= 6; i++)
123 std_msgs::Float32MultiArray line_raw_msg;
124 for (
int i = 0; i < 6; i++)
130 catch (
const std::exception &e)
132 ROS_ERROR_STREAM(e.what());
141 void twistCallback(
const geometry_msgs::Twist::ConstPtr &msg)
152 ROS_INFO_STREAM(
"Parameter reconfigure requested.");
162 int main(
int argc,
char **argv)
164 ros::init(argc, argv,
"robot_node");
166 ros::Subscriber sub = n.subscribe(
"cmd_vel", 1000,
twistCallback);
167 line_raw_pub = n.advertise<std_msgs::Float32MultiArray>(
"line_sensors_raw", 1000);
168 twist_pub = n.advertise<geometry_msgs::TwistWithCovarianceStamped>(
"twist_beagle", 1000);
170 imu_pub = n.advertise<sensor_msgs::Imu>(
"imu_beagle", 1000);
172 static tf::TransformBroadcaster imu_broadcaster;
175 std::string base_link_tf;
176 std::string imu_link_tf;
179 if (n.getParam(
"odom_tf", odom_tf) && n.getParam(
"base_link_tf", base_link_tf)
180 && n.getParam(
"imu_link_tf", imu_link_tf)){}
183 ROS_ERROR(
"Failed to get param.");
186 tf::TransformListener listener;
189 dynamic_reconfigure::Server<robot::RobotConfig> server;
190 dynamic_reconfigure::Server<robot::RobotConfig>::CallbackType f;
192 server.setCallback(f);
200 double start_time = ros::Time::now().toSec();
201 ROS_INFO_STREAM(
"Sensor calibration in progress...");
219 ROS_INFO_STREAM(
"Sensor calibration complete...");
227 float v_left = s_left /
DT;
228 float v_right = s_right /
DT;
233 float s_total = (s_left + s_right) / 2.0;
235 tf::StampedTransform transform;
237 listener.lookupTransform(odom_tf, base_link_tf, ros::Time(0), transform);
239 catch (tf::TransformException ex){
241 angle_th = tf::getYaw(transform.getRotation());
251 ros::Time current_time = ros::Time::now();
252 geometry_msgs::TwistWithCovarianceStamped measured_twist;
253 measured_twist.header.stamp = current_time;
254 measured_twist.header.frame_id = odom_tf;
257 measured_twist.twist.twist.angular.z =
w_robot;
259 measured_twist.twist.covariance[0] = 0.1;
260 measured_twist.twist.covariance[7] = 0.1;
261 measured_twist.twist.covariance[14] = 0.1;
262 measured_twist.twist.covariance[21] = 0.1;
263 measured_twist.twist.covariance[28] = 0.1;
264 measured_twist.twist.covariance[35] = 0.1;
269 geometry_msgs::TransformStamped imu_trans;
270 imu_trans.header.stamp = current_time;
271 imu_trans.header.frame_id = base_link_tf;
272 imu_trans.child_frame_id = imu_link_tf;
273 imu_trans.transform.translation.x = 0.04;
274 imu_trans.transform.translation.y = 0.0;
275 imu_trans.transform.translation.z = 0.0;
276 imu_trans.transform.rotation = tf::createQuaternionMsgFromRollPitchYaw(0.0, 0.0, 0.0);
277 imu_broadcaster.sendTransform(imu_trans);
280 sensor_msgs::Imu imu;
281 imu.header.stamp = current_time;
282 imu.header.frame_id = imu_link_tf;
283 geometry_msgs::Quaternion imu_quat = tf::createQuaternionMsgFromRollPitchYaw(0.0, 0.0,
angle_th);
285 imu.orientation = imu_quat;
289 imu.linear_acceleration.x =
data.accel[1];
290 imu.linear_acceleration.y = -
data.accel[0];
291 imu.linear_acceleration.z =
data.accel[2];
293 imu.orientation_covariance[0] = 0.1;
294 imu.orientation_covariance[4] = 0.1;
295 imu.orientation_covariance[8] = 0.1;
297 imu.angular_velocity_covariance[0] = 0.1;
298 imu.angular_velocity_covariance[4] = 0.1;
299 imu.angular_velocity_covariance[8] = 0.1;
301 imu.linear_acceleration_covariance[0] = 0.1;
302 imu.linear_acceleration_covariance[4] = 0.1;
303 imu.linear_acceleration_covariance[8] = 0.1;
327 rc_encoder_cleanup();
329 rc_remove_pid_file();