yourphp企業(yè)網(wǎng)站管理系統(tǒng)360優(yōu)化大師舊版本
在機(jī)器人操作系統(tǒng)(ROS)的開(kāi)發(fā)過(guò)程中,構(gòu)建工作空間時(shí)遇到各種依賴性問(wèn)題是常見(jiàn)的挑戰(zhàn)之一。尤其是在多Python環(huán)境共存的情況下,環(huán)境變量的沖突往往導(dǎo)致諸如缺少empy模塊等錯(cuò)誤。本文將詳細(xì)介紹在ROS Noetic與Anaconda Python環(huán)境共存的情況下,如何通過(guò)調(diào)整環(huán)境變量?jī)?yōu)先級(jí)來(lái)解決Catkin構(gòu)建失敗的問(wèn)題。
一、引言
隨著機(jī)器人技術(shù)的發(fā)展,ROS(Robot Operating System)已成為機(jī)器人軟件開(kāi)發(fā)的標(biāo)準(zhǔn)框架。然而,開(kāi)發(fā)過(guò)程中涉及多種工具和依賴庫(kù),尤其是Python環(huán)境的配置,常常成為潛在的障礙。特別是在系統(tǒng)Python與Anaconda等第三方Python環(huán)境共存時(shí),環(huán)境變量的優(yōu)先級(jí)可能導(dǎo)致ROS無(wú)法正確找到所需的模塊,如empy,從而導(dǎo)致Catkin構(gòu)建失敗。
本文將以一個(gè)實(shí)際案例為基礎(chǔ),深入探討在環(huán)境沖突情況下如何調(diào)整環(huán)境變量?jī)?yōu)先級(jí),確保ROS的正常構(gòu)建與運(yùn)行。通過(guò)系統(tǒng)化的步驟和詳盡的解釋,幫助開(kāi)發(fā)者快速定位并解決類(lèi)似問(wèn)題,提升開(kāi)發(fā)效率
二、問(wèn)題描述
在嘗試使用Catkin構(gòu)建ROS工作空間時(shí),系統(tǒng)報(bào)出如下錯(cuò)誤信息:
sunshine@sunshine:~/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws$ catkin_make
Base path: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws
Source space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src
Build space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build
Devel space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
Install space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install
####
#### Running command: "cmake /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src -DCATKIN_DEVEL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel -DCMAKE_INSTALL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install -G Unix Makefiles" in "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/noetic
-- This workspace overlays: /opt/ros/noetic
-- Using PYTHON_EXECUTABLE: /home/sunshine/SoftWare/Anaconda/bin/python3
-- Using Debian Python package layout
-- Could NOT find PY_em (missing: PY_EM)
CMake Error at /opt/ros/noetic/share/catkin/cmake/empy.cmake:30 (message):Unable to find either executable 'empy' or Python module 'em'... tryinstalling the package 'python3-empy'
Call Stack (most recent call first):/opt/ros/noetic/share/catkin/cmake/all.cmake:164 (include)/opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:20 (include)CMakeLists.txt:4 (find_package)-- Configuring incomplete, errors occurred!
See also "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build/CMakeFiles/CMakeOutput.log".
Invoking "cmake" failed
經(jīng)過(guò)檢查,系統(tǒng)中并未找到empy模塊,且即便通過(guò)apt-get安裝了python3-empy,問(wèn)題依舊存在。進(jìn)一步排查發(fā)現(xiàn),當(dāng)前使用的是Anaconda的Python環(huán)境,而ROS Noetic期望使用系統(tǒng)自帶的Python環(huán)境。這導(dǎo)致python3-empy安裝在系統(tǒng)Python下,而Anaconda的Python環(huán)境無(wú)法識(shí)別該模塊,進(jìn)而引發(fā)構(gòu)建失敗
三 解決方案
1、確認(rèn)當(dāng)前Python環(huán)境
首先,確認(rèn)當(dāng)前系統(tǒng)使用的Python環(huán)境以及empy模塊的安裝情況
which python3
python3 -c "import em"
如果which python3輸出的是Anaconda的路徑(如/home/sunshine/SoftWare/Anaconda/bin/python3),且import em報(bào)錯(cuò)ModuleNotFoundError: No module named ‘em’,則說(shuō)明當(dāng)前Python環(huán)境無(wú)法識(shí)別empy模塊
2、安裝empy模塊
由于ROS Noetic與系統(tǒng)Python環(huán)境高度集成,推薦使用系統(tǒng)包管理器安裝empy
sudo apt-get update
sudo apt-get install python3-empy
安裝完成后,驗(yàn)證安裝是否成功:
which empy
python3 -c "import em"
理想情況下,which empy應(yīng)返回/usr/bin/empy,且import em不應(yīng)再報(bào)錯(cuò)
三 優(yōu)先使用系統(tǒng)的Python環(huán)境
為了確保ROS使用系統(tǒng)的Python環(huán)境,可以通過(guò)臨時(shí)調(diào)整PATH環(huán)境變量,使系統(tǒng)的Python和empy優(yōu)先于Anaconda的環(huán)境。
在當(dāng)前終端會(huì)話中,運(yùn)行以下命令:
export PATH=/usr/bin:$PATH
解釋:該命令將系統(tǒng)的/usr/bin目錄添加到PATH的最前面,確保系統(tǒng)的Python和empy被優(yōu)先調(diào)用。
驗(yàn)證調(diào)整是否生效
which python3
# 應(yīng)輸出 /usr/bin/python3which empy
# 應(yīng)輸出 /usr/bin/empypython3 -c "import em"
# 無(wú)錯(cuò)誤輸出
四、重新構(gòu)建Catkin工作空間
(base) sunshine@sunshine:~/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws$ export PATH=/usr/bin:$PATH
(base) sunshine@sunshine:~/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws$ catkin_make
Base path: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws
Source space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src
Build space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build
Devel space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
Install space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install
####
#### Running command: "cmake /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src -DCATKIN_DEVEL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel -DCMAKE_INSTALL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install -G Unix Makefiles" in "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build"
####
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using CATKIN_DEVEL_PREFIX: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/noetic
-- This workspace overlays: /opt/ros/noetic
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.8.10", minimum required is "3")
-- Using PYTHON_EXECUTABLE: /usr/bin/python3
-- Using Debian Python package layout
-- Found PY_em: /usr/lib/python3/dist-packages/em.py
-- Using empy: /usr/lib/python3/dist-packages/em.py
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build/test_results
-- Forcing gtest/gmock from source, though one was otherwise available.
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python3 (found version "3.8.10")
-- Found Threads: TRUE
-- Using Python nosetests: /usr/bin/nosetests3
-- catkin 0.8.10
-- BUILD_SHARED_LIBS is on
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build
####
#### Running command: "make -j24 -l24" in "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build"
####
構(gòu)建完成!!
四 長(zhǎng)期解決方案
如果頻繁需要在Anaconda和系統(tǒng)Python環(huán)境之間切換,建議采用以下長(zhǎng)期解決方案
1、創(chuàng)建獨(dú)立的終端會(huì)話
在需要構(gòu)建ROS工作空間時(shí),開(kāi)啟一個(gè)不激活A(yù)naconda環(huán)境的新終端,確保使用系統(tǒng)的Python環(huán)境
2、 使用虛擬環(huán)境
為ROS創(chuàng)建一個(gè)專(zhuān)用的Python虛擬環(huán)境,隔離其依賴:
python3 -m venv ros_env
source ros_env/bin/activate
pip install empy
在此環(huán)境中構(gòu)建ROS工作空間,避免與其他Python項(xiàng)目的依賴沖突。
3、修改Anaconda的激活腳本
在激活A(yù)naconda環(huán)境后,手動(dòng)將系統(tǒng)的/usr/bin添加回PATH的優(yōu)先位置
conda activate your_env_name
export PATH=/usr/bin:$PATH
這樣可以確保在使用Anaconda環(huán)境的同時(shí),系統(tǒng)的Python和empy依然優(yōu)先可用。
五、總結(jié)
在多Python環(huán)境共存的系統(tǒng)中,確保ROS使用系統(tǒng)的Python環(huán)境是避免依賴性問(wèn)題的關(guān)鍵。通過(guò)臨時(shí)調(diào)整PATH環(huán)境變量,可以快速解決缺少empy模塊導(dǎo)致的Catkin構(gòu)建失敗問(wèn)題。然而,為了長(zhǎng)期穩(wěn)定地開(kāi)發(fā)ROS項(xiàng)目,建議采用獨(dú)立的終端會(huì)話或虛擬環(huán)境,確保ROS與其他Python項(xiàng)目的依賴隔離。這不僅提升了開(kāi)發(fā)效率,也減少了潛在的兼容性問(wèn)題。