diff --git a/panther_bringup/config/ekf_config.yaml b/panther_bringup/config/ekf_config.yaml new file mode 100644 index 000000000..d7e00d79b --- /dev/null +++ b/panther_bringup/config/ekf_config.yaml @@ -0,0 +1,63 @@ +# Ref: http://docs.ros.org/en/noetic/api/robot_localization/html/state_estimation_nodes.html + +frequency: 20 +sensor_timeout: 0.2 +two_d_mode: true + +transform_time_offset: 0.0 +transform_timeout: 0.1 + +map_frame: map +odom_frame: odom +base_link_frame: base_link +world_frame: odom +publish_tf: true +publish_acceleration: false + +odom0: odom/wheels +odom0_config: [false, false, false, + false, false, false, + true, true, false, + false, false, true, + false, false, false] +odom0_queue_size: 2 +odom0_nodelay: false +odom0_differential: false +odom0_relative: true + +imu0: imu/data +imu0_config: [false, false, false, + false, false, false, + false, false, false, + false, false, true, + true, true, false] +imu0_nodelay: false +imu0_differential: false +imu0_relative: true +imu0_queue_size: 5 + +imu0_remove_gravitational_acceleration: true + +reset_on_time_jump: false +predict_to_current_time: false +print_diagnostics: false +debug: false +debug_out_file: /path/to/debug/file.txt + +# Selected values ​​experimentally so as to ensure relatively fast convergence (values ​​should be about 10x higher than the sensor variance values) +dynamic_process_noise_covariance: true +process_noise_covariance: [1e-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1e-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1e-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3e-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3e-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3e-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2e-5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2e-5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2e-5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5e-5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5e-5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5e-5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5e-5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5e-5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5e-5] diff --git a/panther_bringup/config/imu_config.yaml b/panther_bringup/config/imu_config.yaml index 8a1eed524..1e51fd0a1 100644 --- a/panther_bringup/config/imu_config.yaml +++ b/panther_bringup/config/imu_config.yaml @@ -1,9 +1,16 @@ ImuFilterNodelet: + gain: 0.1 + zeta: 0.0 + mag_bias_x: 0.0 + mag_bias_y: 0.0 + mag_bias_z: 0.0 + orientation_stddev: 1e-2 publish_tf: false use_mag: false - use_magnetic_field_msg: false + use_magnetic_field_msg: true # If set to true, subscribe to the /imu/mag topic as a sensor_msgs/MagneticField; if set to false (deprecated), use geometry_msgs/Vector3Stamped. Only changes type of the message, whether mag data is used is controlled by the use_mag parameter fixed_frame: imu_link stateless: false + remove_gravity_vector: false PhidgetsSpatialNodelet: data_interval_ms: 8 # supported data rates: 4 8 16 24 32 40 ... 1000 (in ms) @@ -11,9 +18,10 @@ PhidgetsSpatialNodelet: # serial: 123456 # optional param serial, default is -1 # hub_port: 0 # optional param hub_port, used if connected to a VINT hub # frame_id: imu_link # optional param frame_id, default is "imu_link" - # linear_acceleration_stdev: 0.002745862 # optional param linear_acceleration_stdev, default is 280ug - # angular_velocity_stdev: 0.000349 # optional param angular_velocity_stdev, default is 0.095 deg/s - # magnetic_field_stdev: 1.1e-7 # optional param magnetic_field_stdev, default is 1.1 milligauss + # stdev values from imu specification (https://www.phidgets.com/?tier=3&catid=10&pcid=8&prodid=1205) + linear_acceleration_stdev: 3.5e-3 # Currently used IMU specification 10 * (2mg ± 1.5mg) (Accelerometer Drift Max ± Accelerometer Noise for 100 Hz) + angular_velocity_stdev: 1.5e-2 # Currently used IMU specification 0.1°/s ± 0.05°/s (Gyroscope Drift Max ± Gyroscope Noise for 100 Hz) + # magnetic_field_stdev: 10.0 # Currently used IMU specification ± 10mG (± Magnetometer Noise) # compass correction params (see http://www.phidgets.com/docs/1044_User_Guide) # cc_mag_field: 0.52859 diff --git a/panther_bringup/config/panther_common.yaml b/panther_bringup/config/panther_common.yaml index 4b4a3edd0..5db8d86d1 100644 --- a/panther_bringup/config/panther_common.yaml +++ b/panther_bringup/config/panther_common.yaml @@ -1,7 +1,7 @@ can_interface: panther_can odom_frame: odom base_link_frame: base_link -publish_tf: true +publish_tf: false publish_odom: true publish_pose: false publish_joints: true diff --git a/panther_bringup/launch/bringup.launch b/panther_bringup/launch/bringup.launch index d4d720570..48c078ca1 100644 --- a/panther_bringup/launch/bringup.launch +++ b/panther_bringup/launch/bringup.launch @@ -62,6 +62,8 @@ + + diff --git a/panther_bringup/launch/ekf.launch b/panther_bringup/launch/ekf.launch new file mode 100644 index 000000000..5dee16fa9 --- /dev/null +++ b/panther_bringup/launch/ekf.launch @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/panther_bringup/package.xml b/panther_bringup/package.xml index f3cc2a974..fb73f22ac 100644 --- a/panther_bringup/package.xml +++ b/panther_bringup/package.xml @@ -24,5 +24,6 @@ panther_msgs panther_power_control phidgets_spatial + robot_localization \ No newline at end of file diff --git a/panther_description/config/WH01.yaml b/panther_description/config/WH01.yaml index 0f4dc7353..3097414d8 100644 --- a/panther_description/config/WH01.yaml +++ b/panther_description/config/WH01.yaml @@ -6,3 +6,8 @@ inertia_y_offset: 0.0 mesh_package: panther_description folder_path: meshes/WH01 kinematics: differential + +# Value measured (using Husarion research toolkit) +velocity_x_stderr: 3.2e-3 +velocity_y_stderr: 1.4e-3 +velocity_yaw_stderr: 8.5e-3 \ No newline at end of file diff --git a/panther_description/config/WH02.yaml b/panther_description/config/WH02.yaml index d25f0ae71..582646916 100644 --- a/panther_description/config/WH02.yaml +++ b/panther_description/config/WH02.yaml @@ -6,3 +6,8 @@ inertia_y_offset: 0.0 mesh_package: panther_description folder_path: meshes/WH02 kinematics: mecanum + +# Selected intuitively based on WH01 results +velocity_x_stderr: 3.2e-3 +velocity_y_stderr: 3.2e-3 +velocity_yaw_stderr: 8.5e-3 \ No newline at end of file diff --git a/panther_description/config/WH04.yaml b/panther_description/config/WH04.yaml index bfc64e845..340ade38e 100644 --- a/panther_description/config/WH04.yaml +++ b/panther_description/config/WH04.yaml @@ -6,3 +6,8 @@ inertia_y_offset: 0.0 mesh_package: panther_description folder_path: meshes/WH04 kinematics: differential + +# Selected intuitively based on WH01 results +velocity_x_stderr: 1.6e-3 +velocity_y_stderr: 7.3e-4 +velocity_yaw_stderr: 4.3e-3 \ No newline at end of file diff --git a/panther_driver/src/driver_node.py b/panther_driver/src/driver_node.py index 2932a6947..4391a4d7d 100755 --- a/panther_driver/src/driver_node.py +++ b/panther_driver/src/driver_node.py @@ -75,6 +75,9 @@ def __init__(self, name: str) -> None: self._motor_torque_constant = rospy.get_param('~motor_torque_constant', 2.6149) self._gear_ratio = rospy.get_param('~gear_ratio', 30.08) self._encoder_resolution = rospy.get_param('~encoder_resolution', 400 * 4) + self._v_x_var = float(rospy.get_param('~velocity_x_stderr', 3.2e-3))**2 + self._v_y_var = float(rospy.get_param('~velocity_y_stderr', 3.2e-3))**2 + self._v_yaw_var = float(rospy.get_param('~velocity_yaw_stderr', 8.5e-3))**2 self._publish_tf = rospy.get_param('~publish_tf', True) self._publish_odom = rospy.get_param('~publish_odometry', True) @@ -170,7 +173,14 @@ def __init__(self, name: str) -> None: if self._publish_odom: self._odom_msg = Odometry() self._odom_msg.pose.covariance = [0.1 if (i % 7) == 0 else 0.0 for i in range(36)] - self._odom_msg.twist.covariance = [0.1 if (i % 7) == 0 else 0.0 for i in range(36)] + + not_used_var = 1e6 + self._odom_msg.twist.covariance = [self._v_x_var, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, self._v_y_var, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, not_used_var, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, not_used_var, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, not_used_var, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, self._v_yaw_var] self._odom_msg.header.frame_id = self._odom_frame self._odom_msg.child_frame_id = self._base_link_frame self._odom_pub = rospy.Publisher('odom/wheels', Odometry, queue_size=1)