我正在運行的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「鏈接」指示燈在我發送數據包之後不會閃爍(之前做過),所以我不認爲數據包實際上是通過電纜接入的