如何用位置参数初始化ROS的geometry_msgs::Pose?含Python/C++实现
关于ROS Pose按.msg顺序初始化的说明与实现
一、「按.msg顺序排列的完整字段值集合」是什么意思
ROS的geometry_msgs/Pose消息类型的.msg定义结构如下:
Point position Quaternion orientation
其中Point的结构为float64 x; float64 y; float64 z;,Quaternion的结构为float64 x; float64 y; float64 z; float64 w;。
所谓「按.msg顺序排列的完整字段值集合」,就是把Pose包含的所有底层字段,严格按照.msg文件的层级顺序依次列出:先position的x、y、z,再orientation的x、y、z、w,用这7个值的完整集合直接初始化Pose对象,无需逐个给pose.position.x、pose.orientation.w这类字段单独赋值。
二、Python实现
在ROS Python API中,可直接将7个字段值按顺序传入Pose的构造函数:
from geometry_msgs.msg import Pose # 按顺序传入:position.x, position.y, position.z, orientation.x, orientation.y, orientation.z, orientation.w my_pose = Pose(1.0, 2.0, 3.0, 0.0, 0.0, 0.0, 1.0)
这等价于逐字段赋值的写法:
my_pose = Pose() my_pose.position.x = 1.0 my_pose.position.y = 2.0 my_pose.position.z = 3.0 my_pose.orientation.x = 0.0 my_pose.orientation.y = 0.0 my_pose.orientation.z = 0.0 my_pose.orientation.w = 1.0
三、C++实现
在ROS C++ API中,同样支持按字段顺序直接传入构造函数,也可以先构造子消息再传入:
#include <geometry_msgs/Pose.h> int main() { // 方式1:直接传入所有底层字段值 geometry_msgs::Pose my_pose(1.0, 2.0, 3.0, 0.0, 0.0, 0.0, 1.0); // 等价的逐字段赋值方式 geometry_msgs::Pose my_pose2; my_pose2.position.x = 1.0; my_pose2.position.y = 2.0; my_pose2.position.z = 3.0; my_pose2.orientation.x = 0.0; my_pose2.orientation.y = 0.0; my_pose2.orientation.z = 0.0; my_pose2.orientation.w = 1.0; return 0; }
也可以先构造Point和Quaternion子对象,再传入Pose构造函数(同样符合.msg顺序的完整字段集合初始化):
#include <geometry_msgs/Pose.h> #include <geometry_msgs/Point.h> #include <geometry_msgs/Quaternion.h> int main() { geometry_msgs::Point pos(1.0, 2.0, 3.0); geometry_msgs::Quaternion ori(0.0, 0.0, 0.0, 1.0); geometry_msgs::Pose my_pose(pos, ori); return 0; }
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

