ROS-tf tree的學習筆記,夠常用
tf學習
學習完ROS wiki後做個簡單的筆記,連結ROS-wiki-tf-learning
以下的每點都是對應著連結中tutorial每個章節,遺忘不解時請翻看
1.tf釋出器
tf::TransformBroadcaster br; //建立一個釋出器
tf::Transform transform; //建立一個變換
//填入變換
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
transform.setRotation(q);
transform.setOrigin( tf::Vector3(position.x, position.y, 0.0) );
//呼叫函式釋出變換,需要的引數:變換,時間戳,參考座標系,自己的座標系
br.sendTransform(tf::StampedTransform(transform,
ros::Time::now(), "world", turtle_name));
2.tf監聽器
tf::TransformListener listener;
while (node.ok()){
tf::StampedTransform transform;
try{
//尋找要監聽的兩個座標系,使用transform輸出變換
listener.lookupTransform("/turtle2", "/turtle1",
ros::Time(0), transform);
}
catch (tf::TransformException ex){
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
}
turtlesim::Velocity vel_msg;
vel_msg.angular = 4.0 * atan2(transform.getOrigin().y(),
transform.getOrigin().x());
vel_msg.linear = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +
pow(transform.getOrigin().y(), 2));
3.加入座標frame
非常像tf釋出器
tf::TransformBroadcaster br;
tf::Transform transform;
ros::Rate rate(10.0);
while (node.ok()){
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
//參考一下tf釋出器,以turtle1為參考系,carrot1在y軸正向2m處
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));
rate.sleep();
}
4.tf中的時間戳
//在這行程式碼中,ros::Time(0)代表著最新的一幀變換
listener.lookupTransform("/turtle2", "/carrot1",
ros::Time(0), transform);
//如果想知道之前的變換,可以修改這個ros::Time(0),其實一般
//來說,不是ros::Time(0)就是其他我們想要的具體時間
**********************
listener.lookupTransform("/turtle2", "/carrot1",
ros::Time::now(), transform);
//這個不行,為啥呢,因為左邊監聽查詢需要幾個毫秒的時間,要求當
//前的now(),顯然不可能,會監聽失敗
try{
ros::Time now = ros::Time::now();
//可以使用waitForTransform監聽到以後時間點
listener.waitForTransform("/turtle2", "/turtle1",
now, ros::Duration(1.0));
listener.lookupTransform("/turtle2", "/turtle1",
now, transform);
利用這個時間戳,可以進行Time travel,監聽5s前的變換
try{
ros::Time past = ros::Time::now() - ros::Duration(5.0);
listener.waitForTransform("/turtle2", "/turtle1",
past, ros::Duration(1.0));
listener.lookupTransform("/turtle2", "/turtle1",
past, transform);
不僅是target frame可以使用過去的,source frame也可以
try{
ros::Time now = ros::Time::now();
ros::Time past = now - ros::Duration(5.0);
listener.waitForTransform("/turtle2", now,
"/turtle1", past,
"/world", ros::Duration(1.0));
listener.lookupTransform("/turtle2", now,
"/turtle1", past,
"/world", transform);
5.tf的除錯
可以使用tf的工具找到一些出錯的問題所在
比如想要知道某兩個變換,可以使用:
$ rosrun tf tf_echo turtle3 turtle1
如果不存在的話,會提示:
Exception thrown:Frame id /turtle3 does not exist! When trying to transform between /turtle1 and /turtle3.
The current list of frames is:
Frame /turtle1 exists with parent /world.
Frame /world exists with parent NO_PARENT.
Frame /turtle2 exists with parent /world.
也可以使用rosrun tf view_frames來生成pdf
$ rosrun tf view_frames
$ evince frames.pdf
還有一個工具:
$ rosrun tf tf_monitor turtle2 turtle1
可以看到這樣的資訊
RESULTS: for /turtle2 to /turtle1
Chain currently is: /turtle1 -> /turtle2
Net delay avg = 0.008562: max = 0.05632
Frames:
Broadcasters:
Node: /broadcaster1 40.01641 Hz, Average Delay: 0.0001178 Max Delay: 0.000528
Node: /broadcaster2 40.01641 Hz, Average Delay: 0.0001258 Max Delay: 0.000309
6.sensor message 使用tf轉換
這一節可能用的比較多,看了好一會兒才明白這個章節是什麼意思:比如位於機器前方的雷達資料如果需要轉換到機器人base座標系下,需要怎麼做?畢竟
相關文章
- KD-Tree 學習筆記筆記
- Link Cut Tree學習筆記筆記
- [學習筆記 #7] Link Cut Tree筆記
- 珂朵莉樹(Chtholly Tree)學習筆記筆記
- 演算法學習筆記(16):Link Cut Tree演算法筆記
- Go學習筆記-Gin常用功能Go筆記
- MongoDB 學習筆記之常用 shell 命令MongoDB筆記
- Linux學習筆記(一)--常用快捷鍵Linux筆記
- 林軒田機器學習技法課程學習筆記9 — Decision Tree機器學習筆記
- 【學習筆記】Segment Tree Beats/吉司機線段樹筆記
- numpy的學習筆記\pandas學習筆記筆記
- 常用埠及埠範圍(學習筆記)筆記
- pandas之常用基本函式學習筆記函式筆記
- Linux常用命令cp學習筆記Linux筆記
- Python學習筆記 String型別常用方法Python筆記型別
- 林軒田機器學習技法課程學習筆記11 — Gradient Boosted Decision Tree機器學習筆記
- 重學前端學習筆記(四)--div和span不是夠用嗎?前端筆記
- 深度學習筆記——常用的啟用(激勵)函式深度學習筆記函式
- Libev 官方文件學習筆記 – 03:常用 watcher 介面筆記
- Manim 學習筆記(一)--常用的幾個函式和操作筆記函式
- Wireshark學習筆記(一)常用功能案例和技巧筆記
- Java學習筆記7(Java常用類庫與工具 )Java筆記
- Nginx虛擬主機常用配置(學習筆記四)Nginx筆記
- Dubbo 學習筆記(五) 開發環境常用技巧筆記開發環境
- webpack v3 學習筆記(三) 打包css程式碼 和 Tree ShakingWeb筆記CSS
- Cypress 的學習筆記筆記
- 棧的學習筆記筆記
- 學習筆記筆記
- Matlab_GUI學習筆記(三)——常用物件的屬性之FigureMatlabGUI筆記物件
- 樹上啟發式合併(dsu on tree)學習筆記【理解+模板+例題】筆記
- 機器學習整合學習—Apple的學習筆記機器學習APP筆記
- 【學習筆記】初次學習斜率最佳化的程式碼及筆記筆記
- 【學習筆記】數學筆記
- 中斷的學習筆記筆記
- 最近的學習筆記YBTOJ筆記
- Cris 的 Docker 學習筆記Docker筆記
- Elasticsearch的配置學習筆記Elasticsearch筆記
- 學習JavaScript的原型筆記JavaScript原型筆記