提升插座。在格式化/重新安装Ubuntu之后,工作代码不再工作。权限问题?
我正在运行的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“链接”指示灯在我发送数据包之后不会闪烁(之前做过),所以我不认为数据包实际上是通过电缆接入的
因此,事实证明,此问题与Boost无关套接字。错误来自与LiDAR本身的连接。它通过我的网络连接显示为连接,但实际上并没有连接到LiDAR。在我将该方法的IPv4方法切换到Link-Local后,立即生效。感谢所有阅读并认为我的问题的人