Welcome to Slamware C++ SDK

本SDK适用于SLAMWARE 模块化机器人自主定位导航系统以及SLAMTEC Mapper建图雷达。

Get Started

下载和安装SDK

请在思岚科技官方网站上的支持与下载页面 下载适合您的平台的SDK并解压至本地。

目录结构

Slamware SDK包含了大量您开发过程中可能会用到的资源、代码、和项目文件,其目录结构组织如下:

目录 说明
bin 预编译的工具
dll 动态链接库文件
docs 参考文档
include SDK相关的头文件
lib 预编译的库文件
samples 样例程序
workspaces 项目文件

头文件结构

在include目录下,我们包含了Slamware SDK以及它所依赖的所有库的头文件:

目录 说明
boost Boost 1.53.0
Eigen Eigen矩阵库
json JsonCpp库的头文件
rpos Slamware SDK相关的头文件

SDK支持的平台/环境

SLAMWARE SDK理论上可以支持任意的采用现代操作系统的硬件环境。不过我们一般只针对几种目前广泛使用的平台提供对应的SDK。如果没有满足您需求的SDK,可以尝试联系SLAMTEC支持。

开发环境搭建 : Linux (GCC/GNU Make)

注意: 若基于 Android/iOS, 您可以下载对应的SDK并参考其中的文档。

注意: 如果您仅需要在ROS(Robot Operating System)下使用SLAMWARE,可以直接下载SLAMWARE ROS SDK并参考相关的文档

先决条件

SLAMWARE 采用 GCC 和 Make 编译系统来编译自身得Demo以及所有链接至其本身得应用程序。

我们推荐您采用Ubuntu发行版进行开发工作,其他Linux发行版在正确配置后也可以使用。

对于Ubuntu系统,可以简单的用apt命令来配置必要的编译环境。

sudo apt install build-essential

如您打算进行交叉编译,请确保交叉编译工具链已经正确的安装了。

比如,当需要安装arm gcc 4.8用于交叉编译产生能在硬浮点(hardfloat)支持的ARMv7平台上工作得程序,可以在Ubuntu系统里采用如下命令安装:

sudo apt install g++-4.8-arm-linux-gnueabihf

选择正确的SLAMWARE SDK版本

SLAMWARE SDK 存在多个版本,每个版本是采用不同的GCC(glibc)版本进行编译的,并且针对的硬件平台各不相同。

可以通过SLAMWARE SDK压缩包的名字来了解其所采用的GCC版本和所适用得平台情况:

比如如下的名称: slamware_sdk_linux-armv7hf-gcc4.8-2.6.6_rtm.20190422.tar.bz2:

  • linux : 表示该SDK是基于Linux平台的
  • armv7hf : 该SDK用于产生在硬浮点(hardfloat)支持的ARMv7平台得应用程序
  • gcc4.8 : 需要使用gcc 4.8

请确保使用正确得SLAMWARE SDK编译您的程序。否则,编译过程会失败,或者编译出来的可执行程序无法在您期待的硬件平台中正常工作。

相对而言,获取用于编译您用用程序并链接至SLAMWARE SDK得GCC版本是最重要的。

当采用本机编译时

当开发机得硬件平台和系统和目标平台相同时,则采用了本机编译。GCC版本可采用如下命令得到:

$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4
...

本例中, GCC 版本是 4.8

采用交叉编译得情况

很多时候需要使用交叉编译来进行程序开发。此时目标系统得硬件环境和开发机不同。此时就需要获得交叉编译gcc程序的版本:

$ arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.8.4-2ubuntu1~14.04.1) 4.8.4
...

基本设置

当所有先决条件满足后,可以简单的对SLAMWARE SDK压缩包解包,解包位置基本可按个人兴趣选择。

但请确保解包的目标路径中不要带有空格或者其他特殊字符,否则可能会出现一切莫名其妙的问题。

比如,你可以将SDK解压缩到您的home目录下:

mkdir -p ~/slamware
tar xf slamware_sdk_linux-x86_64-gcc4.8-2.6.7_rtm.20190929.tar.bz2 -C ~/slamware/

上述shell命令将在用户home目录下创建名叫slamware的子目录。随后,SLAMWARE SDK压缩包的数据会加压缩到这个目录下边。

在上述例子里,SDK最后被加压缩到了如下的路径:~/slamware/slamware_sdk_linux-x86_64-gcc4.8/

编译自带的例子程序

