spacenav_node

複習一下,先玩玩spacenav_node,應該是經常使用CAD軟體的人,才有這種3D滑鼠吧。

我不打電動,所以沒有joystick,之前都是用鍵盤來控制turtlebot,這次就用3D滑鼠好了。主要參考這兩個網頁︰

http://library.isr.ist.utl.pt/docs/roswiki/spacenav_node(2f)Tutorials(2f)WritingTeleopNode.html

http://wiki.ros.org/joy/Tutorials/WritingTeleopNode

在控制turtlebot之前,照慣例還是先用turtlesim來練習,我自己的cpp是這樣的︰

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <sensor_msgs/Joy.h>

class TeleopTurtle
{
  public:
    TeleopTurtle();

  private:
    void joyCallback(const sensor_msgs::Joy::ConstPtr& joy);

    ros::NodeHandle nh_;
    int linear_, angular_;
    double l_scale_, a_scale_;
    ros::Publisher vel_pub_;
    ros::Subscriber joy_sub_;

};

TeleopTurtle::TeleopTurtle():
  linear_(1),
  angular_(2)
{
  nh_.param("axis_linear", linear_, linear_);
  nh_.param("axis_angular", angular_, angular_);
  nh_.param("scale_angular", a_scale_, a_scale_);
  nh_.param("scale_linear", l_scale_, l_scale_);

  vel_pub_ = nh_.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1);

  joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopTurtle::joyCallback, this);
}

void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
  geometry_msgs::Twist twist;
  twist.angular.z = a_scale_*joy->axes[angular_];
  twist.linear.x = l_scale_*joy->axes[linear_];
  vel_pub_.publish(twist);
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "teleop_turtle");
  TeleopTurtle teleop_turtle;

  ros::spin();
}

launch file :

<?xml version='1.0' ?>
<launch>

<!-- Turtlesim Node-->
  <node pkg="turtlesim" type="turtlesim_node" name="sim"/>

<!--spacenav node-->
  <node respawn="true" pkg="spacenav_node" type="spacenav_node" name="turtle_spacenav" >
    <remap from="spacenav/joy" to="joy" />
  </node>

  <param name="axis_linear" value="1" type="int"/>
  <param name="axis_angular" value="0" type="int"/>
  <param name="scale_linear" value="2" type="double"/>
  <param name="scale_angular" value="2" type="double"/>
  <node pkg="robot_spacenav" type="turtle_spacenav" name="teleop"/>
</launch>

我的pkg name : robot_spacenav, cpp name : turtle_spacenav.cpp
cpp檔案中header 是需要注意的,舊版本ROS與新版本有些不同。然後就是CMakeLists.txt,需要add executable、target link libraries.

實際上叫出turtlesim來測試,可以用,不過就是大材小用,只能前進後退、左轉右轉,這種3D滑鼠是有6 dof 的,因為我的code就跟tutorial一樣,只設定了四個參數嘛。
所以這個spacenav_node還可以有很多應用。

廣告

raspberry pi 2,ubuntu,raspbian

最近找到的作業系統有四個,其中有三個已經安裝了ROS indigo,img檔案:

PXFmini_ErleBrain2_03_03_20162015-04-06-ubuntu-trusty2015-10-14-ubuntu-trustyaristoteles

第一個是raspbian,其它都是ubuntu,這裡也有介紹如何在raspbian安裝ROS indigo:

http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Indigo%20on%20Raspberry%20Pi

不過我還是盡量採用簡單的方法。

目前遇到的問題都是wifi連線,當初買wifi dongle的時候沒有考慮到它的射程,因為turtlebot還有無人機會在設定的範圍內跑來跑去,所以到時候還是要再買射程較遠的wifi dongle.現在遇到的問題就先跳過去吧。

然後來整理一下爬文的心得,其中也包括鳥哥私房菜,花時間去那邊看看,對於netmask、gateway這一類東西可以有一些基本的理解。

通常,大部分教我們設定wifi的文章會提到wpa_supplicant.conf,實際上在PXFmini_ErleBrain2_03_03_2016這個系統上只要在/etc/network/interfaces做好設定(固定或浮動ip),就可以連上網路了,不過,要先按照這裡的說明把power_mgnt關掉,網路才不會自己斷線。當然,事情不會那麼順利的,雖然可以透過wifi上網,但是連線速度非常緩慢。另外,接上網路線的時候,輸入

apt-cache search ros-indigo

