ROS日常开发笔记

文章记录了ROS开发中遇到的两个问题:一是如何将四元数转换为RPY角度,使用了`tf2::getYaw()`函数;二是ActionServer启动时出现Segmentationfault,原因是构造函数中成员初始化的顺序错误,调整NodeHandle和ActionServer的顺序后问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

与ROS开发相关的日常踩坑纪录

不做细分类整理,随时补充。记下来备忘

四元数快速转RPY角

输入变量类型geometry_msgs::PoseStamped global_vel,将其中的orientation(四元数)转为可视化更好的RPY,如下:
double yaw = tf2::getYaw(global_vel.pose.orientation); 这个函数需要 #include <tf2/utils.h>

action server节点一启动就 segmentation fault

这个问题debug大半天最后最后才发现问题核心,简单说下前因后果。
一开始是打算用action server写个统管全局规划和局部规划的节点,写完以后编译通过了,但是一起启动该ros节点就提示segmentation fault,直接就在action server所在类的那个构造函数就死掉了。代码大致如下

class test
{
private:
    void executeCB(const nps::npsGoalConstPtr &goal)  // Note: "Action" is not appended to DoDishes here
    {
    // Do lots of awesome groundbreaking robot stuff here
        while (1)
        {
            ROS_INFO("Executing...");
            ros::Rate(1.0).sleep();
        }
    
    }

    void showCallback(const ros::TimerEvent& event)
    {
        ROS_INFO("show time");
    }
 
    actionlib::SimpleActionServer<nps::npsAction> as_;
    nps::npsFeedback fb_;
    nps::npsResult res_;
    std::string name_;
    ros::NodeHandle nh_;
    ros::Timer heart_beat_;

public:
    test(std::string name):as_(nh_, name, boost::bind(&test::executeCB, this, _1), false), name_(name)
    {
        as_.start();
        heart_beat_ = nh_.createTimer(ros::Duration(1.0), &test::showCallback, this);
    }
    ~test()
    {
    }
   
};

int main(int argc, char** argv)
{
  ros::init(argc, argv, "do_dishes");
  ros::NodeHandle nh;
  test a("test");
  
  
  ros::spin();
  return 0;
}

因为之前其实写一个demo也运行成功过,所以就疯狂进行对比,包括什么action文件的编写啊,构造函数的写法等各种思路去debug,都没发现问题。
直到后面开始关注这个初始化参数列表,然后看相关的资料,最终发现其实是语法(大概算是?)的问题。
在菜鸟教程的C++构造函数初始化列表的百科上看到这么一句话

C++ 初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

就想到,action server这个玩意应该是依赖于 ros 的句柄,然后留意到我上面贴的代码:action server的类成员是放在了 ros::NodeHandle nh的前面。
于是赶紧把俩的位置一调,编译运行,问题解决!
所以说用ros给封装的这些模组的时候,如果出现构造时候就 segmentation fault 的话,可以关注下 ros node handle,很有可能是这一块出了问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值