激光扫描的更新生成概率地图

Previous

1.首先获取到的是laser scan 的信息,然后想得到一个更新概率地图的一个pineline

输入就是一个laserscan 输出就是个栅格概率地图

2.参考cartographer/ occupancy grid node


Learning

cartographer_ros/cartographer_ros/cartographer_ros/occupancy_grid_node_main.cc


#include "cartographer/io/image.h"

/*
 * Copyright 2017 The Cartographer Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef CARTOGRAPHER_IO_IMAGE_H_
#define CARTOGRAPHER_IO_IMAGE_H_

#include <cstdint>
#include <vector>

#include "cairo/cairo.h"
#include "cartographer/common/port.h"
#include "cartographer/io/color.h"
#include "cartographer/io/file_writer.h"
#include "cartographer/io/points_batch.h"

namespace cartographer {
namespace io {

// The only cairo image format we use for Cartographer.
constexpr cairo_format_t kCairoFormat = CAIRO_FORMAT_ARGB32;

// std::unique_ptr for Cairo surfaces. The surface is destroyed when the
// std::unique_ptr is reset or destroyed.
using UniqueCairoSurfacePtr =
    std::unique_ptr<cairo_surface_t, void (*)(cairo_surface_t*)>;

// Takes ownership.
UniqueCairoSurfacePtr MakeUniqueCairoSurfacePtr(cairo_surface_t* surface);

// std::unique_ptr for Cairo contexts.
using UniqueCairoPtr = std::unique_ptr<cairo_t, void (*)(cairo_t*)>;

// Takes ownership.
UniqueCairoPtr MakeUniqueCairoPtr(cairo_t* surface);

class Image {
 public:
  explicit Image(UniqueCairoSurfacePtr surface);
  Image(int width, int height);

  const Uint8Color GetPixel(int x, int y) const;
  void SetPixel(int x, int y, const Uint8Color& color);
  void WritePng(FileWriter* const file_writer);

  // Rotates the image in place.
  void Rotate90DegreesClockwise();

  // Returns a pointer to a cairo surface that contains the current pixel data.
  // The 'Image' object must therefore outlive the returned surface object. It
  // is undefined behavior to call any of the mutating functions while a pointer
  // to this surface is alive.
  UniqueCairoSurfacePtr GetCairoSurface();

  int width() const { return width_; }
  int height() const { return height_; }

 private:
  int width_;
  int height_;
  std::vector<uint32> pixels_;
};

}  // namespace io
}  // namespace cartographer

#endif  // CARTOGRAPHER_IO_IMAGE_H_

image.h主要是用到了一个叫做cairo的库

Surfaces: Cairo: A Vector Graphics Library - cairographics.org

看名字是一个处理矢量图的库,还得使用这个库跟cartographer的IO链接。

class Node {
 public:
  explicit Node(double resolution, double publish_period_sec);
  ~Node() {}

  Node(const Node&) = delete;
  Node& operator=(const Node&) = delete;

 private:
  void HandleSubmapList(const cartographer_ros_msgs::SubmapList::ConstPtr& msg);
  void DrawAndPublish(const ::ros::WallTimerEvent& timer_event);
  void PublishOccupancyGrid(const std::string& frame_id, const ros::Time& time,
                            const Eigen::Array2f& origin,
                            cairo_surface_t* surface);

  ::ros::NodeHandle node_handle_;
  const double resolution_;

  ::cartographer::common::Mutex mutex_;
  ::ros::ServiceClient client_ GUARDED_BY(mutex_);
  ::ros::Subscriber submap_list_subscriber_ GUARDED_BY(mutex_);
  ::ros::Publisher occupancy_grid_publisher_ GUARDED_BY(mutex_);
  std::map<SubmapId, SubmapSlice> submap_slices_ GUARDED_BY(mutex_);
  ::ros::WallTimer occupancy_grid_publisher_timer_;
  std::string last_frame_id_;
  ros::Time last_timestamp_;
};

先看下这个submap list吧

 PublishOccupancyGrid 本来想找这个函数的function body 结果没有 在GitHub 全局搜索 搜到了许多有趣的。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线激光扫描是一种通过使用多个激光束同时进行扫描的技术。这种技术可以提高扫描的速度和精度。 在多线激光扫描中,使用了多个激光束并行进行扫描。每个激光束都有自己的扫描路径和控制系统。这些激光束可以同时扫描目标物体,从而大大提高了扫描速度。同时,由于每个激光束都能够对目标物体进行独立的扫描,所以可以获得更精确的扫描数据。 多线激光扫描广泛应用于三维扫描领域。它可以用于扫描各种类型的物体,包括建筑、文物、工业产品等。通过多线激光扫描,可以快速获取目标物体的几何形状和表面细节,生成高精度的三维模型。这对于各种应用场景非常有价值,比如建筑设计、文物保护、品质检测等。 与传统的单线激光扫描相比,多线激光扫描具有许多优势。首先,多线激光扫描可以同时扫描多个表面,大大节省了扫描时间。其次,由于使用了多个激光束,所以可以获得更多的扫描数据,提高了扫描精度。此外,多线激光扫描还可以通过调整激光束之间的角度和距离,适应不同形状和尺寸的目标物体。这使得它更加灵活和适用于不同的扫描场景。 总之,多线激光扫描是一种高效、精确的三维扫描技术。它在各种应用领域具有广泛的应用前景,并且随着技术的不断进步和发展,将会有更多的创新和突破。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值