【ROS-Stage】Stage機器人仿真實驗(一)

環(huán)境:64位 ubuntu16.04灾搏,代碼見:https://github.com/cr19941016/ROS_stage_test

  1. 安裝ROS
    更換軟件源(設置 --> Software & Update)洽蛀,會下載的更快死讹。
    stage_ros仿真包是ros自帶的岂却,安裝完之后就有了泉唁。
  2. 按照教程雷酪,創(chuàng)建一個工作空間
    記得添加 source:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc 
  1. 按照教程,創(chuàng)建ROS程序包
  2. 下載 turtlebot_simulator,將里面的 /turtlebot_stage/maps/ 復制出來加叁,放在新建的程序包文件夾中(beginner_tutorials)倦沧。
  3. 共享內(nèi)存用于ROS節(jié)點和非ROS進程之間的通信。
    創(chuàng)建共享內(nèi)存區(qū)的數(shù)據(jù)結構它匕,存放在 sharemem.h中刀脏。
#ifndef SHAREMEM_H
#define SHAREMEM_H
struct ShareMem
{
  double x; //  x方向的速度(前后)
  double y; //  y方向的速度(左右)
  double z; //  旋轉
};
#endif
  1. 新建talker節(jié)點。
    創(chuàng)建共享內(nèi)存超凳、監(jiān)聽共享內(nèi)存區(qū)域的速度變化和發(fā)布速度話題。
/****************************************
*文件名: talker.cpp            *
*簡介: 鏈接非ROS進程和ROS節(jié)點的ROS節(jié)點   *
*BY: CR (qq: 414481619)         *
*創(chuàng)建時間: 2018.10.09           *
****************************************/

#include "ros/ros.h"
#include <geometry_msgs/Twist.h>

#include <iostream>
#include <stdio.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/types.h>
#include <stdlib.h>
#include <pthread.h>

#include "sharemem.h"

using namespace std;


int main(int argc, char **argv)
{

  ros::init(argc, argv, "talker");
  ros::NodeHandle n;
  ros::Publisher chatter_pub = n.advertise<geometry_msgs::Twist>("cmd_vel", 1000);

  ros::Rate loop_rate(100); // 100Hz的定時器

  
  ShareMem _ShareMem;
  // 創(chuàng)建共享內(nèi)存 耀态,相當于打開文件轮傍,文件不存在則創(chuàng)建
  int shmid = shmget((key_t)2333, sizeof(_ShareMem), 0666|IPC_CREAT);  
  if(shmid==-1)
  {
    perror("shmget err");
    return errno;
  }
  cout<<shmid<<endl; 

  // 將共享內(nèi)存段連接到進程地址空間, 第二個參數(shù)shmaddr為NULL,核心自動選擇一個地址
  ShareMem *shareMem = (ShareMem *)shmat(shmid, NULL, 0); 
  if (shareMem == (void *)-1 )
  {
    perror("shmat err");
    return errno;
  }
  
  shareMem->x = 0;  
  shareMem->y = 0; 
  shareMem->z = 0; 

  pthread_mutex_t mutex;  
  pthread_mutex_init(&mutex, NULL);
  while (ros::ok())
  {
    geometry_msgs::Twist cmdvel_msg; 

    pthread_mutex_lock(&mutex);
    cmdvel_msg.linear.x = shareMem->x;  
    cmdvel_msg.linear.y = shareMem->y; 
    cmdvel_msg.angular.z = shareMem->z; 
    pthread_mutex_unlock(&mutex);
    chatter_pub.publish(cmdvel_msg);

    ros::spinOnce();

    loop_rate.sleep();
  }
  pthread_mutex_destroy(&mutex);
  shmdt(shareMem);  //將共享內(nèi)存段與當前進程脫離
  shmctl(shmid, IPC_RMID, NULL); //IPC_RMID為刪除內(nèi)存段
  return 0;
}

在beginner_tutorials 的 CMakeLists.txt 中添加:

include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

在終端中:

cd ~/catkin_ws
catkin_make
  1. 創(chuàng)建launch文件
    新建launch文件夾首装,創(chuàng)建stage_tast.launch文件
<!--   
  stage_test 
  - stage_ros
  - talker
 -->
<launch>  
  <arg name="world_file"     default=" $(find beginner_tutorials)/maps/stage/maze.world"/>  

  <node pkg="stage_ros" type="stageros" name="stageros" args="$(arg world_file)">  
    <param name="base_watchdog_timeout" value="0.5"/>  
    <remap from="odom" to="odom"/>  
    <remap from="base_pose_ground_truth" to="base_pose_ground_truth"/>  
    <remap from="cmd_vel" to="cmd_vel"/>  
  </node>  

  <node pkg="beginner_tutorials" type="talker" name="talker">
  </node>  

