范例
int main(int argc, char *argv[]) {
// init cyber framework
apollo::cyber::Init(argv[0]);
// create talker node
auto talker_node = apollo::cyber::CreateNode("talker");
// create talker
auto talker = talker_node->CreateWriter<Chatter>("channel/chatter");
Rate rate(1.0);
while (apollo::cyber::OK()) {
static uint64_t seq = 0;
auto msg = std::make_shared<Chatter>();
msg->set_timestamp(Time::Now().ToNanosecond());
msg->set_lidar_timestamp(Time::Now().ToNanosecond());
msg->set_seq(seq++);
msg->set_content("Hello, apollo!");
talker->Write(msg);
AINFO << "talker sent a message!";
rate.Sleep();
}
return 0;
}
apollo::cyber::Init(argv[0]);
bool Init(const char* binary_name) {
std::lock_guard<std::mutex> lg(g_mutex);
if (GetState() != STATE_UNINITIALIZED) {
return false;
}
InitLogger(binary_name);
std::signal(SIGINT, OnShutdown);
// Register exit handlers
if (!g_atexit_registered) {
if (std::atexit(ExitHandle) != 0) {
AERROR << "Register exit handle failed";
return false;
}
AINFO << "Register exit handle succ.";
g_atexit_registered = true;
}
SetState(STATE_INITIALIZED);
return true;
}
创建一个节点Node
- auto talker_node = apollo::cyber::CreateNode(“talker”);
std::unique_ptr<Node> CreateNode(const std::string& node_name,
const std::string& name_space) {
bool is_reality_mode = GlobalData::Instance()->IsRealityMode();
if (is_reality_mode && !OK()) {
// add some hint log
AERROR << "please initialize cyber firstly.";
return nullptr;
}
std::unique_ptr<Node> node(new Node(node_name, name_space));
return std::move(node);
}
class Node
Node::Node(const std::string& node_name, const std::string& name_space)
: node_name_(node_name), name_space_(name_space) {
node_channel_impl_.reset(new NodeChannelImpl(node_name));
node_service_impl_.reset(new NodeServiceImpl(node_name));
}
class NodeChannellmpl
explicit NodeChannelImpl(const std::string& node_name)
: is_reality_mode_(true), node_name_(node_name) {
node_attr_.set_host_name(common::GlobalData::Instance()->HostName());
node_attr_.set_host_ip(common::GlobalData::Instance()->HostIp());
node_attr_.set_process_id(common::GlobalData::Instance()->ProcessId());
node_attr_.set_node_name(node_name);
uint64_t node_id = common::GlobalData::RegisterNode(node_name);
node_attr_.set_node_id(node_id);
is_reality_mode_ = common::GlobalData::Instance()->IsRealityMode();
if (is_reality_mode_) {
node_manager_ =
service_discovery::TopologyManager::Instance()->node_manager();
node_manager_->Join(node_attr_, RoleType::ROLE_NODE);
}
}
virtual ~NodeChannelImpl() {
if (is_reality_mode_) {
node_manager_->Leave(node_attr_, RoleType::ROLE_NODE);
node_manager_ = nullptr;
}
}
class NodeServiceImpl
explicit NodeServiceImpl(const std::string& node_name)
: node_name_(node_name) {
attr_.set_host_name(common::GlobalData::Instance()->HostName());
attr_.set_process_id(common::GlobalData::Instance()->ProcessId());
attr_.set_node_name(node_name);
auto node_id = common::GlobalData::RegisterNode(node_name);
attr_.set_node_id(node_id);
}