……它不會出現任何東西,這個img的版本是:Raspbian GNU/Linux 8 (jessie)、Linux 4.1.7-v7+、arm,如果要下載,它會要求輸入訂單號碼(我跟他們買了PXFmini飛控板),然後透過email傳送下載連結。erle robotics是一家西班牙公司,PXFmini_ErleBrain2_03_03_2016這個img預設的keyboard layout是"gb",不需要登入就會進入圖形介面,一開始的這個視窗pick_your_drone直接關掉就可以,當然,如果你買了他們家的產品,點選之後就可以開始玩,以後只要開機,它就會自己啟動ROS、autopilot……,然後就不會有"startx"這個動作了。……這是/home目錄的結構home_dir他們是以raspbian為基礎build出這個系統,所以有個方便的地方,只要用raspi-config就能擴充磁碟容量。

接下來這兩個就簡單帶過:

2015-04-06-ubuntu-trusty—>Ubuntu 14.04.2 LTS、Linux 3.18.0-20-rpi2、armv71

2015-10-14-ubuntu-trusty—>Ubuntu 14.04.3 LTS、Linux 3.18.0-25-rpi2、armv71

這兩個就沒有辦法用wifi上網,我確認過/etc/udev//rules.d/70-persistent.rules,裡面的地址跟wlan0的HWaddr是一致的,所以理論上應該不用動到這個檔案。輸入ifconfig,插上網路線可以看到wlan0的ip,拔掉網路線就不見了。……另外,我裝了Lubuntu,所以遇到vim顏色設定的問題,這邊的shell底色預設為黑色,深藍色的註解就看不清楚啦,可以參考這個網頁,下載desert256.vim、建立資料夾,然後在~/.vimrc加上

color desert256

這一列,就可以了。註解變成了比較亮的顏色: photo vim_color_zpsmkv0982b.png

最後是這個亞里斯多德:Ubuntu 14.04.2 LTS、Linux 3.18.0-20-rpi2、armv71,它的hostname是aristoteles,img檔也用這個名稱,這個檔案有15GB,16G的記憶卡裝不下,雖然有調整的方法,但是,拿一個32G的記憶卡來裝比較快。…它預設是義大利的鍵盤配置,startx之後,wow這個桌面真不錯,但是它的鍵盤不能改成US配置,在文字介面是沒問題的,進入圖形介面就變成預設的鍵盤配置,大概需要特殊的方法去改,反正圖形介面對我來講用處不大,不管他。

網路方面呢,即使插上網路線也連不上網路,通常下了ifconfig命令之後還可以看到HWaddr,但是這裡什麼都看不到,eth0、wlan0都沒有出現,那就這樣吧

sudo rm /etc/udev/rules.d/70-persistent-net.rules

把這個檔案砍了,接下來一切都恢復正常了,有線網路OK、無線網路OK,wifi_ok連上wifi,ping google.com,沒問題。安裝套件也沒問題。然後

apt-cache search ros-indigo-turtlebot

嗯,桌面版有的,這裡也有,接下來可以準備測試raspi-turtlebot了。……我發現它有network manager,單純只是好奇,進去圖形介面試用
network_mgr
別人家的網路訊號那麼強,擺在旁邊的分享器訊號卻很弱…
wpa_driver
換一個driver,再refresh,訊號就變強了,但是無論如何都連不上wifi,算了,這應該不重要。

順便記錄一下這個 photo remove_key_zpsy4yrc7ys.pngssh的時候如果遇到這個狀況,只要根據提示的訊息,把某一個line刪掉就好。

turtlebot note 8

 

看了一下以前的posts,turtlebot note 這個主題也把turtlebot_arm包在裡面了,所以,現在要寫turtlebot_arm_block_manipulation,自然就是“turtlebot note 8”了

基本上,turtlebot_arm的ik solver是可以用的,首先,來使用turtlebot_arm_kinect_calibration 吧,這種camera的特性是不能離被測物太近,所以我把turtlebot的脖子拉長
了,目前是這個樣子:
 photo block_manipulation_host_1_zpsiwd6lnnd.png

跟turtlebot note 7的時候已經不同了。然後用turtlebot_rviz_launchers 來確認它是不是真的“看到了”:
roslaunch turtlebot_bringup minimal.launch

roslaunch turtlebot_bringup 3dsensor.launch (這個檔案預設使用openni2,我的camera是xtion pro,所以要把openni2改成openni)

roslaunch turtlebot_rviz_launchers view_robot.launch (勾選 Registered PointCloud,確認可以看到整個 checkerboard)
 photo wifi_zpsribdt3ge.png

接下來的步驟:
roslaunch turtlebot_arm_bringup arm.launch

roslaunch turtlebot_bringup 3dsensor.launch

