编译之后,运行时出现这样的结果
重新编译后依然如此,只好删掉build
文件夹里对应的文件,再编译后就没问题了
catkin_make
之所以有时报错内存不足,有时正常,是因为编译是按拓扑顺序,可能同时编译了move_base和teb_local_planner这两个耗内存大的包,导致报错
catkin_make
中途 ctrl+C 造成一个新的package放入工作空间后,是不能直接识别的,无论source setup.bash还是catkin_make --pkg
都不行,必须先对整个工作空间catkin_make
,此时才会识别它
要尽量避免这种情况,否则会混乱。此时如果有问题,用echo $ROS_PACKAGE_PATH
查看环境变量包含的ROS工作空间
执行catkin_make
时,有时会报错Could not find GTest
,这是由于缺少测试模块,加-DBUILD_TESTING=OFF
可以避免测试。
把ROS的工作空间转移到另一台电脑上会编译失败,build和devel里有很多文件会构成影响,即使二者的用户名一样也不行。所以每次只能复制src文件夹,放到另一台电脑的工作空间里。
我的一个自定义msg,将整个工作空间移植到另一台电脑,编译没出错,但是echo出错,好像rostopic不被识别一样:
使用qt-ros-plugin
,不知怎么操作,导致find_package(catkin)
无法识别catkin,不能在任何工作空间编译,其他命令都正常。利用whereis catkin
找到路径,删除相应文件,然后重装ROS
命令catkin_init_workspace
:Initializes a catkin workspace by creating a top-level CMakeLists.txt.
这个命令最好不要用,创建工作空间还是新建文件夹,然后进入执行catkin_make
执行catkin_make
时,报错:,执行roscd等命令也提示没有安装,感觉就像是没有装ros一样。解决方法: source /opt/ros/kinetic/setup.bash
编译禾赛雷达的驱动HesaiLidar_General_ROS
,结果报错PandarScan.h: No such file or directory
. 然后又catkin_make
一次,竟然成功了。这时去devel/include
里可以看到缺少的头文件了。 应当是第一次编译时确实缺少,然后接着编译剩下部分,此时就生成头文件了。 再编译第二次,原来需要头文件的地方就编译成功了。
参考: HesaiLidar_General_ROS/issues/24
出现这个警告是由于时钟不同步导致的,即系统时间比文件修改时间早,换到另一个Linux系统切换可能会出现这个问题。
如果在不同计算机之间传输文件,可能出现这种报警,是由于二者的UTC对时不同。现象是文件的修改时间比当前的系统时间还要晚。可能会导致某些不该编译的文件编译,或者该编译的没有编译。
在受影响的文件夹内执行一次 touch *
即可永久修正这一问题。
依次执行下列指令即可1
2
3find . -type f | xargs -n 5 touch
catkin_make clean
catkin_make
将所有文件都重新touch一遍,更新到本地系统的时间,再make就没问题了。
1 | CMake Warning (dev) at planners/pure_pursuit_local_planner/CMakeLists.txt:57 (add_dependencies): |
可能加一句1
2
3add_dependencies(${PROJECT_NAME}
${PROJECT_NAME}_gencfg
${PROJECT_NAME}_generate_messages_cpp)
在CMakeLists.txt
中的catkin_package()
之后,添加1
2add_compile_options(-pg)
set(catkin_LIBRARIES ${catkin_LIBRARIES} -pg)
默认情况,一个launch的所有节点都会把gprof输出到同一个文件。在<node>
之前添加<env>
部分,GMON_OUT_PREFIX
环境变量表示了gprof的前缀1
2
3
4
5<env name="GMON_OUT_PREFIX" value="listener" />
<node name="listener" pkg="examples" type="listener" output="screen" />
<env name="GMON_OUT_PREFIX" value="talker" />
<node name="talker" pkg="examples" type="talker" output="screen" />
gprof文件会在~/.ros
生成。
参考: gprof
第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。
使用编号区分会话,不太直观,更好的方法是为会话起名 tmux new -s <session-name>
tmux ls
命令可以查看当前所有的 Tmux 会话。
tmux attach
命令用于重新接入某个已存在的会话。1
2
3
4
5# 使用会话编号
tmux attach -t 0
# 使用会话名称
tmux attach -t <session-name>
杀死某个会话1
2
3
4
5# 使用会话编号
tmux kill-session -t 0
# 使用会话名称
tmux kill-session -t <session-name>
tmux switch命令用于切换会话1
2
3
4
5# 使用会话编号
tmux switch -t 0
# 使用会话名称
tmux switch -t <session-name>
1 | lsof abc.txt //显示开启文件abc.txt的进程 |
使用后发现对文本文件、图片这样的文件不适用,对可执行文件适用。