1 | [ WARN] [1709619594.875225471]: Control loop missed its desired rate of 300.00 Hz... the loop actually took 0.0087 seconds |
这个问题与时间同步和TF有关,在本地打开Rviz和SSH运行远程程序时,有很小概率出现此错误。
1 | [ WARN] [1709619594.875225471]: Control loop missed its desired rate of 300.00 Hz... the loop actually took 0.0087 seconds |
这个问题与时间同步和TF有关,在本地打开Rviz和SSH运行远程程序时,有很小概率出现此错误。
先写一个脚本file.sh
放在/etc/rc.d/init.d
,chmod -f 777 file
, 再ln -s file /etc/rc.d/rc0.d/K01file
与 /etc/rc.d/rc6.d/K01file
, 同时也要 ln -s file /etc/rc.d/rc3.d/S99file
与 ln -s file /etc/rc.d/rc5.d/S99file
1
2
3
4
5sudo ln -s shell_name /etc/rc0.d/K07shell_name
sudo ln -s shell_name /etc/rc3.d/S99shell_name
sudo ln -s shell_name /etc/rc5.d/S99shell_name
sudo ln -s shell_name /etc/rc6.d/K07shell_name
sudo touch /var/lock/subsys/shell_name
K开头的代表系统关闭的时候执行,S开头的代表开机的时候执行。注意服务器脚本编写的规范,因为有K开通的软链接并不一定会在关机的时候自动去执行,因为执行K脚本的时候会查询/var/lock/subsys/
是否有与K开头脚本同名的空文件名,如果没有就不去执行,所以要按照服务器脚本编写的规范,启动的时候要在/var/lock/subsys/
先touch一个与K01后面同名的空文件. 同时也要调用/etc/rc.d/init.d/functions
能够接受star与stop命令信号,具体可以参考/etc/rc.d/rc
文件
K*
/etc/rc6.d
包含重启脚本K*
Linux关机过程:
在系统关机时,shutdown命令会告诉init程序转换到0运行级别,如果是重新启动则转换到第6运行级别。当进入0或者6运行级别后,系统将会依照下面的顺序运行:
init关闭所有它能关闭的进程(转换到其他运行级别也一样)
rc0.d/rc6.d
目录下的第一个命令开始运行,锁定系统文件为关机作准备
rc0.d/rc6.d
目录下的第二个命令运行,卸载除根文件系统以外的所有文件系统(如挂载的windows分区)
rc0.d/rc6.d
中的命令将把根文件系统重新挂载为只读属性
rc0.d/rc6.d
中的命令调用sync程序把缓存中的数据写入文件系统
最后的命令是重新启动或者关闭内核程序
即使是手动断电,也会执行脚本。但是注意:如果是耗时的脚本命令,断电时间太快,来不及执行。但如果是shutdown
或reboot
命令,是可以执行的
1 | user@user:~/nav$ rosrun test test_node |
安装完ROS后,运行roscore报错1
Traceback (most recent call last): File "/opt/ros/groovy/lib/python2.7/dist-packages/roslaunch/__init__.py", line 230, in main write_pid_file(options.pid_fn, options.core, options.port) File "/opt/ros/groovy/lib/python2.7/dist-packages/roslaunch/__init__.py", line 106, in write_pid_file with open(pid_fn, "w") as f: IOError: [Errno 13] Permission denied: '/home/user/.ros/roscore-11311.pid'
注意rosdep update
不要用sudo,解决方法:sudo rosdep fix-permissions
,然后rosdep update
在一堆报错的最后是:1
InvalidURL: URL can't contain control characters. '192.168.1.35 ' (found at least ' ')
看上去是IP最后多了个空格,改了MASTER_URI
不起作用,最后发现问题是ROS_IP
和 ROS_HOME
,不要再写成hostname -I
,写成192.168.1.35
原因是因为ROS1支持的是Python2.7,而我之前将Ubuntu自带的Python升级到了3.8,也就是默认版本改变了,所以导致了相关的错误。 解决方法
改回来之后,有些程序可能还是需要python3.8,这时运行python3.8 file.py
,可能会报错no module named rospkg
和 no module named pydot
,所以需要pip install rospkg pydot
source setup.bash
出现的错误,发现我用的是zsh,换了之后正常
执行ROS命令结果报错 Network communication failed
这可能是当前用户没有这个权限,切换到root
再试试
这是因为之前运行过了,可以无视这个问题
环境变量没设置好,应当是IP和端口组合
对用到的某个文件没有给权限,找到执行chmod 755
即可
roscore
和rosrun
可以正常运行,但是rosnode list
只有rosout
,rostopic list
没有任何话题。无法用命令对节点和话题操作,可能是通信问题。原因不明,重启电脑后正常。
没有安装yaml-cpp或者版本不对,因为rviz读取PersistentSettings文件时需要这个库,下载0.5.1版本的yaml,把之前安装的yaml删掉,重新编译安装。编译生成的几个文件在/usr/local/lib
和/usr/local/include
,如果找不全,就先用现在的版本再编译一遍就知道了
启动bringup.launch
,偶尔会出现这个错误,这是下位机和ROS通讯失败造成的,报错在rosserial,很少发生
后来明白,原因是发布坐标系的节点在ubuntu 20.04
,rqt在ubuntu 18
运行rqt_tf_tree
,会出现 wait_for_service(/rqt_gui_py_node/tf2_frames), failed to contact ,will keep trying , rqt_tf_tree
一直打不开。
原因是IP变动的问题,重新设置IP地址,最好主机与从机都设置为静态ip。
一次没操作好,导致Rviz报错
这个文件是存在的,和其他电脑上正常的Rviz对应的文件路径相同。一直查不到原因,在网上查来查去,反复查ogre
这个库是不是装的出问题了,还以为是OpenGL版本变高了,其实这是显卡决定的。最后终于发现链接的librviz.so
不是官方路径的,而是我自己工作空间的。可以先用官方的替换
硬盘空间耗尽
1 | The build space at '/home/user/catkin_ws/build' was previously built by ''. Please remove the build space or pick a different build space. |
原因是硬盘空间耗尽
执行任何ROS命令都会报错 Unable to communicate with master
已经运行了ROS节点,结果发现什么ROS命令都会报这个错,后来终于发现,启动节点的环境变量是一套,后来改了,ROS命令都报这个错误。注意ROS_IP
如果使用名称而不是数字,必须是/etc/hosts
里定义的。
Rviz一个关于时间戳的报错,不必理会 Detected jump back in time of 0.223145s. Clearing TF buffer.
客户端的报错:1
ERROR: service [/task_dispatcher] responded with an error: b'Error opening file: '
服务端的报错:1
Exception thrown while processing service call: Error opening file
其实是代码中有错误,而且这个错误不一定和ROS有关,其他问题也会出现这个报错。
ROS时间信息的来源有两种,系统时间和仿真时间,分别被称为Wall Time
和ROS Time
,可以通过参数use_sim_time
来进行选择,当use_sim_time
为true时选择使用仿真时间,反之使用系统时间。
系统时间直接通过访问本地时钟来获得,而仿真时间则需要订阅/clock
话题获得,每当接收到该话题的消息,时间才会更新,在没有接收到该话题的第一个消息时,当前时间为0,/clock
是通过仿真时间服务器发布的,通常为ros_bag节点或仿真器如gazebo
由于Rviz也订阅了clock
话题,所以在Rviz的状态栏里能看到这两个时间。clock
由秒和纳秒两部分组成:1
2
3clock:
secs: 26
nsecs: 7000000
现如今sophus需要依赖fmt库,因此优先安装 fmt
1
2
3
4
5
6
7git clone https://github.com/fmtlib/fmt.git
cd fmt
mkdir build
cd build
cmake ..
make
sudo make install
最后生成一堆头文件和静态库 /usr/local/lib/libfmt.a
。fmt装完没有动态库libfmt.so
,有静态库和cmake
文件,在CMake里这样使用
1 | find_package(FMT REQUIRED) |
Kaist数据集中的代码kaist_tool/kaist2bag
很有用,命令rosrun kaist2bag mergebag.py merged.bag <bag_file_1> ... <bag_file_8>
, 即可将多个bag合成一个bag
另外有用的工具是 rosbag_editor