C

CはC++の祖先であり、低レベルシステムにおける共通言語(リングワフランカ)であり続けている。オペレーティングシステムのカーネル、デバイスドライバ、センサーファームウェア、多くの組み込みランタイムはCで書かれている。SLAMシステム全体をCで書くことはまずないが、Cのコードを読んだり、それとインターフェースを取ったりすることは常に発生する。

学ぶべきこと

#include <stdlib.h>

typedef struct { float x, y, z; } Point3;

Point3* cloud_alloc(size_t n) {
    return (Point3*)malloc(n * sizeof(Point3));  /* must free() later */
}

/* Callback registration, the universal sensor-SDK pattern */
typedef void (*frame_cb)(const unsigned char* data, int w, int h, void* user);
void sensor_set_callback(frame_cb cb, void* user_data);

CとC++のブリッジ

C++コンパイラは型情報を符号化するために関数名をマングルするが、Cはそうしない。extern "C"は、C++コンパイラにC言語のリンケージを使うよう指示することで、両者が互いを呼び出せるようにする。

extern "C" {
#include "vendor_camera_sdk.h"   // C header from the sensor vendor
}

// C++ wrapper: RAII around the C API's open/close pair
class Camera {
public:
    Camera()  { handle_ = vendor_cam_open(); }
    ~Camera() { vendor_cam_close(handle_); }
private:
    vendor_cam_handle* handle_;
};

このラッパーパターン——内側にCのAPI、外側にRAII——は、うまく設計されたSLAMコードベースがCインターフェースの危険性を封じ込める方法である。

SLAM作業においてCが現れる場所

よくある落とし穴

SLAMにおける意義

リアルタイムSLAMはハードウェアの近くで動作し、あなたのアルゴリズムとセンサー、OS、アクセラレータとの境界はほぼ常にCインターフェースである。Cを流暢に読める——そして手動メモリ管理を理解している——ことは、あなたをより良いC++プログラマにし、ドライバのコールバックからバンドル調整に至るまで全スタックをデバッグできるようにする。多くの学習者にとって、Cは独立した深い学習対象というより、C++学習の伴走者として扱えばよい。

関連ノート