一、简介
如果想要给机器人发送可执行的脚本文件,primary端口是一个好的选择。具体的接口使用方法可以查看 CS机器人 C++ SDK 接口手册 章节,这里提供一个简单的使用案例
二、操作流程
1、跟随快速使用手册安装elite c++ sdk,确保sdk安装正确。
2、整体编译C++ sdk仓。
3、进入build/example文件夹下,执行编译好的可执行文件primary_example,传递ip、port等参数,可以观察到机器人会上下电、示教器会出现弹窗等现象。
三、常见问题
1、只能通过控制台执行这个文件吗?能否通过ide直接执行?
A:这里使用了argparse解析参数,所以只需要将这里参数解析部分删除,直接指定ip, port即可
四、代码和附件
这段代码首先通过调用
connect(robot_ip, 30001) 连接 Primary Port,然后调用registerRobotExceptionCallback(callback) 注册了一个异常回调,专门抓 SCRIPT_RUNTIME 类型的运行时错误,把异常消息打出来。接着调用getPackage(kin, 200) 获取运动学配置,把 DH 参数 a / d / alpha 全打出来,然后调用sendScript(script)发一段正常脚本 def hello(): textmsg("hello world") → 示教器弹 “hello world”。接下来故意发一段语法错误的 def exFunc(): 1abcd ——就是为了触发第 3 步那个回调,验证异常捕获链路是通的。最后调用disconnect() 结束。// SPDX-License-Identifier: MIT
// Copyright (c) 2025, Elite Robots.
#include <Elite/Log.hpp>
#include <Elite/PrimaryPortInterface.hpp>
#include <Elite/RobotConfPackage.hpp>
#include <Elite/RobotException.hpp>
#include <boost/program_options.hpp>
#include <chrono>
#include <iostream>
#include <memory>
#include <string>
#include <thread>
using namespace std::chrono;
namespace po = boost::program_options;
// When the robot encounters an exception, this callback will be called
void robotExceptionCb(ELITE::RobotExceptionSharedPtr ex) {
if (ex->getType() == ELITE::RobotException::Type::SCRIPT_RUNTIME) {
auto r_ex = std::static_pointer_cast<ELITE::RobotRuntimeException>(ex);
ELITE_LOG_INFO("Robot throw exception: %s", r_ex->getMessage().c_str());
}
}
int main(int argc, const char** argv) {
// Parse the ip arguments if given
std::string robot_ip;
// Parser param
po::options_description desc(
"Usage:\n"
"\t./primary_example <--robot-ip=ip>\n"
"Parameters:");
desc.add_options()
("help,h", "Print help message")
("robot-ip", po::value<std::string>(&robot_ip)->required(),
"\tRequired. IP address of the robot.");
po::variables_map vm;
try {
po::store(po::parse_command_line(argc, argv, desc), vm);
if (vm.count("help")) {
std::cout << desc << std::endl;
return 0;
}
po::notify(vm);
} catch (const po::error& e) {
std::cerr << "Argument error: " << e.what() << "\n\n";
std::cerr << desc << "\n";
return 1;
}
auto primary = std::make_unique<ELITE::PrimaryPortInterface>();
auto kin = std::make_shared<ELITE::KinematicsInfo>();
primary->connect(robot_ip, 30001);
primary->registerRobotExceptionCallback(robotExceptionCb);
primary->getPackage(kin, 200);
std::string dh_param = "\n\tDH parameter a: ";
for (auto i : kin->dh_a_) {
dh_param += std::to_string(i);
dh_param += '\t';
}
dh_param += '\n';
dh_param += "\n\tDH parameter d: ";
for (auto i : kin->dh_d_) {
dh_param += std::to_string(i);
dh_param += '\t';
}
dh_param += '\n';
dh_param += "\n\tDH parameter alpha: ";
for (auto i : kin->dh_alpha_) {
dh_param += std::to_string(i);
dh_param += '\t';
}
dh_param += '\n';
ELITE_LOG_INFO("%s", dh_param.c_str());
std::string script = "def hello():\n\ttextmsg(\"hello world\")\nend\n";
primary->sendScript(script);
script = "def exFunc():\n\t1abcd\nend\n";
primary->sendScript(script);
// Wait robot exception
std::this_thread::sleep_for(1s);
primary->disconnect();
return 0;
}