从自动驾驶技术出发,Apollo开发者社区带你一起探索自动驾驶开发的奥秘,给每一位对自动驾驶充满热爱的你带来最实质的帮助,助力你的每一次研发。本文将介绍CyberRT中的PythonAPI教程,主要从以下几点为大家进行详细讲解:
背景CyberRTPython接口CyberRT中的Python接口概述示例
CyberRT的核心功能是用C++开发的。还提供了更多的Python接口来帮助开发人员为特定项目构建自己的实用程序。
CyberRT的Python接口封装了相应的C++接口。该实现不依赖于其他第三方工具,例如Swig,这使得它更易于维护。
到目前为止,Python接口涵盖:
获取通道信息
服务器、客户端通信
查询记录文件中的信息
从记录文件中读取和写入消息
时间、持续时间、速率相关操作
计时器
通道的读写
步骤如下:
首先创建一个Node;
创建相应的读取器或写入器;
如果写入通道,请在Writer中使用Write接口;
如果从通道读取,则使用节点中的spin接口,并在回调函数中处理消息。
界面如下所示:
classNode:"""ClassforcyberNodewrapper."""defcreate_writer(self,name,data_type,qos_depth=1):"""createatopicwriterforsendmessagetotopic.
paramselfparamnamestr:topicnameparamdata_typeproto:messageclassforserialization"""defcreate_reader(self,name,data_type,callback,args=None):"""createatopicreaderforreceivemessagefromtopic.paramselfparamnamestr:topicnameparamdata_typeproto:messageclassforserializationcallbackfn:functiontocall(fn(data))whendataisreceived.Ifargsisset,thefunctionmustaccepttheargsasasecondargument,i.e.fn(data,args)argsany:additionalargumentstopasstothecallback"""defcreate_client(self,name,request_data_type,response_data_type):""""""defcreate_service(self,name,req_data_type,res_data_type,callback,args=None):defspin(self):"""spininwaitandprocessmessage.paramself"""classWriter(object):"""Classforcyberwriterwrapper."""defwrite(self,data):"""writermsgstring"""记录接口
读取记录:
创建一个记录阅读器;
从记录中读取消息;
写入记录:
创建记录写入器
写消息记录;
界面如下所示:
classRecordReader(object):"""ClassforcyberRecordReaderwrapper."""defread_messages(self,start_time=0,end_time=):"""readmessagefrombagfile.
paramselfparamstart_time:paramend_time:return:generatorof(message,data_type,timestamp)"""defget_messagenumber(self,channel_name):"""returnmessagecount."""defget_messagetype(self,channel_name):"""returnmessagetype."""defget_protodesc(self,channel_name):"""returnmessageprotodesc."""defget_headerstring(self):"""returnmessageheaderstring."""defreset(self):"""returnreset.""return_CYBER_RECORD.PyRecordReader_Reset(self.record_reader)defget_channellist(self):"""returnchannellist."""return_CYBER_RECORD.PyRecordReader_GetChannelList(self.record_reader)classRecordWriter(object):"""ClassforcyberRecordWriterwrapper."""defopen(self,path):"""openrecordfileforwrite."""defwrite_channel(self,channel_name,type_name,proto_desc):"""writerchannelbychannelname,typename,protodesc"""defwrite_message(self,channel_name,data,time,raw=True):"""writermsg:channelname,data,time,isdataraw"""defset_size_fileseg(self,size_kilobytes):"""returnfilesegmentsize."""defset_intervaltime_fileseg(self,time_sec):"""returnfileintervaltime."""defget_messagenumber(self,channel_name):"""returnmessagecount."""defget_messagetype(self,channel_name):"""returnmessagetype."""defget_protodesc(self,channel_name):"""returnmessageprotodesc."""时间接口
classTime(object):
staticmethoddefnow():time_now=Time(_CYBER_TIME.PyTime_now())returntime_nowstaticmethoddefmono_time():mono_time=Time(_CYBER_TIME.PyTime_mono_time())returnmono_timedefto_sec(self):return_CYBER_TIME.PyTime_to_sec(self.time)defto_nsec(self):return_CYBER_TIME.PyTime_to_nsec(self.time)defsleep_until(self,nanoseconds):return_CYBER_TIME.PyTime_sleep_until(self.time,nanoseconds)定时器接口
classTimer(object):defset_option(self,period,callback,oneshot=0):"""settheoptionoftimer.
paramperiodTheperiodofthetimer,unitisms.paramcallbackThetasksthatthetimerneedstoperform.paramoneshot1:performthecallbackonlyafterthefirsttimingcycle0:performthecallbackeverytimedperiod"""defstart(self):defstop(self):从通道读取(在cyber/python/examples/listener.py中)
importsyssys.path.append("../")fromcyber_pyimportcyberfrommodules.