如何在 C++ 中使用 ROS 服务和与 posix 和信号量的串行通信?
How to use ROS services and serial comunication with posix and semahrores in C++?
我是 C/C++ 中并发和并行编程的新手,所以我的项目需要一些帮助。
我想 运行 在 C++ 中使用 POSIX 和信号量进行多进程处理。所以程序的结构应该是下面这样的。
首先我打开串口(Serial communication of the Raspberry PI 4)。当串口打开时,两个进程 运行ning
第一个,主要的 运行 自动执行以下操作:
该线程要求 ODOM 更新(来自微控制器的压力和 IMU)并发布它们。此外,每 0.3 秒检查一次调制解调器收件箱,如果有新内容,它会发布。
另一个仅根据 ROS 服务的要求检测到调制解调器收件箱中有新消息执行暂停(在第一个主进程上)并在串行端口上执行(发布)。然后第一个进程恢复正常工作
所以我首先尝试做一些看起来像这些的伪 C++ 代码但是我需要帮助,因为我是并发和并行性的新手。在这里
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
void* thread(void* arg) { //function which act like thread
//Main Thread
// Here code for ASK ODOM UPDATE..
// Here code for CHECK MODEM INBOX...
sem_wait(&mutex); //wait state
// ENTER in the second Process
// Here code for the second process which run on DEMAND..
// ROS SERVICES
// Here code for CHECK The MODEM INBOX and HALT the First Process
// Here code for EXECUTE on SERIAL PORT(PUBLISH)
sleep(0.1); //critical section
printf("\nCompleted...\n"); //comming out from Critical section
sem_post(&mutex);
}
main() {
sem_init(&mutex, 0, 1);
pthread_t th1,th2;
pthread_create(&th1,NULL,thread,NULL);
sleep(1);
pthread_create(&th2,NULL,thread,NULL);
//Join threads with the main thread
pthread_join(th1,NULL);
pthread_join(th2,NULL);
sem_destroy(&mutex);
}
所以我不确定这是在 C++ 上实现的正确方法。对实现有什么帮助,也许对实际的 C++ 代码有帮助吗?
谢谢
幸运的是,ROS 允许您决定要使用的线程模型 (http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning)。
您可以为此使用 ros::AsyncSpinner
:
您的主线程启动在后台运行的 AsyncSpinner,侦听 ROS 消息,并在其自己的线程中调用您的 ROS 回调函数。
然后,你的主线程关心你的串口连接和forwards/publishes消息。在 pseudo-code 中,它可能如下所示:
#include <ros/ros.h>
#include <mutex>
#include <std_msgs/Float32.h>
std::mutex mutex_;
void callback(std_msgs::Float32ConstPtr msg) {
// reentrant preprocessing
{
std::lock_guard<std::mutex> guard( mutex_ );
// work with serial port
}
// reentrant posprocessing
}
int main(int argc, char* argv[]) {
ros::init(argc, argv, "name");
ros::NodeHandle node("~");
ros::Subscriber sub = node.subscribe("/test", 1, callback);
ros::AsyncSpinner spinner(1);
spinner.start();
while(ros::ok()) {
// reentrant preprocessing
{
std::lock_guard<std::mutex> guard(mutex_);
// work with serial port
}
// reentrant postprocessing
}
}
您可以看到关键的代码块。在这里,两个线程都是同步的,即一次只有一个线程在其关键路径上。
我使用了 C++ 互斥锁,因为它是 C++ 标准方式,但您当然可以更改它。
此外,请随时在主线程中等待串口消息,以减少芯片的发热。
我是 C/C++ 中并发和并行编程的新手,所以我的项目需要一些帮助。
我想 运行 在 C++ 中使用 POSIX 和信号量进行多进程处理。所以程序的结构应该是下面这样的。 首先我打开串口(Serial communication of the Raspberry PI 4)。当串口打开时,两个进程 运行ning
第一个,主要的 运行 自动执行以下操作: 该线程要求 ODOM 更新(来自微控制器的压力和 IMU)并发布它们。此外,每 0.3 秒检查一次调制解调器收件箱,如果有新内容,它会发布。
另一个仅根据 ROS 服务的要求检测到调制解调器收件箱中有新消息执行暂停(在第一个主进程上)并在串行端口上执行(发布)。然后第一个进程恢复正常工作
所以我首先尝试做一些看起来像这些的伪 C++ 代码但是我需要帮助,因为我是并发和并行性的新手。在这里
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
void* thread(void* arg) { //function which act like thread
//Main Thread
// Here code for ASK ODOM UPDATE..
// Here code for CHECK MODEM INBOX...
sem_wait(&mutex); //wait state
// ENTER in the second Process
// Here code for the second process which run on DEMAND..
// ROS SERVICES
// Here code for CHECK The MODEM INBOX and HALT the First Process
// Here code for EXECUTE on SERIAL PORT(PUBLISH)
sleep(0.1); //critical section
printf("\nCompleted...\n"); //comming out from Critical section
sem_post(&mutex);
}
main() {
sem_init(&mutex, 0, 1);
pthread_t th1,th2;
pthread_create(&th1,NULL,thread,NULL);
sleep(1);
pthread_create(&th2,NULL,thread,NULL);
//Join threads with the main thread
pthread_join(th1,NULL);
pthread_join(th2,NULL);
sem_destroy(&mutex);
}
所以我不确定这是在 C++ 上实现的正确方法。对实现有什么帮助,也许对实际的 C++ 代码有帮助吗? 谢谢
幸运的是,ROS 允许您决定要使用的线程模型 (http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning)。
您可以为此使用 ros::AsyncSpinner
:
您的主线程启动在后台运行的 AsyncSpinner,侦听 ROS 消息,并在其自己的线程中调用您的 ROS 回调函数。
然后,你的主线程关心你的串口连接和forwards/publishes消息。在 pseudo-code 中,它可能如下所示:
#include <ros/ros.h>
#include <mutex>
#include <std_msgs/Float32.h>
std::mutex mutex_;
void callback(std_msgs::Float32ConstPtr msg) {
// reentrant preprocessing
{
std::lock_guard<std::mutex> guard( mutex_ );
// work with serial port
}
// reentrant posprocessing
}
int main(int argc, char* argv[]) {
ros::init(argc, argv, "name");
ros::NodeHandle node("~");
ros::Subscriber sub = node.subscribe("/test", 1, callback);
ros::AsyncSpinner spinner(1);
spinner.start();
while(ros::ok()) {
// reentrant preprocessing
{
std::lock_guard<std::mutex> guard(mutex_);
// work with serial port
}
// reentrant postprocessing
}
}
您可以看到关键的代码块。在这里,两个线程都是同步的,即一次只有一个线程在其关键路径上。
我使用了 C++ 互斥锁,因为它是 C++ 标准方式,但您当然可以更改它。
此外,请随时在主线程中等待串口消息,以减少芯片的发热。