首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >xyx空间中的八叉图(八叉树)坐标

xyx空间中的八叉图(八叉树)坐标
EN

Stack Overflow用户
提问于 2018-06-25 18:08:25
回答 1查看 1.4K关注 0票数 1

给定一个octomap::OcTree,我如何获得被占用单元格的笛卡尔坐标?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double printOccupied(boost::shared_ptr<octomap::OcTree> octree) {

    // Get some octomap config data
    auto res = octree->getResolution();
    unsigned int max_depth = octree->getTreeDepth();

    // Iterate over nodes
    int count = 0;
    std::cout << "printOccupied: octree res = " << res << std::endl;
    std::cout << "printOccupied: octree max depth = " << max_depth << std::endl;
    std::cout << "printOccupied: iterating over nodes..." << std::endl;
    for (octomap::OcTree::iterator it = octree->begin(); it != octree->end(); ++it) {
        if (octree->isNodeOccupied(*it) && it.getDepth() < max_depth) {
            count++;
            // Fetching the coordinates in octomap-space
            std::cout << "  x = " << it.getX() << std::endl;
            std::cout << "  y = " << it.getY() << std::endl;
            std::cout << "  z = " << it.getZ() << std::endl;
            std::cout << "  size = " << it.getSize() << std::endl;
            std::cout << "  depth = " << it.getDepth() << std::endl;
            // Then convert to meters???
            auto cell = std::make_tuple(it.getX() * res,
                                        it.getY() * res,
                                        it.getZ() * res);
        }
    }
    std::cout << "printOccupied: number of occupied cells = " << count << std::endl;
}

不出所料,当我传入一个从空PlanningScene生成的octree时,我得到的是0个占用的单元格。当我使用一个已知在xyz坐标(0.1,0.8,0.1)处半径为0.05米的场景时,根据场景的参考帧(也是米),我会得到以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printOccupied: octree res = 0.02
printOccupied: octree max depth = 16
printOccupied: iterating over nodes...
  x = -327.68
  y = -327.68
  z = -327.68
  size = 655.36
  depth = 1
  x = 327.68
  y = -327.68
  z = -327.68
  size = 655.36
  depth = 1
  x = -491.52
  y = 491.52
  z = -491.52
  size = 327.68
  depth = 2
  x = 327.68
  y = 327.68
  z = -327.68
  size = 655.36
  depth = 1
  x = -92.16
  y = 624.64
  z = 51.2
  size = 20.48
  depth = 6
  x = -81.92
  y = 409.6
  z = 245.76
  size = 163.84
  depth = 3
  x = -419.84
  y = 624.64
  z = 378.88
  size = 20.48
  depth = 6
  x = -409.6
  y = 409.6
  z = 573.44
  size = 163.84
  depth = 3
  x = 327.68
  y = 327.68
  z = 327.68
  size = 655.36
  depth = 1
printOccupied: number of occupied cells = 9

当然,必须进行一些转换,因为这些octomap xyz值并不像预期的那样对应于单个小球体。这是什么转换?

EN

回答 1

Stack Overflow用户

发布于 2018-07-03 14:33:45

我发现问题出在你使用迭代器的方式上。八叉树具有树的结构,您使用的迭代器在树中导航,而不考虑单元格的深度。

深度从树根开始计数,因此您显示为输出的单元格是高级单元格,由于其大小,通常不应用于冲突检查目的(depth=1是树的根,它包含4个深度为2的单元格...然后递归地进行,直到max_depth,它通常是16)。

我知道您想知道哪些叶单元(较小的单元)被占用,并且您有一个迭代器可以帮助您做到这一点。我是这样做的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for(OcTree::leaf_iterator it = octree->begin_leafs(), end = octree->end_leafs(); it != end; ++it){
        // Fetching the coordinates in octomap-space
        std::cout << "  x = " << it.getX() << std::endl;
        std::cout << "  y = " << it.getY() << std::endl;
        std::cout << "  z = " << it.getZ() << std::endl;
        std::cout << "  size = " << it.getSize() << std::endl;
        std::cout << "  depth = " << it.getDepth() << std::endl;
    }
}

不需要转换,xyz已经在地图的全局坐标中。

注意:如果您只需要在边界框内的单元格中导航,请查看octree->begin_leafs_bbx()end_leafs_bbx()方法来创建迭代器。如果你需要限制叶子的深度,我想你也可以用这些方法来实现。

我希望这能帮到你。诚挚的问候,

阿德里安

编辑:由于begin_leafs()的返回类型错误,更改了答案中的代码。此外,还注意到根据Octomap,begin_leafs()end_leafs()具有与begin()end()相同的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51029513

