Robotics, ROS

How to solve ResourceNotFound: gazebo_worlds error when running simulated PR2 for gps?

When I tried to launch the simulated PR2 by

roslaunch gps_agent_pkg pr2_gazebo.launch

This error occurred:

 

gazebo_worlds_error

ros@ros-K401UB:~/research/gps/src/gps_agent_pkg$ roslaunch gps_agent_pkg pr2_gazebo.launch
... logging to /home/ros/.ros/log/10b10e84-bbe8-11e7-944c-82ea96c4b45e/roslaunch-ros-K401UB-7307.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

Traceback (most recent call last):
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/__init__.py", line 307, in main
 p.start()
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/parent.py", line 268, in start
 self._start_infrastructure()
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/parent.py", line 217, in _start_infrastructure
 self._load_config()
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/parent.py", line 132, in _load_config
 roslaunch_strs=self.roslaunch_strs, verbose=self.verbose)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/config.py", line 451, in load_config_default
 loader.load(f, config, verbose=verbose)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 746, in load
 self._load_launch(launch, ros_config, is_core=core, filename=filename, argv=argv, verbose=verbose)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 718, in _load_launch
 self._recurse_load(ros_config, launch.childNodes, self.root_context, None, is_core, verbose)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 682, in _recurse_load
 val = self._include_tag(tag, context, ros_config, default_machine, is_core, verbose)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 95, in call
 return f(*args, **kwds)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 625, in _include_tag
 default_machine, is_core, verbose)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 682, in _recurse_load
 val = self._include_tag(tag, context, ros_config, default_machine, is_core, verbose)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 95, in call
 return f(*args, **kwds)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 587, in _include_tag
 inc_filename = self.resolve_args(tag.attributes['file'].value, context)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/xmlloader.py", line 183, in resolve_args
 return substitution_args.resolve_args(args, context=context.resolve_dict, resolve_anon=self.resolve_anon)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/substitution_args.py", line 316, in resolve_args
 resolved = _resolve_args(resolved, context, resolve_anon, commands)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/substitution_args.py", line 329, in _resolve_args
 resolved = commands[command](resolved, a, args, context)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/substitution_args.py", line 142, in _find
 source_path_to_packages=source_path_to_packages)
 File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/substitution_args.py", line 188, in _find_executable
 full_path = _get_executable_path(rp.get_path(args[0]), path)
 File "/usr/lib/python2.7/dist-packages/rospkg/rospack.py", line 203, in get_path
 raise ResourceNotFound(name, ros_paths=self._ros_paths)
ResourceNotFound: gazebo_worlds
ROS path [0]=/opt/ros/indigo/share/ros
ROS path [1]=/home/ros/rosbuild_ws/package_dir
ROS path [2]=/opt/ros/indigo/share
ROS path [3]=/opt/ros/indigo/stacks
ROS path [4]=/home/ros/research/gps
ROS path [5]=/home/ros/research/gps/src/gps_agent_pkg

This happened because gazebo_worlds only exists in the version before ROS Groovy. So,  you can modify the launch file by rosed gps_agent_pkg pr2_gazebo_no_controller.launch :

<launch>
 <!-- Use the following for ROS hydro or later: <include file="$(find gazebo_ros)/launch/empty_world.launch"> -->
 <include file="$(find gazebo_ros)/launch/empty_world.launch">
 </include>
 <include file="$(find pr2_gazebo)/launch/pr2_no_controllers.launch" />
</launch>

After modification, the error changes. Obviously, this is another problem (import glob error).

import_glob_error

 

Advertisements
Robotics, ROS

How to solve caffe.hpp: No such file or directory error when compiling gps_agent_pkg?

When I was make -j the gps_agent_pkg package, I met this error:

caffe_error

