gpt4 book ai didi

c++ - 段错误(核心转储)ROS c++ 箭头

转载 作者:行者123 更新时间:2023-11-30 05:04:10 25 4
gpt4 key购买 nike

我正在尝试读取 geometry_msgs::PoseArray 并将其转换为适用于 ROS 的 C++ 中的 geometry_msgs::Pose。它应该只在主题/tag_detections_pose 上有数据时转换数据。当我运行这个节点(见代码)时,当/tag_detections_pose 上有一个空数组时,我在标记的位置出现了段错误(核心已转储)。我希望这是指针的问题,但找不到确切的位置。我想我必须初始化我的指针,但我不知 Prop 体在哪里。(顺便说一下,代码是将 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
---

最佳答案

而不是检查 if (input),您应该检查您真正关心的内容:姿势字段是否为非空。

在 ROS 消息中,数组存储为 C++ vector。要检查 poses vector 是否有任何元素,您可以将条件替换为 if (!input->poses.empty())

关于c++ - 段错误(核心转储)ROS c++ 箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49059435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com