(ROS探索5)tf小試、ROS中msg的調用(python)、ROS四元數姿態角轉換、LaserScan Filter chian的使用

最近因為要做無人機隧道的穩定,沒有GPS那種,因此開始在ROS的方針環境中和很多東西打上了交道。這裡簡單記錄一下,以後可能忘了還有的查。

1.ROS中msg的調用(python)和python程序的啟動和launch安裝

ROS與Python入門教程-寫簡單發布器和訂閱器 - 創客智造

ROS/Tutorials/WritingPublisherSubscriber(python) - ROS Wiki

rospy_tutorials/Tutorials/Makefile - ROS Wiki

ROS/Tutorials/CreatingPackage - ROS Wiki

首先講講python的啟動吧,python和c不一樣,不需要變異就能運行。那麼python的node是怎麼在ros中運行的呢?

首先是編寫py程序,然後放到一個文件夾中,然後在Cmakefile裡頭寫上下面這個,使用rosrun找到py的程序了,別忘了用chmod u+x xxx.py給py的程序運行許可權。

install(PROGRAMSn scripts/data_process_node.pyn DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}n)n

順帶一提ros中的py程序第一行是解釋器的位置。

如果你還寫了launch,想用roslaunch啟動一個包裡頭的launch文件,那麼你需要在cmakefile中加上下面這一行。

## Mark other files for installation (e.g. launch and bag files, etc.)ninstall(FILESn data_process.launchn# # myfile2n DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}n)n

接下來如果你想ROS已經為你準備好的消息,那麼你需要以下幾步,首先是在cmakefile中添加你想調用的msg(好像不弄也行,好吧)

find_package(catkin REQUIRED COMPONENTSn rospyn roscppn std_msgsn geometry_msgsn sensor_msgsn laser_geometryn message_generationn tfn)ncatkin_package(n CATKIN_DEPENDS rospy std_msgs sensor_msgs geometry_msgs message_runtimen)n

其中msg就是我想調用的msg

然後在package.xml中添加

<build_depend>geometry_msgs</build_depend>n<build_export_depend>geometry_msgs</build_export_depend>n<exec_depend>geometry_msgs</exec_depend>nn<build_depend>sensor_msgs</build_depend>n<build_export_depend>sensor_msgs</build_export_depend>n<exec_depend>sensor_msgs</exec_depend>nn<build_depend>std_msgs</build_depend>n<build_export_depend>std_msgs</build_export_depend>n<exec_depend>std_msgs</exec_depend>n

然後在node的代碼中加入類似代碼

from geometry_msgs.msg import PoseStampedn

之後去ros wiki 查一下msg的定義用 『 . 』就能很容易的訪問msg的數據了,舉例:

angle_min = laser.angle_minn

laser的類型是LaserScan

sensor_msgs/LaserScan Documentation

如果有自己想創建msg的,可以按照創客智造鏈接中給出的方法來。

2.tf小試、ROS四元數姿態角轉換

Quaternions - Visualisation 很好玩的小工具

tf - ROS Wiki

ros中很多的時候需要對四元數進行轉換成歐拉角,然後機器人不可避免的需要各種坐標系的轉換,ros提供了很多方便的工具tf大法就是其中之一。

我的tf使用就是兩個,一個是靜態的坐標轉換。直接寫在launch文件里,name隨便取,arg對應x y z 和歐拉角(順序不記得了,官網有)的偏移,也就是從rplidar_link移動旋轉多少到iris_rplidar::iris::base_link,這裡我指的是激光雷達和無人機。

<node pkg="tf" type="static_transform_publisher"n name="tf_ground" args="0 0 0 0 0 0 rplidar_link iris_rplidar::iris::base_link 100">n </node>n

動態使用是參考官方的歷程弄的。主要就是把激光雷達的數據根據無人機的里程計動態映射到地面上(world)

br = tf.TransformBroadcaster()nbr.sendTransform((odom.pose.pose.position.x, odom.pose.pose.position.y, odom.pose.pose.position.z),n qn,n rospy.Time.now(),n rplidar_link,n "world")n

官方常式:

tf/Tutorials - ROS Wiki

Writing a tf broadcaster (Python)

歐拉角和四元數的轉換我也用了tf下面的工具包

引用

from tf.transformations import quaternion_from_euler, euler_from_quaternionn

使用例子

qn = [odom.pose.pose.orientation.x, odom.pose.pose.orientation.y, odom.pose.pose.orientation.z, odom.pose.pose.orientation.w]n (roll,pitch,yaw) = euler_from_quaternion(qn)n

順帶一提,官方bug,這個工具包用py3的時候就會報錯,最近官方github上面給出了解決方法,github搜索roscore找到geometrt2這個解決了,但是由於我沒看到kinetic的版本(或者說我不會用),我索性就用了py2.7,反正沒影響。

tf2_py cannot work with python3 · Issue #259 · ros/geometry2

順帶一提,numpy也有個工具包,但是我解算的數據都是錯的,沒搞懂,還望大家指點。

moble/quaternion

3.LaserScan Filter chian的使用

ROS官方想的還是很詳細的,給出了laser濾波器,而且很簡單!

laser_filters - ROS Wiki

簡單來說,就是去上面這個網址看看你想要啥濾波器,然後寫到launch裡頭,順帶寫個參數文件就搞定了,不需要編程!

launch裡頭加node

<node pkg="laser_filters" type="scan_to_scan_filter_chain"n name="laser_filter">n <rosparam command="load" file="$(find data_process)/launch/data_process_config.yaml" />n <remap from="/scan" to="/laser/scan" />n </node>n

config.yaml

scan_filter_chain:

- name: angle

type: LaserScanAngularBoundsFilterInPlacen params:n lower_angle: -2.356n upper_angle: -0.785n- name: rangen type: LaserScanRangeFiltern params:n use_message_range_limits: falsen lower_threshold: 0.3n upper_threshold: 30n lower_replacement_value: -.infn upper_replacement_value: .infn

這裡我根據需求用了兩個filter,然後/laser/scan是我原來laser發布的topic,這個濾波器會自動發布一個/scan_filtered

訪問去吧!

推薦閱讀:

ROS 1.0 和 ROS 2.0 的前世、今生、安裝使用說明與資料匯總
小朋友學ROS機器人——使用Scratch2和ROS進行機器人圖形化編程學習
【ROS教程 007】3D建模與模擬
怎樣用ROS打造機器人建圖導航
ROS和ROS2.0現在到底該學習哪個呢?

TAG:机器人操作平台ROS | 机器人 |