[100%] Building CXX object CMakeFiles/gps_agent_lib.dir/src/util.cpp.o
Building CXX object CMakeFiles/gps_agent_lib.dir/src/neuralnetworkcaffe.cpp.o
Building CXX object CMakeFiles/gps_agent_lib.dir/src/caffenncontroller.cpp.o
/home/ros/research/gps/src/gps_agent_pkg/src/caffenncontroller.cpp:1:27: fatal error: caffe/caffe.hpp: No such file or directory
#include "caffe/caffe.hpp"
^
compilation terminated.
make[2]: *** [CMakeFiles/gps_agent_lib.dir/src/caffenncontroller.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from /home/ros/research/gps/src/gps_agent_pkg/src/neuralnetworkcaffe.cpp:1:0:
/home/ros/research/gps/src/gps_agent_pkg/include/gps_agent_pkg/neuralnetworkcaffe.h:10:27: fatal error: caffe/caffe.hpp: No such file or directory
#include "caffe/caffe.hpp"
^
compilation terminated.
In file included from /home/ros/research/gps/src/gps_agent_pkg/include/gps_agent_pkg/caffenncontroller.h:10:0,
from /home/ros/research/gps/src/gps_agent_pkg/src/robotplugin.cpp:16:
/home/ros/research/gps/src/gps_agent_pkg/include/gps_agent_pkg/neuralnetworkcaffe.h:10:27: fatal error: caffe/caffe.hpp: No such file or directory
#include "caffe/caffe.hpp"
^
compilation terminated.

And this error should be solved bymake distribute in the caffe dir. Aftermake distribute successfully in the caffe dir, I compiledgps_agent_pkg.

gps_success.png

Robotics, ROS

Solving rospkg import error for gps (guided policy search)

I was trying to install gps on Ubuntu 14.04. Yet, an import error of rospkg popped out when I was compiling the gps package.

This link is useful, for users who do not understand the system very well, it is useful to solve problem. For me, all I need to do is to add the

vim ~/.bashrc 
export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages 
source ~/.bashrc

The root cause of this error is that Python packages in /usr path do not exist in PYTHONPATH variable.

 

ROS

What is rospkg?

This package is part of Robot OS (ROS). It is a library for retrieving information about ROS packages and stacks. The rospkg Python module provides basic utilities for querying information about ROS packages, stacks, and distributions. There are several basic APIs: ROS environment, RosPack/RosStack, OS detection, and distributions.

Robotics, ROS

TB專欄 – Object Recognition Kitchen 透明物體辨識(演算法概念篇)

前言

這次的文章想要討論一個有趣的題目 – 透明物體辨識,這次的介紹先把題目限定在找出透明物體的位置,並把透明物體的輪廓找出來。

演算法功能簡介

我們的演算法目的是要找出影像中的透明物體,並把輪廓圈出來,就像下面這張圖一樣。

glasssegmentation

其實如果要更精確,應該把想要辨識哪些透明物體、在那些場景、辨識成功率希望有多高、如何定義辨識成功等都說清楚,不過這邊想先帶給大家一個初步的概念,就不討論得太過瑣碎。

演算法概念

為了達成這個功能,我們勢必要先收到彩色影像,所以肯定需要一台相機。不過下一個問題是,我們只需要用彩色影像資訊就能夠抓到透明物體的輪廓嗎? 還是我們需要其他的資訊 (也就是要不要考慮使用其他的 sensor) ?

要回答上面的問題,首先要來想想這個問題會什麼會困難。直覺上應該很容易發現,透明物體的顏色會隨著背景顏色不同而變,所以一般用顏色、紋理特徵來辨識的演算法都不太適用;此外,因為透明物體的邊界常常是模糊不清的,所以跟旁邊的物體很容易混在一起,造成輪廓抓錯。所以核心的問題就是,除了顏色、邊緣這些常用的特徵,我們還可以用什麼資訊來抓透明物體? 有一篇論文提出一個滿有趣的做法,他是使用 Kinect 的深度資訊,而且利用透明物體在 Kinect 的深度圖裡面會有破洞的特性,當成一個辨識的起點:

這個概念主要來自這篇論文 – Recognition and Pose Estimation of Rigid Transparent Objects with a Kinect Sensor,他提出的做法是,利用深度圖裡面有大塊破洞的位置,猜測這塊位置是透明物體,接著再根據這個線索找出透明物體的輪廓。

所以下一個問題就是,怎麼根據這個粗略的位置,把透明物體的輪廓切出來,論文中使用的方法是 Grabcut 演算法,這個演算法需要先有一個初始的前景跟背景線段,然後根據這個線段區分出前景跟背景,例如在下圖中,紅色線段是前景、藍色線段是背景,接著 Grabcut 演算法會根據顏色的近似程度還有距離關係,算出綠色框框內那些是前景、哪些是背景,然後把前景切出來。

1.PNG

切出來之後,目的就算是達成了!當然後續還有很多問題待討論(例如背景的複雜度、怎麼對深度影像中的破碎點做一些基本的處理等),不過今天先把範圍限縮在最上層的概念。

總結

演算法的應用真的是千奇百怪,但不管是簡單的演算法題目還是困難的演算法題目,解決的方法都是要看出問題的本質,然後再根據這個問題的特性去使用特定的步驟來解決。像這個範例就是巧妙地利用 Kinect 特性來處理透明物體的特徵很難抓的這個問題,畢竟會在 Kinect 的深度圖中固定呈現出破洞也算是一種特徵,至於更詳細的演算法流程或是程式碼的部分,就留待未來再介紹囉!

延伸閱讀

  1. 演算法介紹投影片
  2. ORK 的 transparent object recognition page
Robotics, ROS

TB 專欄 – 如何用 ROS Topic 控制機器人移動

前言

筆者今年在 COSCUP 2016 開了一個工作坊,教大家 ROS 的基礎以及 Gazebo 的基本概念,因為是第一次辦工作坊,還在學習怎麼拿捏時間跟內容,自覺並不是講得很完整,所以希望可以再提供一個簡單的範例,讓大家對 topic 傳輸要怎麼應用在控制機器人上會更有概念。

在工作坊講的內容 – Node, Topic and Service

這份投影片裡面主要就是帶大家實際操作建立 package、寫 ROS Node、寫 ROS Topic 和 Service 傳輸資料的步驟,讓大家熟悉怎麼撰寫 ROS 程式,並帶到一點點使用 Gazebo 的基本概念,不過比較可惜的是沒有一個範例讓大家實際體會怎麼裡利用投影片裡教的機制來控制機器人,所以補充下面的章節,讓大家可以透過 Topic 簡單地控制機器人移動。

如何使用 Turtle_sim 模擬一隻可以接收 geometry_msgs/Twist 型態

接下來,來講一下怎麼透過 Topic 傳輸機制來控制 Turtlesim 裡面的機器人。首先讓我們啟動 turtlesim 的程式,使用下列指令:

roscore
rosrun turtlesim turtlesim_node

啟動 Turtlesim 後,就會看到一個 GUI 介面,裡面有一隻可愛的烏龜。

turtle_sim_1

在 ROS 的世界裡,大家通常都會透過傳送命令到 /cmd_vel 這個 topic來控制機器人的移動。 我們可以先用 rostopic list 確認是不是已經有 /cmd_vel 這個 topic 存在於系統裡,理論上得到的結果如下:

ros@ros-K401UB:~$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

接下來就讓我們開始寫程式吧,首先建立一個 package 並開始寫後續的程式:

cd ~/catkin_ws/src
catkin_create_pkg coscup_follow_up rospy geometry_msgs
cd coscup_follow_up
vim src/circle_turtle.py

circle_turtle.py 的程式碼也很簡單,只是單純地送出一個 geometry_msgs/Twist 的 command,所以我們只要定期送出一個 command 就可以讓這隻可愛的烏龜移動了。


#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist

def circle_walker():
 pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10)
 rospy.init_node('cmd_publisher_node')
 rate = rospy.Rate(10) # 10hz