roslaunch turtlebot_arm_bringup cal_arm.launch

roslaunch turtlebot_arm_kinect_calibration calibrate.launch

cal_arm.launch是自己寫的,檔案在此:
https://drive.google.com/open?id=0B_5mtlyMHvbqZ3FDX2RRLUdnM2s

其它部分就跟這個tutorial差不多:
http://wiki.ros.org/turtlebot_kinect_arm_calibration/Tutorials/CalibratingKinectToTurtleBotArm
只是我不太確定On-board跟Off-board具體上會有什麼差異,雖然我是用“external kinect(xtion pro)”但是xtion pro是裝在turtlebot上面、也有完整的urdf模型…
現在跑block_manipulation_demo的時候,我是先執行下面這一串東西:
 photo 994344bb-09bb-423b-8735-886b61593bb8_zpsp1jqqfva.png

具體的步驟如下:
roslaunch turtlebot_arm_block_manipulation block_manipulation_moveit.launch

rosrun tf static_transform_publisher …………….

roslaunch turtlebot_arm_block_manipulation block_manipulation_demo.launch

另外就是,indigo版本比較依賴moveit,所以目前是把turtlebot跟turtlebot_arm分開,這樣比較單純,如果要把他們合體,在moveit裡面joint、ik solver如何定義,還要研究一下。

最後,我錄了兩個影片,一個是robot的動作,一個是Rviz的畫面,這兩個影片並不是同一次的抓取動作,當然這兩次的抓取都沒有成功,我想應該是調整一下參數就可以搞定了:

kamerider筆記之二

上一篇筆記,到了最後那個字串“hello”沒有被print出來,為什麼呢?其實對我來講也不是那麼重要,只要實作ok,也懶得去追究。
kamerider tutorial在軟體部分有8個步驟,這一篇從第四個步驟開始,不過我怎麼看都覺得他寫得有點怪,所以就不管他,反正安裝arduino沒什麼困難,裝好之後把arbotix-master裡面的東西按照下圖的位置放著就好。 繼續閱讀「kamerider筆記之二」

kamerider筆記之一

我終於放棄了,雖然turtlebot_arm這個package有一個能在moveit!裡面使用的ik solver,但是一直玩不起來,也許單純玩那隻手臂是OK的吧,如果再加一個mobile base,就不知道怎麼玩了。
畢竟也沒見過相關的demo影片,只有groovy版的turtlebot_arm有一些實作的影片,不過,kamerider算是很完整的project,雖然他是在hydro環境開發,但是不使用moveit!…
反正就是一隻4 dof的手臂嘛,以後弄一隻6或7 dof的手臂再來玩moveit!好了。 繼續閱讀「kamerider筆記之一」

turtlebot note 6

關於ikfast的plugin,已經知道問題出在哪裡,重點是move_group crash,而且這個問題如果不解決,也確實會影響到後面的練習。

首先,一直看到“no joint corresponding to base_footprint”這個訊息,就覺得不爽,在不知道真正原因的情況下,我一直以為我的urdf有問題,所以就乖乖地來寫一個urdf吧,實際上並沒有從零開始寫,既然我在turtlebot上面裝了一些東西,那就直接修改它的urdf.

turtlebot裡面沒有純urdf的格式,and,這個package整合了數個相關package,最後我選擇kobuki_description裡面的kobuki.urdf.xacro,把自己加裝的東西都寫到這個檔案裡面,再使用xacro.py產生一個純urdf檔案給moveit!–>如下圖: photo bot_kobuki_zpseexd01vy.png

當然這並沒有解決move_group crash的問題,不過這個做法也有好處,比如說gyro、cliff sensor都已經定義好了,對於往後相關的應用比較方便。

然後,move_group的問題,其實已經被修正了,但是我安裝moveit!的時候是用比較方便的方式:apt-get install

解決方法也很簡單,在github找到moveit_core,下載之後放到

~/catkin_ws/src

再把catkin_ws編譯一次就好了,這樣move_group的問題就解決了。

還有一個在moveit!裡面要不要設定passive_joint的問題,書上的說法是視情況而定,他的範例也沒有用到passive_joint,所以我就沒有特別注意,但是turtlebot_arm_arm_kinematics/IKFastKinematicsPlugin有規定joint的數量就是5個,所以這裡必須要給它一個passive_joint,也就是把“arm”這個group的tip_link(它本來就是個dummy link)設定為passive_joint,這樣就符合5個joint的條件了。

總算有一點進度了,接下來就是參考範例,寫一個python程式來控制機器人了…