(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 | 机器人 |