ROS调试记录
1.将USB与电脑连接后无法读取硬件数据
错误显示…Permission denied,原因为USB权限不够。首先查看USB串口号:
$ ls -l /dev/ttyUSB*
可以看到类似/dev/ttyUSB0
的值,这说明这是使用USB转接线的串口,若为一般串口则为类似ttyS0
。使用如下命令修改其权限:
$ sudo chmod 666 /dev/ttyUSB0 #666也可以改为777
修改权限后即可从USB读取硬件发送过来的数据。linnux系统在处理设备时,会把它当成文件来处理,因此才有了/dev/ttyUSB0
这一写法。
2.ROS中的命名空间和参数管理
ROS中的节点、参数等资源使用时都有其命名空间。在定义节点、参数时若名称前不加/
和~
则默认为在相对命名空间中使用,在.launch
文件中可以对其命名空间进行配置,使得拥有同名的节点可以在不同的命名空间下同时运行。
例如创建节点时节点名为node_name
,将其放在命名空间/namespace1
和/namespace2
下运行,其节点运行时分别为/namespace1/node_name
和/namespace2/node_name
,即可防止同名不可同时运行。
命名空间还有/
(全局命名空间)和~
私有命名空间:
- 全局命名空间在最顶层路径下,若在对节点进行命名时使用全局命名空间,如
/node_name
,则运行时就会在最顶层运行,而无法将其放到其他命名空间中。 - 私有命名空间是在节点命名空间以下,如节点名称为
/node_name
,则存放在私有命名空间中的资源如~foo
即为/node_name/foo
。一般私有命名空间用于在.launch
文件中配置节点的私有参数,而在.cpp
文件中只需要在对节点句柄ros::NodeHandle
初始化时使用私有命名空间~
初始化,即可通过该句柄轻松创建在节点命名空间下的私有参数。
ros::NodeHandle nh(`~`);
nh.param<data_type>("read_name", default_name, default_value)
以上代码先创建了私有节点句柄,再使用其param()方法初始化参数。其中param()的第一个参数是从参数服务器(.launch
文件或终端
)中读取到的值(在参数服务器中配置该值时要使用名称"read_name"
来配置),传给data_type
类型的dafault_name
,若没有读到则用缺省值default_value
。
在.launch
文件中该私有参数要在节点内进行设置,若在节点以外设置则不是节点私有命名空间中的值,而是在全局命名空间中的值:
<launch>
<node name="name_demo" pkg="name_demo" type="name_demo" output="screen">
<!-- local serial -->
<param name="read_name" value="10" />
</node>
</launch>
3.ROS中使用定时器
ROS中的定时器可以让使用者在每隔一段时间里执行一次与定时器相连的回调函数。若回调函数是普通的函数,只需要像下面这样调用(类似发布主题):
void timerCallback(const ros::TimerEvent&)
{
...
}
...
ros::Timer timer = nh.createTimer(ros::Duration(0.1), timerCallback);
...
其中ros::Duration()
是时间周期,单位为s,timerCallback
是回调函数的名称,传入回调函数的地址。在上面的例子中定时器每隔0.1s调用一次timerCallback()
函数。
若在类中定义定时器及其回调函数,则需要多加一个对象的指针。
void Foo::callback(const ros::TimerEvent& event)
{
...
}
...
Foo foo_object;
ros::Timer timer1 = nh.createTimer(ros::Duration(0.1), &Foo::callback, &foo_object);
...
ros::Timer time2r = nh.createTimer(ros::Duration(0.1), &Foo::callback, this); #在函数体中
...
4.“make -j4 -l4” failed
在使用购买的硬件自带的ROS包时,通过catkin_make
编译出现"make -j4 -l4" failed
,看错误原因可以看到.../cfg/name.cfg:Permission denied
,即文件的权限不足,解决方法是使用chmod
命令,可以通过sudo chmod 777
+配置文件夹路径(…/cfg)来解决。若无法解决则通过更改单个文件的权限来解决,文件名称直接复制Permission denied
前面的名称即可。
5.CMake Error: The current CMakeCache.txt directory /home…build/CMakeCache.txt is different than…
使用别人的ROS包进行catkin_make
操作时会出现该种情况,原因是其原先编译过产生的文件目录位置与自己的工作空间位置不同,可以将工作空间中的build
文件删除。重新进行编译即可。
6.ROS消息不是最新版本/roslaunch启动错节点
在~/.bashrc
里没有添加当前工作空间的路径时,新开启一个终端可能会导致其启动的节点不是打开的工作空间里的节点(若存在其他同名ROS包的情况下),而订阅其他master上的消息时也可能会导致消息类型不对(更改过消息类型的情况下),此时应该使用source devel/setup.bash
将当前工作空间的路径加入环境变量中,或者使用sudo gedit ~/.bashrc
进入文件,在末尾添加export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:工作空间路径/src
。
7.ROS建立通信后从机无法单独打开roscore
要想从机能够运行节点,第一种方法是在主机使用roscore
或者roslaunch运行节点,保持主机的节点管理器一直是打开的状态;第二种方法是主机切换成本地状态,使用sudo gedit ~/.bashrc
打开文件,将
export ROS_HOSTNAME=master_name
export ROS_MASTER_URI=https://master_name:11311
改为
export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=https://localhost:11311
保存后打开终端,使用source ~/.bashrc
更新一下即可在本地打开roscore。