2017-09-13 34 views
0

我正在運行的Ubuntu 16.04和使用ROS kinetic(無關的這個問題)。與這個項目無關,我打破了我的系統,並決定重新安裝Ubuntu。一切都很順利,我認爲我已經把我的系統重新組合在一起。所以現在我有這個代碼發送一個數據包到LiDAR並解碼我回來的信息。你可以看到我把幾個cout的調試。程序在發送數據包並等待數據返回後凍結。這段代碼現在可以正常工作幾個月,並且在重新安裝Ubuntu之後並沒有改變。提升插座。在格式化/重新安裝Ubuntu之後,工作代碼不再工作。權限問題?

事情我已經嘗試

sudo adduser my_username dialout 
sudo adduser my_username root 
sudo adduser my_username sudo 

我還編輯/etc/sudoers.d加我用戶名在那裏的所有權限。

我懷疑掛斷是由於權限的原因是因爲我有另一段代碼使用UART通信/ dev/ttyUSB1,我必須使用sudo chmod a+rw /dev/ttyUSB1才能工作。這以前沒有必要。

相關代碼如下,但我強烈懷疑這不是問題。代碼編譯並按預期運行,除了掛機。我會很感激任何反饋和建議,我會盡我所能繼續回覆。

#include <iostream> 
#include <boost/array.hpp> 
#include <boost/asio.hpp> 
#include <sensor_msgs/LaserScan.h> 

using boost::asio::ip::udp; 


class KeyenceLaser 
{ 
    public: 
     KeyenceLaser(boost::asio::io_service& io_service, const std::string& host, const std::string& port):io_service_(io_service), socket_(io_service, udp::endpoint(udp::v4(), 0)) 
     { 
      udp::resolver resolver(io_service_); 
      udp::resolver::query query(udp::v4(), host, port); 
      udp::resolver::iterator iter = resolver.resolve(query); 
      endpoint_ = *iter; 

      if (socket_.is_open()){std::cout<<"socket open"<<std::endl;;}else{std::cout<<"socket not open"<<std::endl;} 
     } 

     ~KeyenceLaser() 
     { 
      socket_.close(); 
     } 

     void send(const std::string& msg) 
     { 
      socket_.send_to(boost::asio::buffer(msg, msg.size()), endpoint_); 
     } 
     void poll(sensor_msgs::LaserScan::Ptr scan) 
     { 
      char request[1920]; 
          char srequest[]={0x90,0,1,0,0,0,0,0,0,0};// sends the request to get all beam data back 
      size_t request_length = strlen(srequest); 
      unsigned char reply[1920]; 
      scan->ranges.resize(953); 

      try 
      { 
std::cout<<"1 sending request"<<std::endl; 
       boost::system::error_code errcode; 
       boost::asio::socket_base::message_flags flags=NULL; 
       int bytesSent =-1; 
       bytesSent= socket_.send_to(boost::asio::buffer(srequest, 10), endpoint_); 
std::cout<<"sent " << bytesSent << " bytes\n2 waiting for data back"<<std::endl; 
       size_t reply_length = socket_.receive_from(boost::asio::buffer(reply, 1920), endpoint_); 
std::cout<<"3 got data back"<<std::endl; 

       scan->angle_min = -.090757; 
       scan->angle_max = 3.23234; 
       scan->angle_increment = 3.323106/953.0; 
       scan->range_min = 0.00; 
       scan->range_max = 5.0; 
       scan->ranges.reserve(953); 
       scan->ranges.resize(953); 
       scan->ranges.clear(); 

       for (int i=14;i < 1921; i++) 
        { 
        //std::cout << i/2-7<<":"<<(((reply[i+1]<<8) + reply[i])/1000.0) << std::endl; 
        scan->ranges.push_back(((reply[i+1]<<8) + reply[i])/1000.0); 

         i++; 
        } 

      } 
      catch (std::exception& e) 
      { 
       std::cout << "Exception: " << e.what() << "\n"; 
      } 
     } 

    private: 
     boost::asio::io_service& io_service_; 
     udp::socket socket_; 
     udp::endpoint endpoint_; 
}; 

編輯1:

我已經修改了代碼如下...

std::cout<<"1 sending request"<<std::endl; 
        boost::system::error_code errcode; 
        boost::asio::socket_base::message_flags flags; 
        int bytesSent =-1; 
        bytesSent= socket_.send_to(boost::asio::buffer(srequest, 10), endpoint_ ,flags, errcode); 
std::cout<<"sent " << bytesSent << " bytes\ngot error code: " << errcode << "\n2 waiting for data back"<<std::endl; 
        size_t reply_length = socket_.receive_from(boost::asio::buffer(reply, 1920), endpoint_); 
std::cout<<"3 got data back"<<std::endl; 

,我得到錯誤95 - 不支持的操作,但我認爲是原因我沒有實例我的國旗正確(和谷歌沒有幫我這麼做)

編輯2:

我只是想說清楚,我認爲我已經安裝了所有必需的軟件。如果你認爲我只是想念一些圖書館,我願意接受更多的東西。 P.S.我稍微修改了代碼,並且套接字顯示爲打開併發送了10個字節。 LiDAR「鏈接」指示燈在我發送數據包之後不會閃爍(之前做過),所以我不認爲數據包實際上是通過電纜接入的

回答

1

因此,事實證明,此問題與Boost無關套接字。錯誤來自與LiDAR本身的連接。它通過我的網絡連接顯示爲連接,但實際上並沒有連接到LiDAR。在我將該方法的IPv4方法切換到Link-Local後,立即生效。感謝所有閱讀並認爲我的問題的人