我试图读取geometry_msgs :: PoseArray并将其转换为c ++中的geometry_msgs :: Pose for ROS。它只应在topic / tag_detections_pose上有数据时转换数据。当我运行这个节点(参见代码)时,当/ tag_detections_pose上有一个空数组时,我在标记的位置得到一个分段错误(核心转储)。我希望这是一个指针问题,但无法准确找到。我想我必须初始化我的指针,但我不知道究竟在哪里。 (b.t.w.代码是将apriltag_ros消息转换为simulink可读)
#include "ros/ros.h"
#include <geometry_msgs/Pose.h>
#include <geometry_msgs/PoseArray.h>
#include <std_msgs/Bool.h>
#include <array>
class SubscribeAndPublish
{
public:
SubscribeAndPublish()
{
//Topic you want to publish
pub_ = n_.advertise<geometry_msgs::Pose>("/tag_pose", 1);
//Topic you want to subscribe
sub_ = n_.subscribe<geometry_msgs::PoseArray>("/tag_detections_pose", 1, &SubscribeAndPublish::callback, this);
}
void callback(const geometry_msgs::PoseArray::ConstPtr& input)
{
if (input) {
geometry_msgs::Pose output;
output.position.x = input->poses[0].position.x; //Here I get the segmentation fault
output.position.y = input->poses[0].position.y;
output.position.z = input->poses[0].position.z;
output.orientation.x = input->poses[0].orientation.x;
output.orientation.y = input->poses[0].orientation.y;
output.orientation.z = input->poses[0].orientation.z;
output.orientation.w = input->poses[0].orientation.w;
pub_.publish(output);
}
}
private:
ros::NodeHandle n_;
ros::Publisher pub_;
ros::Subscriber sub_;
};//End of class SubscribeAndPublish
int main(int argc, char **argv)
{
//Initiate ROS
ros::init(argc, argv, "apriltag_to_simu_V2");
SubscribeAndPublish SAPObject;
ros::spin();
return 0;
}
编辑:一些额外的信息。 每当我从/ tag_detections_pose读取下一个数据时,就会发生分段错误。
header:
seq: 14192
stamp:
secs: 1519941974
nsecs: 650975624
frame_id: usb_cam
poses: []
---
header:
seq: 14193
stamp:
secs: 1519941974
nsecs: 995796728
frame_id: usb_cam
poses: []
---
每当我看到一个apriltag,就没有分段错误。然后,以下代码来自/ tag_detections_pose:
---
header:
seq: 80
stamp:
secs: 1519981664
nsecs: 100302767
frame_id: usb_cam
poses:
-
position:
x: 0.110443956833
y: -0.080843233518
z: 0.753152633488
orientation:
x: 0.706039345202
y: 0.705726892216
z: -0.0580458686961
w: 0.00941667438916
---
header:
seq: 81
stamp:
secs: 1519981664
nsecs: 368606478
frame_id: usb_cam
poses:
-
position:
x: 0.110435802307
y: -0.0808251086937
z: 0.753089835655
orientation:
x: 0.706068882885
y: 0.705719138117
z: -0.0577643573596
w: 0.0095136604333
---
答案 0 :(得分:1)
不应检查if (input)
,而应检查您实际关心的内容:姿势字段是否为非空。
在ROS消息中,数组存储为C ++ vector
。要检查poses
向量是否包含任何元素,您可以用if (!input->poses.empty())
答案 1 :(得分:0)
可能发生seg fault
因为你在订阅者构造函数中声明了一个非指针类型(我还没有测试过这个)。
你不必初始化geometry_msgs::PoseArray::ConstPtr&
你可以做geometry_msgs::PoseArray
并摆脱指针
答案 2 :(得分:0)
这是我解决这个问题的方法。
在 if(msg->detections.size()>0)
data = msg->detections[0].pose.pose;