跳到主要內容

[ROS] Nodelet Example

In order to successfully build a node that uses a nodelet for transport, we have to fix a lot of things when using catkin_create_pkg :
1. CMakeList.txt
2. package.xml
3. nodelet_plugin.xml
4. main.cpp

Explain in order:
1. CMakeList.txt
Pay special attention to adding a nodelet

``` code
Cmake_minimum_required(VERSION 2.8.3)
Project(lidars_grabber_nodelet)

Find_package(catkin REQUIRED COMPONENTS
  Nodelet
  Roscpp
  Rospy
  Std_msgs
)

# Because the nodelet is referenced as a lib, so add this paragraph
Add_library(${PROJECT_NAME}
   Src/lidars_grabber_nodelet.cpp
 )

#把 nodelet as a dependent library
If(catkin_EXPORTED_LIBRARIES)
  Add_dependencies(lidars_grabber_nodelet ${catkin_EXPORTED_LIBRARIES})
Endif()

# Remember to attach nodelet_plugins.xml
# nodelet_plugins.xml is manually added
 Install(FILES
  # myfile1
  # myfile2
  Nodelet_plugins.xml
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
 )
```

2. package.xml
In addition to the build_depend of the nodelet, remember to fill in the block at the end.

```code


  lidars_grabber_nodelet
  0.0.0
  The lidars_grabber_nodelet package

  TODO

  catkin
  nodelet
  roscpp
  rospy
  std_msgs

  nodelet
  roscpp
  rospy
  std_msgs

  nodelet
  roscpp
  rospy
  std_msgs

 
   
 


```

3. nodelet_plugin.xml
Basically just fill in the class name you wrote in cpp

```code

 
 
  This is lidars grabber nodelet.
 
 

```


4. main.cpp
Since the nodelet is treated as a class for loading, the content needs to be written in class.

```code
#include
#include
#include
#include
#include


#include //fabs

Namespace nodelet_tutorial_math
{

Class Plus : public nodelet::Nodelet
{
Public:
  Plus()
  : value_(0)
  {}

Private:
  Virtual void onInit()
  {
    Ros::NodeHandle& private_nh = getPrivateNodeHandle();
    private_nh.getParam("value", value_);
    Pub = private_nh.advertise("out", 10);
    Sub = private_nh.subscribe("in", 10, &Plus::callback, this);
  }

  Void callback(const std_msgs::Float64::ConstPtr& input)
  {
    Std_msgs::Float64Ptr output(new std_msgs::Float64());
    Output->data = input->data + value_;
    NODELET_DEBUG("Adding %f to get %f", value_, output->data);
    Pub.publish(output);
  }

  Ros::Publisher pub;
  Ros::Subscriber sub;
  Double value_;
};

PLUGINLIB_EXPORT_CLASS(nodelet_tutorial_math::Plus, nodelet::Nodelet)
}

```

留言

這個網誌中的熱門文章

[python] 使用 python 控制 docx 範例

因為同事的需求,無職 a 我就又再度幫忙同事寫一些小程式。 這些小程式雖然簡單,但是聽到如果不幫忙寫程式解決,以手工作業的"大量人天" 的後果真的是讓人吐血。 他們有一份工作,需要產出一份很多很多很多資料圖片的判釋報告,要把數百張圖片剪裁成特定大小,加上圖說之後放入 word 裡面。 聽到的做法是...一張一張插圖!! wooow! That's really shocking me! 所以為了前公司同事的幸福,我還是加減寫一下好了。

[電銲] 自己的 IMU 自己焊!笨蛋的焊接法!

工程師真的是被要求包山包海都要會... IMU的組件被要求不能只插麵包板,要 "穩固的固定在另外製作的盒子裡",反正就是搞得跟外面幾十萬上下的 IMU 一樣精緻就是了。 好好好都焊給你~ 呃 對了 怎麼焊哈哈哈哈 ^^" 電焊這種技術自從上過國中的生活科技後就再也沒再用了@@,好家在這是個網路就是你家的時代,立刻上網查一查,找到一些關於焊槍使用的相關資料。 被要求說GY-91不能只接麵包板一定焊死才穩固所以就這樣接了

[RaspberryPI] 一鍵啟動 .py 文件

先講總結: 樹莓派君你好討厭啊啊啊啊! 今天把程式整理完之後,心血來潮,想要把 程式弄得更 "一鍵啟動" 一點。 也就是我只要用我的觸控螢幕一點,就可以直接打開寫好的 QT 介面做 IMU 和 相機的紀錄 親手烘培(?) 的 QT 介面