1.查看參數列表 rosparam list
2.查詢參數rosparam get parameter_name,如rosparam get /rosdistro
3.設置參數rosparam set parameter_name parameter_value
4.運行turtlesim_node節點,再查看參數列表rosparam list,我們看到
/background_b
/background_g
/background_r
三個參數,將/background_b 設置成255我們沒看到變化,這是因為turtlesim_node節點沒有加載參數,而加載參數需要運行rosservice call /clear
5.需要引起高度注意的是,更新的參數值不會自動“推送”到節點。恰恰相反,如果節點關心它的一些或者所有參數是否改變,必須明確向參數服務器請求這些參數的值。同樣地,如果希望改變某個活躍節點的參數值,我們必須知道該節點如何或是否重新查詢參數。
6.使用C++獲取參數並賦值
void ros::param::set(parameter_name, input_value);
bool ros::param::get(parameter_name, output_value);
7.服務調用是雙向的,一個節點給另一個節點發送信息並等待響應,因此信息流是雙向的。作為對比,當消息發布后,並沒有響應的概念,甚至不能保證系統內有節點訂閱了這些消
息。
8.服務調用的基本流程:
一個客戶端(client)節點發送一些稱為請求(request)的數據到一個服務器(server)節點,並且等待回應。服務器節點接收到請求后,采取一些行動(計算、配置軟件或硬件、改變
自身行為等),然后發送一些稱為響應(response)的數據給客戶端節點。

9.列出所有服務rosservice list
10.查看某個節點的服務類型 要查看一個特定節點提供的服務,使用 rosnode info 命令:rosnode info node-name,如rosnode info turtlesim
11.查找提供服務的節點rosservice node service-name
12.查找服務的數據類型 rosservice info service-name
13.查看服務數據類型 當服務的數據類型已知時,我們可以使用rossrv 指令來獲得此服務數據類型的詳情:rossrv show service-data-type-name
14.從命令行調用服務; 為了直觀地觀察服務是如何工作的,你可以使用下面這條指令,從命令行中調用它們:rosservice call service-name request-content 例如
rosservice call /spawn 3 3 0 Mikey 這條服務調用的效果是在現有仿真器中,位置 ( x , y ) = (3,3) 處創建一個名為“Mikey”的新海龜,其朝向角度 θ = 0 。

15.聲明請求和響應的類型 就像消息類型一樣每一種服務數據類型都對應一個我們必須包含的相關 C++頭文件
16.創建客戶端對象 ros::ServiceClient client = node_handle.serviceClient<service_type>(service_name);這條指令有三個重要部分。
node_handle 是常用的 ros::NodeHandle 對象,這里我們將調用它的 serviceClient 方法。
service_type 是我們在上面頭文件中定義的服務對象的數據類型,在本例中,類型為 turtlesim::Spawn。
service_name 是一個字符串,說明了我們想要調用的服務名稱。再次強調,這應當是一個相對名稱,雖然也可以聲明為全局名稱。例子中使用的是相對名稱“spawn”。
17.創建請求和響應對象 一旦有了 ros::ServiceClient 實例,下一步就是創建一個請求對象來容納送往服務器的數據。我們上面包含的頭文件中分別定義了請求和響應的類 ,命名為Request和Response。這些類必須通過功能包名稱和服務類型來引用,如下所示:
#include <ros/ros.h>
//The srv class for the service.
#include <turtlesim/Spawn.h>
int main(int argc, char** argv) {
ros::init(argc, argv,"spawn_turtle");
ros::NodeHandle nh ;
// Create a client object for the spawn service . This
// needs to know the data type of the service and its
// name.
ros::ServiceClient spawnClient = nh.serviceClient <turtlesim::Spawn>("spawn") ;
// Create the request and response objects.
turtlesim::Spawn::Request req ;
turtlesim::Spawn::Response resp ;
// Fill in the request data members.
req.x = 2;
req.y = 3;
req.theta = M_PI/2;
req.name = "Pik" ;
// Actually call the service. This won't return until
// the service is complete .
bool success = spawnClient.call(req, resp);
// Check for success and use the response .
if(success) {
ROS_INFO_STREAM("Spawned a turtle named "<< resp.name);
} else {
ROS_ERROR_STREAM("Failed to spawn.") ;
}
}
運行結果:

18.創建一個服務器程序
編寫服務的回調函數 如同訂閱一樣,節點提供的每一個服務必須關聯一個回調函數,服務的回調函數原型如下:
bool function_name(
package_name::service_type::Request &req),
package_name::service_type::Response &resp)
) {
...
}
節點每次接收到一個服務請求,ROS 就執行一次回調函數。參數 Request 中包含了來自於客戶端的數據。回調函數的工作是給Response 對象的數據成員賦值。 Request 和 Response 數據類型與上面在客戶端使用的一致,因此需要相同的頭文件和相同的包依賴關系來編譯。回調函數返回 true 表明成功,返回 false 則表示失敗。
#include <ros/ros.h>
#include <std_srvs/Empty.h>
#include <geometry_msgs/Twist.h>
bool forward = true;
bool toggleForward (std_srvs::Empty::Request &req, std_srvs::Empty::Response &resp) {
forward = !forward;
ROS_INFO_STREAM("Now sending " <<(forward ? "forward" : "rotate") << "commands.");
return true ;
}
int main(int argc, char** argv) {
ros::init(argc, argv, "pubvel_toggle");
ros::NodeHandle nh ;
// Register our service with the master .
ros::ServiceServer server = nh.advertiseService ("toggle_forward", &toggleForward);
// Publish commands, using the latest value for forward ,
// until the node shuts down.
ros::Publisher pub = nh.advertise <geometry_msgs::Twist>("turtle1/cmd_vel", 1000);
ros::Rate rate(2);
while(ros::ok()) {
geometry_msgs::Twist msg;
msg.linear.x = forward ? 1.0 : 0.0;
msg.angular.z = forward ? 0.0 : 1.0;
pub.publish(msg);
ros::spinOnce();
rate.sleep();
}
}
在該例中, Request 和 Response 都使用了 std_srvs/Empty (空字符串)作為其數據類型,因此無需針對這兩個對象做任何數據處理。回調函數的唯一工作是切換一個稱為 forward 的全局布爾變量,用於管理在主函數中發布的速度消息
為了測試pubvel_toggle樣例程序 , 編譯它並且啟動turtlesim_node和pubvel_toggle兩個節點。兩者運行的同時,你可以通過從命令行調用 toggle_forward 服務來在平移和轉動中反復切換運動控制指令。rosservice call /toggle_forward, 反復執行rosservice call /toggle_forward得到試驗結果如下

19.錄制包文件 rosbag record -O filename.bag topic-names
20.rosbag record -a 記錄當前發布的所有話題的消息。
21.rosbag record -j 啟用包文件的壓縮
22.回放包文件 rosbag play filename.bag,這里可以加參數,比如-l 代表循環播放 -r 0.5 代表以0.5倍速度播放 -s 10 代表從第10秒播放
23.檢查文件包 rosbag info filename.bag
24.ROS的rosbag功能包里面也 提 供了名為record和play的可執行文件。和rosbag record 及rosbag play相比,這些程序有相同的功能,並且接受相同的命令行參數。所以可以
rosrun rosbag record -O filename.bag topic-names
rosrun rosbag play filename.bag
25.<node pkg="rosbag" name="record" type="record" args="-O filename.bag topic-names"/> launch 文件可以這么調用
