㈠ ros 出现error reading version line怎么办
一般来说出现这个问题的原因是你的rosbag已损坏,你可以使用rosbag info XX.bag查看你想要读取的rosbag包的信息,如果无法读取到有效信息,说明该rosbag确实已损坏。
㈡ 为什么ROS里那么多的错误包
你说的是SSH错误吗?那是外网有人用SSH登录你的ros,你把SSH的22端口号噤了或者把端口号改了就可以了.
㈢ 在Ubuntu中用rosmake编译没有可执行文件生成是怎么回事
提示:make:没有什么可以做的为`first'。这个是Makefile的一个提示,出现这个提示是因为你编译出来的可执行文件的时间戳比你的源代码文件的时间戳“迟”,所以make认为你这种情况下没必要编译,因为即使编译了,编出来的东西和现有的可执行文件一样,就是浪费时间了,所以提示没有什么可以做的为`first'。如果你还要编,随便打开源代码的一个文件,保存下,就可以编译了
㈣ ROS使用python3
参考:
为了使用python3的图像处理程序,需要使用到ros接口,但是由于原生ros接口不支持python3,只能使用python2.7(时间2020-07,版本melodic),一下步骤主要为了使用ros调用的方式调用python3的程序
由于ros接收图像数据使用的是cv_bridge 接口,所以先编译python3版本的cv_bridge
注意:此时要先安装好python3的环境,可以按照以下方式安装
进入到工作空间进行编译
会有如下提示
编译完成后,可以在工作路径下的install文件夹里生成需要的库,需要使用python3版本的cv_bridge时,就将这个环境变量导入即可
extend参数的作用是让这次的路径配置不影响之前配置好的路径
1. 在使用rosrun 运行程序时,默认还会调用原生melodic的cv_bridge
我的处理方法是将原来的python版本cv_bridge删除
2. 编译完成会有错误提示,如下图,但不影响使用
编译安装:
在编译时,使用如下命令:
编译过程中会有错误提示
解决方法:
参考 https://answers.ros.org/question/257757/importerror-no-mole-named-em-error/
编译完成如下:
运行roscore错误提示
安装netifaces
参考 https://github.com/frescobaldi/python-poppler-qt5/issues/29
https://launchpad.net/ubuntu/+source/sip4/4.19.21+dfsg-1build1
解压安装
㈤ ROS usb_cam 编译问题
[USBCAM]摄像头录像软件用摄像头和电脑录像。不用采集卡、监视器、摄像枪、压缩卡。生成录像文件体积小巧,压缩比超高。原来约500MB/分钟的录像(15FPS640*480),在画质基本无损的情况下压缩成2.5MB/分钟。
㈥ ROS中分析catkin_make编译信息的方法
在使用catkin_make编译时,在终端中会有很多打印,导致非常难找错误信息。
一个小窍门就是:
在终端中使用以下命令执行编译:
此时在终端中只显示错误信息打印以及cmake中使用message 打印的信息。
另外开启新的终端 输入命令: tail -f logs 查看编译的打印信息。
㈦ ROS 工作空间、package 及 catkin 编译系统
本文内容都可以在 ROS 官网 wiki ( http://wiki.ros.org/ROS/Tutorials )中找到,作者只是根据自己的理解重新阐述了其中的某些内容,或许能帮助读者更好的理解 ROS 系统中的一些概念。首先保证 ROS 已经正确安装了。安装方式可以参考 本博客的另一篇文章 。
简单地说,ROS workspace (工作空间)就是统一存放 ROS 文件的地方,比如一个项目的所有 ROS 文件最好都放在一个 workspace 中,便于统一管理、编译和调用。
catkin 是目前 ROS 的编译系统,自 ROS Groovy 版本开始使用,取代了之前的 rosbuild 编译系统。
ROS workspace 中可以包含若干 ROS package,每个 package 内部包含实现某些特定功能的文件。
其中,~ 表示当前用户的 home 目录, -p (parent)参数可以创建某个文件夹和它的父文件夹,也就是两层的路径。这里 workspace 的名字是 catkin_ws,这个名字可以按照自己项目的内容设定,但是 src 这个文件夹的名字是固定的。
初始化工作空间。这里 src 就是以后存放 ROS 源文件的地方。上述命令之后,会在 src 目录下产生 CMakeLists.txt 文件,这实际上是一个链接到ROS 安装目录下的 /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake 一个超链接文件,对工作空间做了一些初始设置。不用去管它,也不要随便修改它。
会一次性编译 src 文件夹中的所有源文件,同时生成 devel 和 build 两个文件夹。
实际上,catkin_make 这个命令并没有特别神奇的地方,它只是把一系列基本的编译命令整合在了一起,一个 catkin_make 命令相当于如下的一系列命令:
如果要深入研究 catkin_make 编译方式,可以参考 这篇文章 。
将 workspace 的信息载入系统环境变量。
这种方法载入的信息只对当前 terminal 有效。新开一个 terminal 就无效了。如果要对每个 terminal 都有效,可以将上述命令写入用户 home 路径下的 .bashrc 文件中:
注意,.bashrc 文件是隐藏文件,在 home 路径下通过命令
命令可以看到。
还要注意, >> 是将 echo 后边的内容写入文件的尾部,如果用 > 则要覆盖原文件,一定不要搞错。
编译之后,由于我们只是一个空的 workspace,还没有任何 package,所以没有什么实质性的东西,只是告诉系统这里有个 ROS workspace,算是在系统中注册了一下。
package 是组织 ROS 文件的基本单元,一般来说,每个 package 完成一些特定功能。
package 中至少包含两个文件: package.xml 和 CMakeLists.txt.
package 在 workspace 中的存放结构一般如下:
也可采用其他的结构,但是要注意 package 之间不能嵌套,也就是在一个 package 中,不能再创建另一个 package ,所有 package 都必须是相对独立的目录。
用 catkin 创建 package 的过程很简单,用如下命令:
其中 depend 为依赖的其他 package。这样创建之后,package 中的 CMakeLists.txt 和 package.xml 中会体现出这种依赖关系。创建时也可以不指明依赖关系,在后续编译 package 的时候再补上。
创建好了 package,就可以使用 rospack 相关的命令进行查找、进入等操作了。不过,有时会有延迟,可以用命令
或者
查找、更新一下。
上述方式创建了 ROS package,然后就可以在其中编写 源文件了,可用的语言主要是 c++, python,我们现在的项目中还用到了 Julia。这里就不再细述具体的源文件编写过程了。
创建好了源文件,如果是 c++ 编写的,要编译一下。这里要设置好 package.xml 和 CMakeLists.txt 中的信息。如果依赖的 package 已经设置好了,就不需要修改 package.xml 了,只需要在 CMakeLists.txt 中添加源文件对应的编译信息如下:
实际上在 CMakeLists.txt 中有非常全面的模板,很容易找到在哪里添加这些编译文件信息。
设置好了编译信息,就可以回到 workspace 的 src 所在文件夹中,用如下命令编译:
该命令可以一次性编译 src 中的所有 package。如果只想编译指定的 package,可以用如下命令:
但是,这个命令似乎有时不太管用,根据我们的实际经验,最有效的方法是用如下的 whitelist 命令:
这样就是只编译 package1 和 package2。但是要注意,该命令中的 whitelist 具有记忆功能。用完该命令之后,下次如果要编译 src 中所有的 package,如果只用 catkin_make,则还是只编译 whitelist 中的 package,需要用如下命令清除一下 whitelist
以上就是我们使用 ROS 中的一些基本操作,希望其中的一些内容对读者有帮助。
Written by SH
Revised by QP
㈧ GDB ROS调试
ROS中用到第三方库,在编译第三方库的时候,加上 -g 选项,以供调用该库时调试。
在编译ROS包的时候,使用如下命令编译:
catkin_make -DCMAKE_BUILD_TYPE=Debug
GDB启动应用
rosrun --prefix 'gdb -ex run --args' package node
之后就可以正常使用GDB命令来调试了,因为第三方库编译加了 -g 选项,所以可以进入调用库中的函数进行调试。
㈨ ros编译提示缺少链接库怎么办
一、标准:ROS功能包中调用第三方静态库
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/source.cpp
include/source.h
)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
${PROJECT_SOURCE_DIR}/lib/第三方库名
)
以上一般情况下都没问题,但是有些静态库没有添加pie系统保护功能,导致程序转载的地址是无效的,所以我们在链接时候也需要关闭pie功能。
注:引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小
二、解决链接未开启pie功能的静态库时,编译报错
先作对比:
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/source.cpp
include/source.h
)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
${PROJECT_SOURCE_DIR}/lib/第三方库名 -no-pie
)
与一般的链接形式对比,我们只是在链接第三方库的后面加了-no-pie,之后再到ROS的工作空间中重新编译就完成了!