与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,很有可能是这一块出了问题。