跳转到内容

快速开始

本节将帮助您快速掌握 C++ API 的基本结构及其使用方法。

在开始开发前,请先确保已满足以下 C++ 开发环境:

  • 操作系统:Ubuntu22 及以上。
  • 编译器:GCC11 及以上。
  • C++ 语言标准:ISO C++17。

在获取并解压 AlphaBotCore SDK 软件包后,进入 C++ 目录,整个文件组织结构如下所示。

  • 文件夹c++
    • 文件夹examples # 示例程序
      • Makefile # 用于编译示例程序
    • 文件夹include # 头文件
      • 文件夹base # 基本数据类型
        • abc_actuator_types.h
        • abc_arm_types.h
        • abc_base.h
        • abc_chassis_types.h
        • abc_ee_types.h
        • abc_sensor_types.h
        • abc_torso_types.h
        • abc_version.h
      • 文件夹common # 共用数据类型
        • abc_common_types.h
        • abc_core.h
        • abc_define.h
      • 文件夹core
        • 文件夹algo
          • 文件夹control
            • admittance_control.h # 导纳控制律
          • 文件夹kinematics # 运动学算法相关接口
            • arm_kinematics.h
            • collision.h
            • kinematics.h
            • torso_kinematics.h
      • 文件夹drivers
        • 文件夹arm # 机械臂相关接口
          • arm_factory.h
          • arm_interface.h
        • 文件夹chassis # 底盘相关接口
          • chassis_factory.h
          • chassis_interface.h
        • 文件夹head # 头部相关接口
          • head_factory.h
          • head_interface.h
        • 文件夹sensors # 传感器相关接口
          • camera_data.h
          • depth_camera_interface.h
          • sensor_factory.h
          • sensor_interface.h
        • 文件夹torso # 躯干相关接口
          • torso_factory.h
          • torso_interface.h
        • 文件夹traj # 轨迹规划器相关接口
          • poly5_planner.h
          • trajectory.h
          • trajectory_planner.h
        • 文件夹sensor # 传感器同步器相关接口
          • sensor_emergency_stop_monitor.h
          • sensor_synchronizer.h
    • 文件夹lib # 共享库
      • libalphabot_algo.so
      • libalphabot_drivers_chassis.so
      • libalphabot_drivers.so
      • libalphabot_sensor.so
      • libapi_cpp.so
      • librealsense2.so

参考 examples 下的示例程序,掌握核心接口调用。

例如,c++\examples\arm\arm_factory_example.cpp 样例程序代码如下所示。

#include <iostream>
#include <unordered_map>
#include "drivers/arm/arm_factory.h"
using namespace alphabot;
int main(int argc, char *argv[])
{
// Check parameter
if (argc < 2)
{
std::cerr << "Usage: " << argv[0] << " <config_file_path>" << std::endl;
std::cerr << "Example: " << argv[0] << " config/left_arm.json" << std::endl;
return 1;
}
const std::string config_path = argv[1];
std::cout << "===== ArmFactory Example Program =====" << std::endl;
try
{
// Create a robotic arm factory instance
ArmFactory factory;
std::cout << "\n----- Method 1: Create a Robotic Arm Using Parameters -----" << std::endl;
// Configure robotic arm parameters
std::unordered_map<std::string, std::string> params = {
{"ip", "192.168.1.18"},
{"port", "8080"},
{"udp_ip", "192.168.1.102"},
{"udp_port", "8089"},
{"udp_cycle", "5"}};
// Create a robotic arm instance
auto arm1 = factory.create_arm("realman", "right_arm", params);
if (!arm1)
{
std::cerr << "Failed to create robotic arm instance" << std::endl;
return 1;
}
// Connect to the robotic arm
std::cout << "Connecting to robotic arm..." << std::endl;
if (arm1->connect() != AbcErrorCode::SUCCESS)
{
std::cerr << "Failed to connect to robotic arm" << std::endl;
return 1;
}
std::cout << "Robotic arm connected successfully" << std::endl;
std::cout << "\n----- Method 2: Create a Robotic Arm Using Configuration File -----" << std::endl;
// Create a robotic arm instance from configuration file
auto arm2 = factory.create_arm_from_config(config_path);
if (!arm2)
{
std::cerr << "Failed to create robotic arm instance from configuration file" << std::endl;
return 1;
}
// Connect to the robotic arm
std::cout << "Connecting to robotic arm..." << std::endl;
if (arm2->connect() != AbcErrorCode::SUCCESS)
{
std::cerr << "Failed to connect to robotic arm" << std::endl;
return 1;
}
std::cout << "Robotic arm connected successfully" << std::endl;
// Disconnect
arm1->disconnect();
std::cout << "Robotic arm disconnected" << std::endl;
// Disconnect
arm2->disconnect();
std::cout << "Robotic arm disconnected" << std::endl;
}
catch (const std::exception &e)
{
std::cerr << "Exception occurred: " << e.what() << std::endl;
return 1;
}
std::cout << "\n===== Example Program Ended =====" << std::endl;
return 0;
}

通过上述示例程序,您可以快速了解如何创建机械臂接口实例,并连接机械臂。其他示例程序也具有类似的结构和调用方式,请参考更多的示例程序进行学习。

为便于 C++ 程序编译,AlphaBotCore SDK 在 c++\examples 目录下提供了 Makefile 文件。该 Makefile 支持自动发现并编译新增的 .cpp 文件,无需手动修改。

接下来以 c++\examples\arm\arm_factory_example.cpp 文件为例,详细讲解编译及运行过程。

  1. 在终端中进入 Makefile 所在目录。

    Terminal window
    cd c++/examples
  2. 执行 make 命令进行编译。编译成功后,所有可执行文件将输出至 bin/ 目录。

    Terminal window
    make
  3. 编译成功后,进入可执行文件所在目录。

    Terminal window
    cd bin/arm
  4. 运行示例程序。本示例需要传入机械臂配置文件路径参数。

    Terminal window
    ./arm_factory_example ../../config/left_arm.json

其他示例程序的编译运行方式与此类似,请参考上述步骤进行操作。

通过本节学习,您已经初步掌握了 C++ 接口的结构和使用方法。建议您继续深入学习其他示例程序,并结合接口文档进行开发实践,以更好地理解和应用 C++ 接口。