</launch>  
  1. 創(chuàng)建速度控制父類
    便于其他速度控制類的編寫创夜,其他速度控制類只需要繼承父類的框架,完成自己的mainloop()就好仙逻。
/****************************************
*文件名: VelControl.h          *
*簡介: 速度控制父類         *
*BY: CR (qq: 414481619)         *
*創(chuàng)建時間: 2018.10.09           *
****************************************/

// this code ism't in ros system 

#include <iostream>
#include <stdio.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/types.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#include "sharemem.h"

using namespace std;

class VelControl
{
public:
    VelControl();
    ~VelControl();
    void mainloop();
protected:
    ShareMem *shareMem;
    pthread_mutex_t mutex;  
    void writeVel(double x, double y, double z);
};

VelControl::VelControl()
{
    pthread_mutex_init(&mutex, NULL);

    // 綁定共享內(nèi)存
    int shmid = shmget((key_t)2333, 0, 0);  
    if(shmid != -1)
    {
        shareMem =(ShareMem *)shmat(shmid, NULL, 0);
        cout<<shmid<<endl;
    }
    else
    {
        cout<<"ERROR: stage_test haven't started"<<endl;
        exit(1);
    }
}

VelControl::~VelControl()
{
    shmdt(shareMem);  //將共享內(nèi)存段與當前進程脫離
    pthread_mutex_destroy(&mutex);
}


void VelControl::writeVel(double x, double y, double z)
{
    pthread_mutex_lock(&mutex);
    shareMem->x = x;  
    shareMem->y = y; 
    shareMem->z = z;
    pthread_mutex_unlock(&mutex);
}
  1. 這是一個鍵盤控制速度的例程(非常粗糙驰吓,僅供參考)
/****************************************
*文件名: keyboard_not_ros.cpp      *
*簡介: 速度控制例程         *
*BY: CR (qq: 414481619)         *
*創(chuàng)建時間: 2018.10.09           *
****************************************/

// this code isn't in ros system 

#include "VelControl.h"

using namespace std;

class keyboard_not_ros:VelControl
{
public:
    void mainloop();
};

void keyboard_not_ros::mainloop()
{
    char c = 'a';
    while(c!='q')
    {
        cout<<"please input a letter"<<endl;
        c = getchar();
        getchar();
        double x,y,z;
        switch(c)
        {
            
            case 'W':
            case 'w':
                x = 1;
                y = 0;
                z = 0;
                break;
            case 'S':
            case 's':
                x = -1;
                y = 0;
                z = 0;
                break;
            case 'A':
            case 'a':
                x = 0;
                y = 0;
                z = 1;
                break;
            case 'D':
            case 'd':
                x = 0;
                y = 0;
                z = -1;
                break;
            default:;
        }
        writeVel(x, y, z);
        usleep(100*1000);
        writeVel(0,0,0);
    }
}


int main(int argc, char const *argv[])
{
    keyboard_not_ros k;
    k.mainloop();
    return 0;
}
  1. 編譯程序
    在 ~/catkin_ws/src/beginner_tutorials/src/ 目錄下,終端輸入:
g++ -o keyboard_not_ros keyboard_not_ros.cpp 
  1. 運行程序
    終端輸入系奉,啟動ROS stage和其他相關節(jié)點:
roslaunch beginner_tutorials stage_test.launch 

另一個終端輸入:

./keyboard_not_ros
  1. 結果輸出


    最后的運行結果

備注:但是stage不通過ROS也能使用檬贰,具體看下一篇文章。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缺亮,一起剝皮案震驚了整個濱河市翁涤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萌踱,老刑警劉巖葵礼,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異并鸵,居然都是意外死亡鸳粉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門园担,熙熙樓的掌柜王于貴愁眉苦臉地迎上來届谈,“玉大人,你說我怎么就攤上這事粉铐√墼迹” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵蝙泼,是天一觀的道長程剥。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么织鲸? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任舔腾,我火速辦了婚禮,結果婚禮上搂擦,老公的妹妹穿的比我還像新娘稳诚。我一直安慰自己,他們只是感情好瀑踢,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布扳还。 她就那樣靜靜地躺著,像睡著了一般橱夭。 火紅的嫁衣襯著肌膚如雪氨距。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天棘劣,我揣著相機與錄音俏让,去河邊找鬼。 笑死茬暇,一個胖子當著我的面吹牛首昔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糙俗,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼勒奇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了臼节?” 一聲冷哼從身側響起撬陵,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎网缝,沒想到半個月后巨税,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡粉臊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年草添,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扼仲。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡远寸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屠凶,到底是詐尸還是另有隱情驰后,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布矗愧,位于F島的核電站灶芝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夜涕,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一犯犁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧女器,春花似錦酸役、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丧诺,卻和暖如春暑塑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锅必。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惕艳,地道東北人搞隐。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像远搪,于是被迫代替她去往敵國和親劣纲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容