cmd = Twist()
 count = 0;

while not rospy.is_shutdown():
 cmd.linear.x = 1
 cmd.angular.z = 0.5

pub.publish(cmd)
 rate.sleep()

if __name__ == '__main__':
 try:
 circle_walker()
 except rospy.ROSInterruptException:
 pass

最後只要把程式跑起來,就可以看到結果了。

chmod +x src/circle_turtle.py
cd ../..
catkin_make
source devel/setup.bash
rosrun coscup_follow_up circle_turtle.py

turtle_sim_2

這邊要介紹一個簡單的機器人模型,也就是一般的兩輪機器人模型。在這種模型底下,其實你只能夠控制機器人的前後移動以及左右旋轉,所以程式中就只有指定 linear.x 跟 angular.z 的值 (因為就算其他值不給 0,也不會有任何反應)。

總結

這篇文章算是將 COSCUP 工作坊的內容再稍微延伸一下,讓大家比較有見樹又見林的感覺,不會寫了一堆 node ,卻都還沒有碰到機器人,雖然內容對於已經熟悉 ROS 的讀者不難,但希望透過這篇文章可以幫助更多想上手的讀者降低學習的難度。

ROS

TB 專欄 – 使用 Gazebo 模擬器控制機器人建立 2D 地圖

前言

