Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scale obstacle distance with vehicle attitude for varying sensor orientations (Collision Prevention) #24107

Open
wants to merge 10 commits into
base: main
Choose a base branch
from

Conversation

mahimayoga
Copy link

@mahimayoga mahimayoga commented Dec 13, 2024

Solved Problem

Scaling of distance_reading to an obstacle was done under the assumption that the sensor was always mounted facing forward, so distance_reading was only scaled for pitch.

Solution

Orientation of sensor w.r.t vehicle body frame is taken into account, and the relevant vehicle attitude angles (pitch and/or roll) are used to scale the outputted distance.

Changelog Entry

For release notes:

Feature: Obstacle distance in obstacle_distance_fused scaled for pitch/roll, based on the orientation of the sensor in the XY plane of the vehicle. 

Alternatives

We could also ...

Test coverage

  • Simulation/hardware testing logs: (Indoor, giving pitch/roll input manually for different sensor orientations @ fixed distance to flat wall)

  • Front facing:
    attitude
    distance

  • Left facing (270 deg):

attitude
distance

  • 45 deg:

attitude
distance

Roll scaling not super accurate in the 45deg case, probably because the placement of the sensor wasn't very exact. Can see it works well in the Left facing scenario.

Copy link
Member

@bresch bresch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks ok, but there is a more efficient way to do this without passing by euler angles. You can compensate for a tilt by taking the last element of

/**
* Corresponding body z-axis to an attitude quaternion /
* last orthogonal unit basis vector
*
* == last column of the equivalent rotation matrix
* but calculated more efficiently than a full conversion
*/
Vector3<Type> dcm_z() const
{
const Quaternion &q = *this;
Vector3<Type> R_z;
const Type a = q(0);
const Type b = q(1);
const Type c = q(2);
const Type d = q(3);
R_z(0) = 2 * (a * c + b * d);
R_z(1) = 2 * (c * d - a * b);
R_z(2) = a * a - b * b - c * c + d * d;
return R_z;
}
};
, which is the length of the projection of the body_z vector on the "down" vector.

src/lib/collision_prevention/CollisionPrevention.cpp Outdated Show resolved Hide resolved
src/lib/collision_prevention/CollisionPrevention.cpp Outdated Show resolved Hide resolved
src/lib/collision_prevention/CollisionPrevention.cpp Outdated Show resolved Hide resolved
@mahimayoga
Copy link
Author

This looks ok, but there is a more efficient way to do this without passing by euler angles. You can compensate for a tilt by taking the last element of

/**
* Corresponding body z-axis to an attitude quaternion /
* last orthogonal unit basis vector
*
* == last column of the equivalent rotation matrix
* but calculated more efficiently than a full conversion
*/
Vector3<Type> dcm_z() const
{
const Quaternion &q = *this;
Vector3<Type> R_z;
const Type a = q(0);
const Type b = q(1);
const Type c = q(2);
const Type d = q(3);
R_z(0) = 2 * (a * c + b * d);
R_z(1) = 2 * (c * d - a * b);
R_z(2) = a * a - b * b - c * c + d * d;
return R_z;
}
};

, which is the length of the projection of the body_z vector on the "down" vector.

Thanks! I am having a look now, but it's not intuitive to me how I could use this. I don't know if I am misinterpreting it but: Say I have a forward facing sensor, and I compute the quaternion of the rotated sensor (from the vehicle attitude) w.r.t the initial vehicle frame (FRD). Then taking the last element of quaternion.dcm_z() as the scaling factor would also account for tilt in the roll axis right? But this shouldn't affect the distance to an obstacle.

@mahimayoga
Copy link
Author

Projection now found without passing Euler angles. Results for sensor placed with 45 degree orientation:

attitude_2
distance_2

@mahimayoga mahimayoga requested a review from bresch December 16, 2024 16:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants