#[macro_export]
macro_rules! rosmsg_include {
( $($ns:ident / $msg:ident),* $(,)?) => {
::rosrust::rosmsg_include!(
geometry_msgs/Point,
geometry_msgs/Pose,
geometry_msgs/Quaternion,
geometry_msgs/Transform,
geometry_msgs/Vector3,
$($ns/$msg),*
);
::ros_nalgebra::ros_nalgebra!(self);
}
}
#[macro_export]
macro_rules! ros_nalgebra_msg {
($ns:ident, Vector3) => {
impl From<$ns::geometry_msgs::Vector3> for ::nalgebra::Vector3<f64> {
fn from(vec_msg: $ns::geometry_msgs::Vector3) -> Self {
::nalgebra::Vector3::new(vec_msg.x, vec_msg.y, vec_msg.z)
}
}
impl From<::nalgebra::Vector3<f64>> for $ns::geometry_msgs::Vector3 {
fn from(vec: ::nalgebra::Vector3<f64>) -> Self {
let mut m = $ns::geometry_msgs::Vector3::default();
m.x = vec.x;
m.y = vec.y;
m.z = vec.z;
m
}
}
impl From<$ns::geometry_msgs::Vector3> for ::nalgebra::Translation3<f64> {
fn from(vec_msg: $ns::geometry_msgs::Vector3) -> Self {
::nalgebra::Translation3::new(vec_msg.x, vec_msg.y, vec_msg.z)
}
}
impl From<::nalgebra::Translation3<f64>> for $ns::geometry_msgs::Vector3 {
fn from(p: ::nalgebra::Translation3<f64>) -> Self {
let mut m = $ns::geometry_msgs::Vector3::default();
m.x = p.vector.x;
m.y = p.vector.y;
m.z = p.vector.z;
m
}
}
};
($ns:ident, Point) => {
impl From<$ns::geometry_msgs::Point> for ::nalgebra::Translation3<f64> {
fn from(vec_msg: $ns::geometry_msgs::Point) -> Self {
::nalgebra::Translation3::new(vec_msg.x, vec_msg.y, vec_msg.z)
}
}
impl From<::nalgebra::Translation3<f64>> for $ns::geometry_msgs::Point {
fn from(p: ::nalgebra::Translation3<f64>) -> Self {
let mut m = $ns::geometry_msgs::Point::default();
m.x = p.vector.x;
m.y = p.vector.y;
m.z = p.vector.z;
m
}
}
impl From<$ns::geometry_msgs::Point> for ::nalgebra::Point3<f64> {
fn from(vec_msg: $ns::geometry_msgs::Point) -> Self {
::nalgebra::Point3::new(vec_msg.x, vec_msg.y, vec_msg.z)
}
}
impl From<::nalgebra::Point3<f64>> for $ns::geometry_msgs::Point {
fn from(p: ::nalgebra::Point3<f64>) -> Self {
let mut m = $ns::geometry_msgs::Point::default();
m.x = p.coords.x;
m.y = p.coords.y;
m.z = p.coords.z;
m
}
}
};
($ns:ident, Quaternion) => {
impl From<$ns::geometry_msgs::Quaternion> for ::nalgebra::UnitQuaternion<f64> {
fn from(q_msg: $ns::geometry_msgs::Quaternion) -> Self {
::nalgebra::UnitQuaternion::from_quaternion(::nalgebra::Quaternion::new(
q_msg.w, q_msg.x, q_msg.y, q_msg.z,
))
}
}
impl From<::nalgebra::UnitQuaternion<f64>> for $ns::geometry_msgs::Quaternion {
fn from(q: ::nalgebra::UnitQuaternion<f64>) -> Self {
let mut m = $ns::geometry_msgs::Quaternion::default();
m.x = q.coords.x;
m.y = q.coords.y;
m.z = q.coords.z;
m.w = q.coords.w;
m
}
}
impl From<$ns::geometry_msgs::Quaternion> for ::nalgebra::Quaternion<f64> {
fn from(q_msg: $ns::geometry_msgs::Quaternion) -> Self {
::nalgebra::Quaternion::new(q_msg.w, q_msg.x, q_msg.y, q_msg.z)
}
}
impl From<::nalgebra::Quaternion<f64>> for $ns::geometry_msgs::Quaternion {
fn from(q: ::nalgebra::Quaternion<f64>) -> Self {
let mut m = $ns::geometry_msgs::Quaternion::default();
m.x = q.coords.x;
m.y = q.coords.y;
m.z = q.coords.z;
m.w = q.coords.w;
m
}
}
};
($ns:ident, Pose) => {
impl From<$ns::geometry_msgs::Pose> for ::nalgebra::Isometry3<f64> {
fn from(pose_msg: $ns::geometry_msgs::Pose) -> Self {
::nalgebra::Isometry3::from_parts(
pose_msg.position.into(),
pose_msg.orientation.into(),
)
}
}
impl From<::nalgebra::Isometry3<f64>> for $ns::geometry_msgs::Pose {
fn from(pose: ::nalgebra::Isometry3<f64>) -> Self {
let mut m = $ns::geometry_msgs::Pose::default();
m.position = pose.translation.into();
let q: ::nalgebra::UnitQuaternion<f64> = pose.rotation.into();
m.orientation = q.into();
m
}
}
};
($ns:ident, Transform) => {
impl From<$ns::geometry_msgs::Transform> for ::nalgebra::Isometry3<f64> {
fn from(pose_msg: $ns::geometry_msgs::Transform) -> Self {
::nalgebra::Isometry3::from_parts(
pose_msg.translation.into(),
pose_msg.rotation.into(),
)
}
}
impl From<::nalgebra::Isometry3<f64>> for $ns::geometry_msgs::Transform {
fn from(pose: ::nalgebra::Isometry3<f64>) -> Self {
let mut m = $ns::geometry_msgs::Transform::default();
m.translation = pose.translation.into();
let q: ::nalgebra::UnitQuaternion<f64> = pose.rotation.into();
m.rotation = q.into();
m
}
}
};
}
#[macro_export]
macro_rules! ros_nalgebra {
($ns:ident) => {
::ros_nalgebra::ros_nalgebra_msg!($ns, Point);
::ros_nalgebra::ros_nalgebra_msg!($ns, Vector3);
::ros_nalgebra::ros_nalgebra_msg!($ns, Quaternion);
::ros_nalgebra::ros_nalgebra_msg!($ns, Pose);
::ros_nalgebra::ros_nalgebra_msg!($ns, Transform);
};
}