SDK包中带有了需要例子程序,他们可以帮助您快速了解SDK的使用。其位于SDK目录的samples子目录

样例名 描述
map2bmp 演示了如何获取SLAMWARE构建的地图并保存成BMP图像文件
mapdemo 展示了如何获取SLAMWARE构建的地图,随后将原始数据以及其他信息打印出来
moveandpathdemo 展示了如何往SLAMWARE注入一系列关键点,随后让机器人进行自主导航

可以直接在samples目录下输入make命令来编译这些例子:

cd ~/slamware/slamware_sdk_linux-x86_64-gcc4.8/samples
make

若一切顺利,你可在SDK目录下的linux-x86_64-release/output子目录中找到编译好的可执行文件。

$ cd ~/slamware/slamware_sdk_linux-x86_64-gcc4.8/linux-x86_64-release/output
$ ls
map2bmp  mapdemo  moveandpathdemo

编译您自己的应用程序

这里我们展示如果空手从零开始构建一个基于SLAMWARE SDK的应用程序。

创建程序项目的目录框架

假设在~/slamware目录下创建一个名为 hello_slamware 新程序工程目录。

cd ~/slamware
mkdir -p hello_slamware/src

上述命令即可完成关键的目录结构的创建。

下一步我们创建主要的代码文件: main.cpp

cd ~/slamware/hello_slamware/src
nano main.cpp

将下面的代码输入到这个文件里。按下[Ctrl+X]组合键进行保存并退出编辑器。您当然可以采用其他顺手的编辑器来做这事情。

#include <rpos/robot_platforms/slamware_core_platform.h>
#include <iostream>
using namespace std;
using namespace rpos::robot_platforms;
int main(int argc, char * argv[])
{
    SlamwareCorePlatform platform = SlamwareCorePlatform::connect("192.168.11.1", 1445);
    cout << "Base version: " << platform.getSDPVersion() << endl;
    return 0
}
设置编译脚本

SLAMWARE SDK自带的makefile脚本可以帮助您简化开发过程中的编译工作。

本例中,我们演示如何直接用实例程序的[Makefile]脚本来快速上手。

将Makefile 从实例程序代码目录中复制出来:

cd ~/slamware/hello_slamware
cp ~/slamware/slamware_sdk_linux-x86_64-gcc4.8/samples/map2bmp/Makefile .

由于这里创建的程序工程位于和示例程序不同的目录,所以需要对Makefile做一点修改:

nano Makefile

采用编辑器打开Makefile,随后找到开头是HOME_TREE :=的那行,改成如下这样:

HOME_TREE := ../slamware_sdk_linux-x86_64-gcc4.8

HOME_TREE := 用于指示编译系统SLAMWARE SDK位于什么地方.

修改后,用CTRL+X保存文件然后退出编辑器。

接着直接用 make 命令就能编译了。

make

编译好的可执行文件位于这个目录: ~/slamware/slamware_sdk_linux-x86_64-gcc4.8/linux-x86_64-release/output

注意: 这是在SLAMWARE SDK目录中的

有用的编译选项

如果您想编译debug版本,可以用如下命令:

make DEBUG=1

debug版本的程序位于如下的路径: ~/slamware/slamware_sdk_linux-x86_64-gcc4.8/linux-x86_64-debug/output

如果想观察详细的编译命令行,可以用 V=1 参数:

make V=1

进行交叉编译或者用不同的版本的GCC

交叉编译可以简单的通过修改SLAMWARE SDK的编译脚本实现.

假设我们想用如下版本的GCC进行 ARM-linux作为目标平台的交叉编译:

  • arm-linux-gnueabihf-gcc-4.8
  • arm-linux-gnueabihf-g++-4.8

首先,请先确保下载了支持ARMv7hf平台的SLAMWARE SDK,并且是基于4.8版本GCC的。

进入SLAMWARE SDK的目录,随后打开编辑器编辑文件 mak_def.inc。找到如下的2行:

CC = gcc
CXX = g++

把它们修改为:

CC = arm-linux-gnueabihf-gcc-4.8
CXX = arm-linux-gnueabihf-g++-4.8

您也可以虽自己需要修改一些其他的配置.

开发环境搭建 - Windows (MSVC)

开发环境要求 基于Windows操作系统对Slamware SDK进行应用开发,您的开发环境需满足如下条件: 您的计算机应当安装Visual Studio 2010 SP1(由于我们提供的预编译库采用Visual Studio 2010 SP1进行编译,因此不建议使用Visual Studio 2012或者2013进行开发)

