gnss-sdr 코드 판독(5)

7125 단어 VC++GNSS
gnss-sdr 코드 판독(5)
작자 위챗 공중번호: 소위성
 
운영 체제: Windows 10
 
이 편은 전편에 이어졌지만 필연적인 연락은 없었다. 전편의 주소:
https://blog.csdn.net/eaglesoars/article/details/81074063
1、Gnss_Synchro
오늘 Gnss를 보면...Synchro 클래스는 신호 처리 모듈에 필요한 정보를 포함합니다.
이 클래스는 gnss-sdr/src/core/systemparameters/gnss_synchro.h에서 정의된 내용:
class Gnss_Synchro
{
public:
    // Satellite and signal info
    char System;       //!< Set by Channel::set_signal(Gnss_Signal gnss_signal)
    char Signal[3];    //!< Set by Channel::set_signal(Gnss_Signal gnss_signal)
    unsigned int PRN;  //!< Set by Channel::set_signal(Gnss_Signal gnss_signal)
    int Channel_ID;    //!< Set by Channel constructor
    // Acquisition
    double Acq_delay_samples;                   //!< Set by Acquisition processing block
    double Acq_doppler_hz;                      //!< Set by Acquisition processing block
    unsigned long int Acq_samplestamp_samples;  //!< Set by Acquisition processing block
    bool Flag_valid_acquisition;                //!< Set by Acquisition processing block
    //Tracking
    long int fs;                                //!< Set by Tracking processing block
    double Prompt_I;                            //!< Set by Tracking processing block
    double Prompt_Q;                            //!< Set by Tracking processing block
    double CN0_dB_hz;                           //!< Set by Tracking processing block
    double Carrier_Doppler_hz;                  //!< Set by Tracking processing block
    double Carrier_phase_rads;                  //!< Set by Tracking processing block
    double Code_phase_samples;                  //!< Set by Tracking processing block
    unsigned long int Tracking_sample_counter;  //!< Set by Tracking processing block

이 매개 변수들은 모두 각자의 신호 처리 모듈에 값을 부여한다.
그러나 이 클래스에서 가장 중요한 것은 하나의 함수를 실현하는 것이다.
    template 
    void serialize(Archive& ar, const unsigned int version)
    {
        if (version)
            {
            };
        // Satellite and signal info
        ar& System;
        ar& Signal;
        ar& PRN;
        ar& Channel_ID;
        ar& Acq_delay_samples;
        ar& Acq_doppler_hz;
        ar& Acq_samplestamp_samples;
        ar& Flag_valid_acquisition;
        //Tracking
        ar& fs;
        ar& Prompt_I;
        ar& Prompt_Q;
        ar& CN0_dB_hz;
        ar& Carrier_Doppler_hz;
        ar& Carrier_phase_rads;
        ar& Code_phase_samples;
        ar& Tracking_sample_counter;
        ar& Flag_valid_symbol_output;
        ar& correlation_length_ms;
        //Telemetry Decoder
        ar& Flag_valid_word;
        ar& TOW_at_current_symbol_ms;
        // Observables
        ar& Pseudorange_m;
        ar& RX_time;
        ar& Flag_valid_pseudorange;
        ar& interp_TOW_ms;
    }
};

동지들, 이 매개 변수들은 모두 위의 그 모듈에 첨부해야 하는 매개 변수라는 것을 발견했습니까?여기에 그것을 적어 두면 사실은 서열화이다.
서열화는 하나의 클래스의 대상을 파일에 저장하거나 네트워크를 통해 보내기 위해 2진 바이트 흐름이나 다른 형식의 표시 등으로 만들 수 있다.
어떻게 보내나요, gnss-sdr/src/core/monitor/gnsssynchro_udp_sink.cc중
bool Gnss_Synchro_Udp_Sink::write_gnss_synchro(std::vector stocks)
{
    std::ostringstream archive_stream;
    boost::archive::binary_oarchive oa{archive_stream};
    oa << stocks;
    std::string outbound_data = archive_stream.str();

    for (auto endpoint : endpoints)
        {
            socket.open(endpoint.protocol(), error);
            socket.connect(endpoint, error);

            try
                {
                    socket.send(boost::asio::buffer(outbound_data));
                }
            catch (boost::system::system_error const& e)
                {
                    return false;
                }
        }
    return true;
}

