Basler pylon-ros-camera驱动 Xavier AGX调试记录 (Arm架构)

该驱动的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.txtbuild.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(此时并不会重新编译,只会重新构建,所以不用担心再次编译被覆盖,但是由此可见这个方法只是临时有效,建议生成完成后将生成的文件夹保存

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MendozaG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值