打开Visual Studio 2010并新建项目.

创建工程

  1. 选择Visual C++项目,并选择Win32 Console Application(Win32控制台应用程序)项目类型
  2. 在Name(名称)中输入项目名称
  3. 点击OK(确定)

设定应用程序选项

创建工程

点击Next(下一步)

创建工程

  1. Application Type(应用程序类型)选择Console Application(命令行应用程序)
  2. Additional options(附加选项)勾选Empty Project(空项目)
  3. 点击Finish完成项目创建

配置编译选项

打开项目属性面板

在Solution Explorer(解决方案)中右键单击您刚刚创建的项目,并单击Properties(属性)菜单,打开属性面板:

配置VC++目录

在左侧列表中,选择VC++ Directories(VC++目录)

  1. 选中右侧的Include Directories(包含目录),并点击下拉按钮
  2. 选择(<编辑…>)
  3. 将第一章节中提到的SDK中的include目录加入到列表中

  1. 选中右侧的Library Directories(库目录),并点击下拉按钮
  2. 选择(<编辑…>)
  3. 将第一种中提到的SDK中的lib目录加入到列表中

完成后,您的项目属性页应当与下图相似:

点击OK(确定)完成配置。

Hello World

创建源文件

在Solution Explorer中您的项目下的Source Files目录上,右键单机,并在菜单中选择Add(添加)->New Item(新项目)

选择C++ File (.cpp),并将文件命名成main.cpp

添加代码

在弹出的编辑器中输入如下代码:

#include <rpos/robot_platforms/slamware_core_platform.h>
#include <iostream>
using namespace std;
using namespace rpos::robot_platforms;
int main(int argc, char * argv[])
{
    SlamwareCorePlatform platform = SlamwareCorePlatform::connect("192.168.11.1", 1445);
    cout << "Base version: " << platform.getSDPVersion() << endl;
    return 0
}
编译运行

在Visual Studio的主菜单中,单击Debug(调试)->Start Debugging(开始调试)即可编译运行您的程序。

API 概览

对象 说明 支持Slamware 支持Mapper
rpos::core::Location 位置
rpos::core::Rotation 旋转姿态
rpos::core::Pose 姿态
rpos::core::Quaternion 四元数
rpos::core::Imu 姿态
rpos::core::ImuBitMap枚举 姿态数据可用标志位
rpos::core::Action 动作
rpos::core::ActionStatus枚举 动作执行状态
rpos::core::Feature 特征类
rpos::core::RectangleF 矩形(float型)
rpos::core::ORectangleF 带方向的矩形(float型)
rpos::core::Vector2f 二维向量(float型)
rpos::core::Vector2i 二维向量(int型)
rpos::core::LaserPoint 激光雷达扫描点
rpos::core::Metadata 元数据
rpos::core::RobotPlatform 机器人平台基类 √ (部分)
rpos::actions::MoveAction 移动动作
rpos::actions::VelocityControlMoveAction 移动动作
rpos::feature::motion_planner::MoveOptionFlag枚举 机器人的移动方式
rpos::feature::motion_planner::MoveOptions结构体 机器人的移动特征
rpos::features::ArtifactProvider 器物功能特征,包括了虚拟墙功能。
rpos::features::artifact_provider::RectangleArea 有特定用途的矩形区域
rpos::features::LocationProvider 定位功能特征。
rpos::features::location_provider::Map 地图基类。
rpos::features::location_provider::MapType枚举 MapType枚举表示地图的类型。
rpos::features::location_provider::BitmapMap 位图地图。
rpos::features::location_provider::BitmapMapPixelFormat枚举 BitmapMapPixelFormat枚举表示位图地图的像素格式。
rpos::features::MotionPlanner 路径规划功能特征。
rpos::features::motion_planner::Path 代表一条路径。
rpos::features::SystemResource 系统资源功能特征类。
rpos::features::system_resource::LaserScan 代表一次激光扫描数据。
rpos::features::system_resource::DeviceInfo 设备信息。
rpos::features::system_resource::BaseError结构体 底盘错误码。
rpos::features::system_resource::BaseHealthInfo结构体 底盘健康状态信息。
rpos::features::system_resource::PowerStatus结构体 电源状态信息。
rpos::robot_platforms::SlamwareCorePlatform Slamware CORE对象