그중의
std::ostringstream archive_stream;
boost::archive::binary_oarchive oa{archive_stream};
oa << stocks;
std::string outbound_data = archive_stream.str();
socket.send(boost::asio::buffer(outbound_data));

모두 표준적인 수단으로 stocks류를 하나의 ostringstream 흐름에 서열화하는 것이다.
그렇다면 이 흐름에서 데이터를 어떻게 복구할 것인가에 대해 표준 방법을 제시한다.
std::vector stocks2;
std::istringstream is(content);
boost::archive::binary_iarchive ia(is);
ia >> stocks2;//           string      ,         。

2、Gnss_Synchro_Udp_Sink
 
이런 종류의 목적은 바로 Gnss를Synchro 레코드의 매개변수는 UDP 방식으로 전송됩니다.
gnss-sdr/src/core/monitor/gnss_synchro_udp_sink.h
3、gnss_synchro_monitor
모니터 디렉터리에 클래스가 하나 더 있습니다.gnsssynchro_모니터, 우선,gr:::sync 에서 계승block의 종류, 혈통이 순수하고 뿌리가 붉다.
class gnss_synchro_monitor : public gr::sync_block

gr::sync_block은gr::block에서 계승되어 1:1로 선택할 수 있는history를 실현했습니다.입력과 출력의 속도를 알았으니 어떤 간소화는 가능하다.실현자의 관점에서 보면general 이 아닌work() 방법을 정의했다work().
work () ninput 생략items 매개 변수, consume 증가each ()가 호출됩니다.
gnss_synchro_monitor::gnss_synchro_monitor(unsigned int n_channels,
    int output_rate_ms,
    int udp_port,
    std::vector<:string> udp_addresses) : gr::sync_block("gnss_synchro_monitor",
                                                  gr::io_signature::make(n_channels, n_channels, sizeof(Gnss_Synchro)),
                                                  gr::io_signature::make(0, 0, 0))
{
    d_output_rate_ms = output_rate_ms;
    d_nchannels = n_channels;

    udp_sink_ptr = std::unique_ptr(new Gnss_Synchro_Udp_Sink(udp_addresses, udp_port));
}

이 클래스는 먼저 동기화 모듈을 만들었는데'gnss synchro monitor'라고 합니다. 이 안에 있는 파라미터는udp 라는 것을 기억하세요.port, 그리고 아까 말씀드렸던 Gnss 를 호출했습니다.Synchro_Udp_Sink.
int gnss_synchro_monitor::work(int noutput_items, gr_vector_const_void_star& input_items,
    gr_vector_void_star& output_items __attribute__((unused)))
{
    const Gnss_Synchro** in = reinterpret_cast(&input_items[0]);  // Get the input buffer pointer
    for (int epoch = 0; epoch < noutput_items; epoch++)
        {
            // ############ 1. READ PSEUDORANGES ####
            for (unsigned int i = 0; i < d_nchannels; i++)
                {
                    //if (in[i][epoch].Flag_valid_pseudorange)
                    //    {
                    //    }
                    //todo: send the gnss_synchro objects

                    std::vector stocks;
                    stocks.push_back(in[i][epoch]);
                    udp_sink_ptr->write_gnss_synchro(stocks);
                }
        }
    return noutput_items;
}

이 모듈에는work 방법이 있는데, 주로noutputitems 개 GnssSynchro는 모두 서열화를 통해 발송되며, 그중 각noutputitems에는 d 도 포함되어 있습니다nchannels 채널.
 
이 몇 가지 관계를 보면
(1)gnss_synchro_모니터는 신호 처리 모듈로 공사 전체이다.
(2)Gnss_Synchro는 정보 수집을 담당합니다.
(3)Gnss_Synchro_Udp_Sink는 정보를 서열화하여 보냈다.
 
https://www.cnblogs.com/moon1992/p/5424677.html

좋은 웹페이지 즐겨찾기