问题描述:
在ROS中将自己的功能包打包为二进制文件后,想安装在自己的主机上测试下打包的有没有问题。使用dpkg命令安装后发现可以使用,便将这个debian文件装到另一个主机上。
没想到,最后竟然用不了,显示找不到可执行文件。明明装到自己的电脑上可以,到那时装到别的电脑上就不行。当时以为遇到啥玄学问题了,不过经过排查一番发现还是自己的操作有问题
1
原因分析
经过排查主要有两个原因:
第一个问题:
为什么撞到自己的电脑上没问题而装到别人的电脑上没问题?
因为我的电脑上本来就装的有这个package,当我用roslauch的时候,自然就在我编译的那个工作空间里找到了相应的包,并可以成功运行。属于是工作空间的覆盖问题。
第二个问题:
为什么找不到可执行文件?
这个是因为我的二进制包的CMakeList写的有问题,没有将编译的可执行文件放入,所以装到别人的主机上找不到可执行文件。
解决办法:
第一个问题:
想要在自己的电脑上验证,需要将.bashrc上source自己的工作空间的那一行给注释掉,这样在新开一个terminal的时候,不会自动source到自己的工作空间路径下面。
一般来讲这么操作就行了,但是我遇到一个特别奇怪的事,不知道是不是个例。就是我roscd我的包目录并不是我的工作空间下,实在ros默认的opt文件夹下。但是我roslaunch的时候,执行的还是我的工作空间下的东西。所以我干脆直接把我的工作空间里的那个包给删了。
第二个问题:
这个主要是修改CMakeLists,就行了。下面放一个模板
# Mark executables and/or libraries for installation
install(TARGETS mvcam #这里放自己要链接的可执行文件
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
然后别的文件夹,比如launch等想要放进二进制包中的话,需要把这句话放如CMakeList中
## Mark other files for installation (e.g. launch and bag files,etc.)
install(DIRECTORY launch/ DESTINATION
${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
PATTERN ".svn" EXCLUDE)