复制
相关文章
Python中*args和**kwargs
在python开发的过程中,经常会遇到了*args和**kwargs这两个魔法变量,那么它们是什么呢?
SEian.G
2021/07/07
1.1K0
解决SystemExit: 2,args = parser.parse_args() 的问题,
报错原因: argparse 是一个旨在解析从命令行传递的参数的模块,您可以使用 argparse 来编译 参数内容。如果 argparse 认为参数无效,则退出,这通常在 python 中通过调用 sys.exit() 来完成,这会引发 SystemExit 错误,这就是您所看到的。 所以问题是你试图从交互式解释器(看起来像 ipython)中使用 argparse,此时程序已经启动,所以应该已经解析了 args。
汀丶人工智能
2022/12/21
1.8K0
python中的*args和**kwar
python支持可变参数:可以使用*args、**kwargs实现 *args是可变的positional arguments列表,是一个tuple。 **kwargs是可变的keyword arguments列表,是一个dict。 *args必须位于 **kwargs之前,因为positional arguments必须位于keyword arguments之前。 *args、**kwargs的使用: 函数定义:是一个将参数pack的过程 函数调用:将参数unpack 例子: def foo(*args,
py3study
2020/01/16
6540
Python函数中的*、*args、**kwargs
当函数需要的参数数量不确定的时候,可以使用args 和 kwargs , 所有的位置参数保存在args中,以元组的形式保存,调用时直接用args,不需要带 * 所有的关键参数保存在kwargs中,以字典的形式保存,调用时也直接使用kwargs
神秘的寇先森
2020/02/19
9570
Spring-AOP @AspectJ切点函数之args()和@args()
虽然args()允许在类名后使用“+”通配符,但该通配符在此处没有意义,添加和不添加的效果都一样。
小小工匠
2021/08/17
1.1K0
Python中 *args 和 **kwargs 的含义?
答:在python中,*args和**kwargs通常使用在函数定义里。*args 和 **kwargs 都允许你给函数传不定数量的参数,即使在定义函数的时候不知道调用者会传递几个参数。ps: *args和**kwargs只是一个大家都遵守的习惯,名字可以任意写的 。
用户1564362
2019/11/12
1.2K0
*args 和 **kwargs的用法
一 简介 *args 和 **kwargs 主要用于函数定义。 当我们需要定义的函数的传入参数个数不确定时,可以使用*args 和 **kwargs 代替不确定的参数个数。其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 我们可以写成*var和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。 二 使用 2.1 *args 当函数的参数个数不确定且不需要指定参数名称时,*args的格式是常规的参数 val1[,val2,val3....]
用户1278550
2018/08/09
4790
python中*args和**kwargs的区别
*args是函数使用者可以发送任意数量非键值对的参数传给这个函数,*args在接收参数后,将返回值以元组tuple的形式返回。
用户7886150
2020/12/19
4690
Python中 *args 和 **kwargs 的含义?
小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
程序员小猿
2021/01/19
7450
Python中 *args 和 **kwargs的用法
总是会在一些代码中看到*args和**kwargs,一直不知道具体怎么用,今天整理了一下:
BigYoung小站
2020/07/02
5920
python: *args & **kwargs
Python是支持 可变参数 的,实现手段之一就是使用 *args 和 **kwargs 语法。
JNingWei
2018/09/28
9810
*args和**kwargs
*args 和**kwargs常用于方法定义,*args 和**kwargs允许你传递可变数量的参数到函数里,可变数量在这里的意思是,你事先不知道有多少个参数可以传递给你的函数,所以在这种情况下,你使用这两个关键字。*args 用于传递一个non-keyword的参数list给函数,看示例
Helloted
2022/06/07
2770
什么是*args和**kwargs?
可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: positional argument follows keyword argument”。
狼啸风云
2020/05/14
1.3K0
python中的参数传递*args与**kwargs
*args与**kwargs可以将任意数目的参数传递给函数,主要用在函数定义中,最常见的是在装饰器中使用。
生信编程日常
2020/05/26
1.8K0
[C语言] #、##、__VA_ARGS__的使用
从网上借鉴了一些内容,然后整理了一下三者的区别,记录一下。 #include <iostream> // #: 用来把参数转换成字符串 #define LOG1(x) do { printf("%s=%d\n",#x,x); }while(0) // ##:用于将带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串;但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元; #define LOG2(x) log##x() // __VA_ARGS_
轻舞飞扬SR
2021/03/15
1.1K0
python *args,**kwargs参数
实际上,关键的是*和** 我们以三个例子来解释: 普通的使用参数: def test1(arg): print(arg) test1("a") 输出: a *是将剩下的参数用元祖表示 def test1(arg1,arg2,*args): print(arg1) print(arg2) print(args) test1(1,2,3,"a","b") 输出: 1 2 (3, 'a', 'b') **是将参数转换成字典进行表示 def test2(**kwargs):
西西嘛呦
2020/08/26
5060
[Go] 获取Go二进制文件的真正执行路径os.Args
os.Args是个[]string 里面存着路径和全部参数 直接拼接一下就获取到完整路径了 func GetAllExecutePath()string{ allPath:="" f
唯一Chat
2021/04/26
8420
[Go] 获取Go二进制文件的真正执行路径os.Args
python函数——形参中的:*args和**kwargs
多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现
菲宇
2019/06/13
1.1K0
Python 拓展之 *args & **kwargs
我们在前几天的文章中写的函数,它们的参数的个数都是确定的,我们知道世界是不确定的,那么函数的参数当然也有不固定的时候,那么当我们碰到这个问题的时候,该怎么解决呢?请看接下来的文章。
编程文青李狗蛋
2019/11/07
5050
点击加载更多

相似问题

const funcName = (args) => {}和const funcName = (args) => ( );?

33

char* const args[]定义

21

调用请求(const char *args)的函数

20

错误:不匹配operator<<中的std::operator<< <std::char_traits<char> >(*&std::cout),((const *)

13

错误:与‘boost::operator+系统::path::filename() const() +“/”“中的’‘不匹配

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文