ROS 很吸引人的一個地方在於,他跟模擬器 Gazebo 很好地結合在一起,讓使用者可以使用一台筆記型電腦就開始撰寫機器人程式,而且可以在筆電上看到程式執行的結果。模擬器裡的機器人不會撞壞、不會沒電,所以就算在程式設計過程中有錯誤,也不會有任何硬體成本的損失 (時間當然是會損失),而且很容易大量測試演算法,因為可以在模擬器中設置各種場景,而不需要一個很大的空間和昂貴的機器人。這篇文章會簡單介紹怎麼在 Gazebo 裡面啟動 PR2,並遙控他來建立一個 2D 的地圖。

啟動 Gazebo 跟 PR2

我的測試環境是 Ubuntu 14.04 + ROS Indigo,不過使用的指令都很 general,即便你使用其他版本,應該也不會有什麼問題。

首先我們確定已經安裝所需要的套件:

sudo apt-get install ros-indigo-gazebo-*

接下來在終端機輸入 gazebo 應該就可以成功啟動 Gazebo 模擬器。然後我們可以用現成的 package 啟動一個有 PR2 的空白模擬環境。

roslaunch pr2_gazebo pr2_empty_world.launch

Gazebo 裡面已經有很多現成的模型,選擇左邊的 Insert 頁籤,裡面就可以找到一些現成的模型,在這邊我先加入了 Cube 跟 Dumpster 的模型,加入後的結果如下圖:

1

對於機器人來說,最重要的第一個環節就是感知功能,他必須要可以感知環境中的資訊,才能做出相對應的動作。所以我們會先關心的就是 Gazebo 裡面的 PR2 機器人可不可以接收到環境中的資訊。

答案當然是可以的,我們可以透過 ROS 提供的 visualizer Rviz 來觀看 PR2 接收到的資訊,如果是已經熟悉 ROS 的讀者,想必對 Rviz 不陌生,只要開一個新的終端機,輸入 rviz 就可以啟動了。啟動之後,可以 Add 一個 Image 的顯示框,然後選擇現在可以看到的 topic,就可以看到 Gazebo 裡面的 PR2 看到的畫面。

rviz

啟動 gmapping package 建地圖

環境都已經啟動了,接下來就要開始建地圖啦! 這邊我們使用的工具是 gmapping ,首先我們在隨便一個路徑新增一個 launch 檔 –  vim pr2_build_map.launch 。

然後輸入這一串文字,儲存檔案後離開。

<launch>

  <!-- dynamic map generation -->
  <node name="gmapping_node" pkg="gmapping" type="slam_gmapping" respawn="false" >
    <remap to="base_scan" from="scan"/>
    <param name="odom_frame" value="odom_combined" />
  </node>

</launch>
然後可以用 roslaunch pr2_build_map.launch啟動。

啟動 gmapping 之後,我們還是透過 Rviz 來觀看地圖建立的狀態,這邊需要加入 Map 的顯示,然後 topic 選擇 /map 就好。地圖中的黑色線就是障礙物,淺灰色區域表示是可以走的無障礙物區域,深灰色則是未知區域。

rviz-2

讓我們近看一下 map 的 topic 要怎麼選:

rviz-3

但如果機器人不能移動的話,就只能顯示眼前看到的這一塊地圖。所以我們先使用簡單的遙控程式來控制 Gazebo 裡面的 PR2 移動。

這邊只要啟動 teleop_keyborad 就可以用鍵盤控制機器人移動:

roslaunch pr2_teleop teleop_keyboard.launch

WASD 四個按鍵分別代表前左後右四個方向的平移、QE兩個按鍵是原地旋轉,這邊要注意必須選到啟動 teleop_keyboard的視窗,按按鍵才有用。使用 teleop 來控制 PR2 走一走之後,就可以看得出我們已經使用 gmapping 建立了一個看起來有模有樣的地圖了。

2

如果你想要把地圖存起來,提供未來要做 Navigation 使用,或只是單純想留個紀念,可以用一個指令把地圖存起來 – rosrun map_server map_saver 。

 

總結

這篇文章跟大家簡單介紹怎麼使用 Gazebo 模擬器來模擬機器人,並利用他實際操作了一個小小的 SLAM 功能,也建出了自己的一張地圖。我們能利用 Gazebo 來做的事情當然遠不止於此,不過時間有限,我們下次見。

延伸閱讀

  1. gmapping 演算法原理簡介
  2. SDF 網站中文版