Gazeboでkobukiを二台出す

Xubuntu12.04上のHydro上でkobukiを二台だす.

前提として
http://wiki.ros.org/kobuki_gazebo
でkobukiが一台出せているとします.

同じ感じでlaunchファイルを作ります.
ワークスペース

catkin_create_pkg hoge
roscd kobuki_gazebo

してkobuki_gazeboに移動,以下をhogeへコピーします
/launch/includes/*.xml
/launch/turtlebot_empty_world.launch
/worlds/empty.world

package.xmlのrun_dependをコピーします.

これで

roslaunch hoge turtlebot_empty_world.launch

すると一台のkobukiが出るはず.
まぁ,この時点ではincludes以下のxmlは参照してないのですが.

/launch/turtlebot_empty_world.launch
を以下のように編集します.
findの参照先に注意してください.

<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="use_sim_time" value="true"/>
    <arg name="debug" value="false"/>
    <arg name="world_name" value="$(find hoge)/worlds/empty.world"/>
  </include>

  <arg name="base"      value="$(optenv TURTLEBOT_BASE kobuki)"/> <!-- create, roomba -->
  <arg name="battery"   value="$(optenv TURTLEBOT_BATTERY /proc/acpi/battery/BAT0)"/>  <!-- /proc/acpi/battery/BAT0 --> 
  <arg name="stacks"    value="$(optenv TURTLEBOT_STACKS hexagons)"/>  <!-- circles, hexagons --> 
  <arg name="3d_sensor" value="$(optenv TURTLEBOT_3D_SENSOR kinect)"/>  <!-- kinect, asus_xtion_pro --> 

  <group ns="r1">
    <include file="$(find hoge)/launch/includes/$(arg base).launch.xml">
      <arg name="base" value="$(arg base)"/>
      <arg name="stacks" value="$(arg stacks)"/>
      <arg name="3d_sensor" value="$(arg 3d_sensor)"/>
      <arg name="robot_name" value="r1"/>
      <arg name="init_pose" value="-x 1 -y 1 -z 0"/>
    </include>
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
      <param name="publish_frequency" type="double" value="30.0" />
    </node>
  </group>
  
  <group ns="r2">
    <include file="$(find hoge)/launch/includes/$(arg base).launch.xml">
      <arg name="base" value="$(arg base)"/>
      <arg name="stacks" value="$(arg stacks)"/>
      <arg name="3d_sensor" value="$(arg 3d_sensor)"/>
      <arg name="robot_name" value="r2"/>
      <arg name="init_pose" value="-x 1 -y 4 -z 0"/>
    </include>
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
      <param name="publish_frequency" type="double" value="30.0" />
    </node>
  </group>
</launch>

/launch/includes/kobuki.launch.xml
を以下のように編集します

<launch>
  <arg name="base"/>
  <arg name="stacks"/>
  <arg name="3d_sensor"/>
  <arg name="robot_name"/>
  <arg name="init_pose"/>

  <arg name="urdf_file" default="$(find xacro)/xacro.py '$(find turtlebot_description)/robots/$(arg base)_$(arg stacks)_$(arg 3d_sensor).urdf.xacro'" />
  <param name="robot_description" command="$(arg urdf_file)" />

  <!-- Gazebo model spawner -->
  <node name="spawn_turtlebot_model" pkg="gazebo_ros" type="spawn_model"
        args="$(arg init_pose) -unpause -urdf -param robot_description -model $(arg robot_name)"/>

  <!-- Velocity muxer -->
  <node pkg="nodelet" type="nodelet" name="mobile_base_nodelet_manager" args="manager"/>
  <node pkg="nodelet" type="nodelet" name="cmd_vel_mux"
        args="load yocs_cmd_vel_mux/CmdVelMuxNodelet mobile_base_nodelet_manager">
    <param name="yaml_cfg_file" value="$(find turtlebot_bringup)/param/mux.yaml" />
    <remap from="cmd_vel_mux/output" to="mobile_base/commands/velocity"/>
  </node>

  <!-- Bumper/cliff to pointcloud (not working, as it needs sensors/core messages) -->
  <include file="$(find turtlebot_bringup)/launch/includes/kobuki/bumper2pc.launch.xml"/>
</launch>

これで

roslaunch hoge turtlebot_empty_world.launch

すると二台のkobukiが出るはず.
要はそれぞれのモデルに名前をつけてくださいという,チュートリアルにもあったことです.

動かすには以下の様な感じでscriptsを作ってrosrunすればいいです.
dependencyにrospyとgeometry_msgs追加してください.

import rospy
from geometry_msgs.msg import Twist

if __name__=="__main__":
        rospy.init_node('it')

        p=rospy.Publisher('r1/commands/velocity',Twist)
        twist = Twist()
        twist.linear.x = -0.5;
        twist.linear.y = 0.0;
        twist.linear.z = 0.0;

        twist.angular.x = 0.0;
        twist.angular.y = 0.0;
        twist.angular.z = 0.0;
        for i in range(10):
                p.publish(twist);
                rospy.sleep(0.5)

フォーマッタとか色々設定してないので汚いのは容赦してほしい.
仮想マシン上のそういう設定全くやる気が起きないんだよなぁ….

Install ROS on MacOS X Mavericks

ROS hydroをMacOS X Mavericks上にインストールする.


諦めました.
これがなんとかならんと無理です.
Mavericks周りは今色々直してくれてる最中らしいのでもう少し待ちましょう!
https://github.com/orocos/orocos_kinematics_dynamics/pull/4

以下諦めたログ

homebrewを使用したインストールが選択できるのでhomebrewを使用する.

大まかな流れはインストレーションマニュアルに従う.
http://wiki.ros.org/hydro/Installation/OSX/Homebrew/Source

コケた時の対処法

Resolving Dependenciesの前に

Resolving Dependenciesで

rosdep install --from-paths src --ignore-src --rosdistro hydro -y

するが,これで色々pip installされる.ここでコケる.
こけたらbrew install -v hogeする.

pip install -U PIL

PILのコンパイル時にfreetypeが無いと言われる.brewfreetype入れるとfreetype2になるせい.
http://stackoverflow.com/questions/20325473/error-installing-python-image-library-using-pip-on-mac-os-x-10-9

ln -s /usr/local/include/freetype2 /usr/local/include/freetype

をすると通る.

pip install -U pcl

pclなんてFormulaは無いと言われる.

brew tap ros/hydro

をしていないため.手順書ちゃんと読みましょう.

brew install ogre

brew install -v ogreするとfreetypeでコケている.
freetypeのリンクにコケる.uninstall & installしたら通った.
よくわからん.
https://github.com/osrf/homebrew-simulation/issues/4

brew install gazebo

最新のgazeboだとfixされているらしいので

brew install gazebo --HEAD

をする.
https://github.com/osrf/homebrew-simulation/issues/5

brew install PyQwt

PyQwtがpyqtの新しい設定フォーマットに追従していないのが原因.
pyqtをダウングレードしてPyQwtを入れる.
https://github.com/Homebrew/homebrew/issues/25224
http://sourceforge.net/p/pyqwt/bugs/12/

rcssserver3d on MacOSX MountainLion

rcssserver3dのmake
http://sourceforge.net/projects/simspark/

現在の最新は0.6.7だがこれだと以下のエラーがでる

Linking CXX shared module soccer.so
Undefined symbols for architecture x86_64:
  "boost::system::system_category()", referenced from:
      __GLOBAL__I_a in export.cpp.o
      __GLOBAL__I_a in agentstateperceptor.cpp.o
      __GLOBAL__I_a in ballstateaspect.cpp.o
      __GLOBAL__I_a in singlematiniteffector.cpp.o
      __GLOBAL__I_a in staticmeshiniteffector.cpp.o
      __GLOBAL__I_a in pantilteffector.cpp.o
      __GLOBAL__I_a in restrictedvisionperceptor.cpp.o
      ...
  "boost::system::generic_category()", referenced from:
      __GLOBAL__I_a in export.cpp.o
      __GLOBAL__I_a in agentstateperceptor.cpp.o
      __GLOBAL__I_a in ballstateaspect.cpp.o
      __GLOBAL__I_a in singlematiniteffector.cpp.o
      __GLOBAL__I_a in staticmeshiniteffector.cpp.o
      __GLOBAL__I_a in pantilteffector.cpp.o
      __GLOBAL__I_a in restrictedvisionperceptor.cpp.o
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [plugin/soccer/soccer.so] Error 1
make[1]: *** [plugin/soccer/CMakeFiles/soccer.dir/all] Error 2
make: *** [all] Error 2

svnのr370だとmakeできました.
http://sourceforge.net/p/simspark/svn/370/tree/trunk/

make rcssserver on MacOS X MountainLion

rcsserverをMacOSXでmakeする
http://sourceforge.net/projects/sserver/


boostのインストール

brew install boost

gccのインストール

brew tap homebrew/versions
brew install gcc49

configure

./configure CC=/usr/local/bin/gcc-4.9

make

make

install

make install

Flashインストール時に「続行するには次のアプリケーションを終了してください」でSafariが消えない

MacOSXでFlashアップデート時に「続行するには次のアプリケーションを終了してください」でDockにSafariが無いのに実行されていることになっているとき,MenuTab for facebookなどの常駐を終了させる.

すごいHASKELLたのしく学ぼう!とLearn You a Haskell for Great Good!

KindleですごいHASKELLたのしく学ぼう!が売っていたので買った.
日本語訳である.

私が持っているAndroid tabletはioPad6Lといういわゆる中華パッドで,そのせいか乗数やその他の数学記号がうまく処理できず文字化けの豆腐が表示されている.
iPhone版のKindleアプリではちゃんと表示されているし,まぁフォントとかそのへんだと思う.

そんなこともあり英語版のLearn You a Haskell for Great Good!を読むこととなった.
実は英語版は公開されている.
http://learnyouahaskell.com/

英語版と日本語訳を読むと日本語訳は訳注が追加されていることに気づく.
例えば以下のページの末尾,直角三角形の三辺の長さを求める問題.
http://learnyouahaskell.com/starting-out

We'll also modify this function by taking into consideration that side b isn't larger than the hypothenuse and that side a isn't larger than side b.

と正しい直角三角形の性質について説明されている.
ここが日本語訳では

次に,ピタゴラスの定理(a^2+b^2==c^2)が成り立つかを調べる叙述を追加して,直角三角形でないものをフィルタしましょう.また,aが斜辺cを超えないように,bがaを超えないように,それぞれ変更を加えます.

ここでコードを挟み以下に続く.以下は英語版では無い.

リストのレンジをどんなふうに変更したかに注目してください.bが斜辺より長いような不要なトリプルを調べないような変更をしています(正しい直角三角形は必ず斜辺が一番長いのです).
また,辺bが辺aを超えないようにしています.このように変更しても問題ありません.なぜならば,

以下2ページ位続く.

こんなかんじで日本語訳のほうが比較的親切である.
無料で公開してるのが2800円するの…と思ったが日本語訳買って損はしないんじゃないかなぁと思う.

#豆腐で表示されるしiPad買うか〜