该驱动的x86架构根据手册和Github说明步骤来即可,可以正常启动。
检查克隆下来的驱动,检查其中的文件没有发现链接的库(x86与arm库不共用),则可以尝试安装。
提示,可以通过下述指令来查看库(二进制文件等)的属性
readelf -h xxxxx.so
由于使用的是Armv8架构的Xavier AGX,步骤和手册中有所不同。
先按一般步骤来处理:
驱动github地址:
https://github.com/basler/pylon-ros-camera/tree/master/pylon_camerahttps://github.com/basler/pylon-ros-camera/tree/master/pylon_camera上面的工程下方也有详细的操作步骤。
操作手册下载(仅有描述为x86-linux的手册):
pylon开源项目全新pylon开源项目pypylon推出之后,Basler相机用户现在可以使用Python来开发原型应用。为ROS而设的pylon相机驱动程序有助推动在机器人领域中使用GigE和USB 3.0相机。欢迎了解更多信息,并参与pypylon的进一步开发。https://www.baslerweb.com/cn/products/software/basler-pylon-camera-software-suite/pylon-open-source-projects/第一步,在catkin_ws中添加源文件(2个pkg)
cd ~/catkin_ws && git clone https://github.com/basler/pylon-ros-camera && git clone https://github.com/dragandbot/dragandbot_common.git
第二步,通过阅读手册和项目文件,我们知道安装该驱动依赖于pylon环境(后面描述为是否安装都可,见其github下述命令,添加源后根据rosdep来自动安装)
sudo sh -c 'echo "yaml https://raw.githubusercontent.com/basler/pylon-ros-camera/master/pylon_camera/rosdep/pylon_sdk.yaml" > /etc/ros/rosdep/sources.list.d/30-pylon_camera.list' && rosdep update && sudo rosdep install --from-paths . --ignore-src --rosdistro=$ROS_DISTRO -y
该命令段依赖于 rodep,若未安装rosdep则需先安装rosdep,但往往rosdep安装都会出现无法连接至.yaml文件的问题(sudo rosdep init 出现 ERROR: cannot download default sources list from),可以通过下述链接解决(最为有效):
链接
如果自动下载pylon所需失败,推荐手动下载,上述的命令有两个作用:判断${PYLON_ROOT}即pylon是否存在(注意pylon6的路径为/opt/pylon),并判断版本(推荐为pylon6),下载cv_bridge等依赖(由CMakeLists.txt中添加)。
arm架构的cpu推荐去官网下载arm64(下图中两个都可,ubuntu推荐Debian)
机器视觉软件及工业相机软件下载 - pylon, ToF 等 | Basler
安装Debian:使用dpkg命令如下图
(注意pylon6的路径为/opt/pylon)
接下来是踩坑记录:
按照默认的操作,将功能包(pkg)放入工作区,在catkin_ws中:
使用catkin_make clean可以正常构建,如果提示opencv相关报错(如cv_bridge):
这是因为Xavier默认给出的是opencv4,需要按照路径打开 cv_bridgeconfig.cmake,搜索opencv,共两处,opencv4 v与没有空格
if(NOT "include;/usr/include;/usr/include/opencv4" STREQUAL " ")
set(cv_bridge_INCLUDE_DIRS "")
set(_include_dirs"include;/usr/include;/usr/include/opencv4")
接下来使用catkin_make来构建,此时会出现如下报错:
我们的设备时arm架构的,怎么会存在x86_64这样的目录结构呢?通过路径查找,我们的设备上并没有该路径,相对应的是/usr/lib/armarch64-linux-gnu/xxxx.so,通过搜索该动态库也存在,目录正是在/usr/lib/armarch64-linux-gnu/下。该错误的意思是在生成pylon_camera的库的时候没有链接库成功。
问题定位:应当是在构建pylon_camera库时的链接问题
我们转到该pkg的CMakelists.txt中
搜索“target_link_libraries”
可以看到涉及到链接库的操作一共有4次,其中projectname为pylon_camera即我们所建立的库名字。第一处,就是在创建名为pylon_camera的库文件,链接(link)到了${catkin_libraries}和${Pylon_libraries},我们不确定是哪个部分有问题,可以比对后面三处的库链接来确定问题。
回到catkin_ws下的build目录下,进入构建的目录中,通过Makefile定位到CmakeFiles文件夹中
打开以下路径:
catkin_ws/build/pylon-ros-camera/pylon_camera/pylon_camera.dir
build/pylon-ros-camera/pylon_camera/CMakeFiles/pylon_camera_node.dir
build/pylon-ros-camera/pylon_camera/CMakeFiles/IPConfigAuto.dir
build/pylon-ros-camera/pylon_camera/CMakeFiles/write_device_user_id_to_camera.dir
查看路径下的link.txt和build.make文件
可以发现问题所在,第三四个个仅包含${Pylon_libraries}的文件中只含有指向opt/pylon/lib的语句,所以可以确定,${Pylon_libraries}="opt/pylon/lib";第一个和第二目录下可以发现link为:
link.txt:
比较发现(pylon_camera_node截图略),多出的链接库应当是由${catkin_libraries}带来的(为什么呢?此处留坑待填)。
尝试搜索arm架构下的相同库是否存在,确认为Opencv的不同架构的库,同样名字的库在armarch64-linux-gnu下仍然存在。
那么我们就有一个思路了:将 /x86_64-linu-gnu/ 路径全部替换为 /armarch64-linux-gnu/ ,注意:需要将两个MakeFile文件中都替换调,最好也将两个link.txt中路径替换。替换后我们重新catkin_make(此时并不会重新编译,只会重新构建,所以不用担心再次编译被覆盖,但是由此可见这个方法只是临时有效,建议生成完成后将生成的文件夹保存),成功构建。
测试:
roslaunch pylon_camera pylon_camera_node.launch
或者使用:
rosrun pylon_camera pylon_camera_node
注意:两者都不包含rviz,需要手动打开rviz,选择后成功显示如下!(默认为mono8格式,输出帧率为5Hz,可在xml配置文件中根据说明调整)接下来就是修订参数的工作了。
上图为激光雷达和相机共同发布。
附录:
推荐阅读:ROS学习之CMakeLists.txt - IQIT - 博客园
【填坑部分学习内容】
Variables — catkin 0.6.19 documentation
catkin/CMakeLists.txt - ROS Wiki
where does {catkin_LIBRARIES} refer to, in package [closed] - ROS Answers: Open Source Q&A Forumc
根据Q&A的ros论坛,可以看到,他对${catkin_libraries}的解释为: cakin_LIBRARIES is the list of all of the libraries (targets and real libraries) that you need to compile against the dependencies you specified in find_package(catkin ...) 即就是说它是一个根据我们的Dependencies需要创建的包含目标和实际的库得列表。
打开CMakelists.txt:
可以看到find_package 以及添加的catkin pkg的组件
roslint的官方释义:CMake lint commands for ROS packages. The lint commands perform static checking of Python or C++ source code for errors and standards compliance.
值得注意的是,在我们使用add_library()或add_executable()之前,必须调用上图的catkin_package(),其是一个catkin提供的CMake宏。
INCLUDE_DIRS - 包的导出包含路径
LIBRARIES - 从项目导出的库
CATKIN_DEPENDS - 该项目依赖的其他catkin项目
DEPENDS - 该项目所依赖的非catkin CMake项目。
CFG_EXTRAS - 其他配置选项
从中我们可以看出catkin_package包含该项目依赖的其他catkin项目,此处依赖为前面给出的组件。
再往下阅读,链接库一般在创建完可执行文件之后,对于pylon_camera和pylon_camera_node与其他不同的是二者都添加了依赖(dependencies):
可见二者依赖于${catkin_EXPORTED_TARGETS},那么什么时候使用它呢?可以参考下面的链接:
When is ${catkin_EXPORTED_TARGETS} needed - ROS Answers: Open Source Q&A Forumhttps://answers.ros.org/question/286311/when-is-catkin_exported_targets-needed/
这种依赖关系不能自动传播。
如果您有一个构建消息和/或服务的包以及使用这些消息(msg)和/或服务(srv)的可执行文件,则需要为自动生成的消息目标创建明确的依赖关系,以便以正确的顺序构建它们。( some_target 是由add_executable()设置的目标的名称):
add_dependencies(some_target $ {$ {PROJECT_NAME} _EXPORTED_TARGETS})
如果您的包满足上述两个条件,则需要添加这两个依赖关系,则需要二者都使用,即:
add_dependencies(some_target $ {$ {PROJECT_NAME} _EXPORTED_TARGETS} $ {catkin_EXPORTED_TARGETS})
此处应当是这两个均需要使用到息和/或服务的包从而需要添加这个依赖,与报错无关。
待补充......
------------------------------------------------------------------------------------------------------------
问题已找到,但是还是未找到可以自动处理(修订)的方法,现阶段推荐手动修改。
处理方法为:将 /x86_64-linu-gnu/ 路径全部替换为 /armarch64-linux-gnu/ ,注意:需要将两个MakeFile文件中都替换调,最好也将两个link.txt中路径替换。替换后我们重新catkin_make(此时并不会重新编译,只会重新构建,所以不用担心再次编译被覆盖,但是由此可见这个方法只是临时有效,建议生成完成后将生成的文件夹保存)