在使用 ROS Noetic 时,我遇到了一个问题,rosbridge_websocket
无法启动,报错与 pyOpenSSL
和 Twisted
相关。通过反复调试和多次尝试,终于找到了解决方案。本文将详细记录从报错到解决问题的全过程,希望能帮助遇到类似问题的开发者。
问题描述
启动 rosbridge_websocket
时,报错信息如下:
module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY' AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'
这是与 pyOpenSSL
库以及 Twisted
库的版本不匹配导致的。具体报错信息提到 OpenSSL 中缺少某些必要的标识符。
解决步骤
1. 卸载旧的 pyOpenSSL
首先需要卸载系统中的旧版 pyOpenSSL
,可以使用以下命令:
sudo pip3 uninstall pyOpenSSL
确认删除后,继续下一步。
2. 创建虚拟环境并重新安装依赖
接下来,为避免系统全局的 Python 库出现冲突,使用 Python 的虚拟环境:
sudo apt-get install python3-venv python3 -m venv myenv source myenv/bin/activate
在虚拟环境中,重新安装所需的依赖:
pip install pyopenssl twisted autobahn bson service_identity
确保这些依赖库安装成功。
3. 启动 rosbridge_websocket
现在可以尝试重新启动 rosbridge_websocket
:
roslaunch rosbridge_server rosbridge_websocket.launch
启动后应该能看到类似以下的输出:
WebSocketServerFactory starting on 9090 Rosbridge WebSocket server started at ws://0.0.0.0:9090
这意味着 WebSocket 服务器已经成功启动,ROS 话题可以通过 WebSocket 在端口 9090 进行通信。
4. 测试 WebSocket
可以通过简单的 HTML 页面测试 ROS 的通信功能,确保 rosbridge_websocket
正常工作。
示例 HTML 代码
<!DOCTYPE html>
<html>
<head>
<title>ROS WebSocket Test</title>
<script src="https://cdn.robotwebtools.org/roslibjs/current/roslib.min.js"></script>
</head>
<body>
<h1>ROS WebSocket Test</h1>
<button onclick="sendCommand()">Send Command to Robot</button>
<script type="text/javascript">
var ros = new ROSLIB.Ros({
url: 'ws://localhost:9090' // 确保这里的URL与实际服务器地址一致
});
ros.on('connection', function() {
console.log('Connected to websocket server.');
});
ros.on('error', function(error) {
console.log('Error connecting to websocket server: ', error);
});
ros.on('close', function() {
console.log('Connection to websocket server closed.');
});
function sendCommand() {
var cmdVel = new ROSLIB.Topic({
ros: ros,
name: '/cmd_vel',
messageType: 'geometry_msgs/Twist'
});
var twist = new ROSLIB.Message({
linear: { x: 0.1, y: 0, z: 0 },
angular: { x: 0, y: 0, z: 0.1 }
});
cmdVel.publish(twist);
console.log('Command sent to robot');
}
</script>
</body>
</html>
将上述代码保存为 index.html
,打开浏览器查看页面,并通过 WebSocket 向 ROS 机器人发送指令。
总结
成功解决了 rosbridge_websocket
启动时遇到的 pyOpenSSL
和 Twisted
库的版本冲突问题。通过创建虚拟环境并重新安装正确的依赖,确保了 rosbridge_websocket
能够正常运行。希望这篇文章能对你有所帮助,如果有任何问题,欢迎在评论区讨论。