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。

参考

  1. Linux /dev目录详解和Linux系统各个目录的作用
  2. chmod命令用法详解-chmod修改目录权限
  3. ROS param 使用说明
  4. ROS向节点传递参数
  5. ROS Names
  6. ROS Timer
  7. CMake Error: The current CMakeCache.txt directory is different…
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值