Resumo de erros de programação C++ 2023/6/17

Reportar erro

erro: conversão de 'const LinearMatrixType {também conhecido como const Eigen::Matrix<float, 3, 3>}' para tipo não escalar 'Eigen::Quaternionf {também conhecido como Eigen::Quaternion<float>}' solicitado Eigen::Quaternionf relativo_quat = pose_relativa.rotação();

resolver

Este erro ocorre porque você atribui diretamente uma matriz de rotação $3 \times 3$ (`LinearMatrixType`) a um quaternion (`Quaternionf`), e os dois não podem ser atribuídos diretamente. Para converter uma matriz de rotação em um quaternion, você precisa usar o método `Quaternion` fornecido pela biblioteca Eigen. Especificamente, você pode converter uma matriz de rotação em um quatérnio com o seguinte código:

```
Eigen::Quaternionf relativo_quat(relative_pose.rotation());
```

Isso constrói uma variável quaternion `relative_quat` com a matriz de rotação da pose relativa, onde o método `rotation()` retorna a matriz de rotação.

Observe que esta é apenas uma conversão simples para quatérnio. Se você precisar realizar operações como inversão e interpolação em quatérnio, certifique-se de ter entendido o conhecimento relevante de quatérnio e usar o método apropriado para operar.

Reportar erro

erro: o operando base de '->' tem tipo não-ponteiro 'PointType {também conhecido como pcl::PointXYZI}' ratio = (point->intensity - int(point->intensity)) / time_range;

resolver

Este erro ocorre porque você usou o operador de seta `->` em uma variável `point` que não é do tipo ponteiro. O operador `->` normalmente é usado em ponteiros para objetos de classe para acessar membros dessa classe. No seu código, `point` é do tipo `pcl::PointXYZI`, que é um tipo de estrutura comum, não um tipo de ponteiro.

Para corrigir isso, você pode substituir o operador de seta `->` pelo operador de ponto `.`, assim:

```
proporção = (ponto.intensidade - int(ponto.intensidade)) / intervalo_tempo;
```

Isso usará o operador de ponto `.` para acessar o membro `intensity` do objeto `point` para calcular o valor de `ratio`.

Reportar erro

erro: redeclaração de 'pcl::PointCloud<pcl::PointXYZI>::Ptr source_cloud' pcl::PointCloud<PointType>::Ptr source_cloud (new pcl::PointCloud<PointType>);

Este erro ocorre porque você declarou a variável `source_cloud` com o mesmo nome várias vezes em seu código, o que não é permitido. Em C++, cada nome de variável só pode ser declarado uma vez no mesmo escopo.

Para corrigir isso, você pode considerar o uso de nomes de variáveis ​​diferentes para evitar declarações duplicadas. Se precisar usar a mesma variável de ponteiro em funções diferentes, você pode declarar a variável como uma variável global ou estática. Se precisar usar a variável várias vezes na mesma função, você pode declará-la como uma variável local e colocá-la no escopo correto.

Por exemplo, você pode declarar a variável `source_cloud` como uma variável global ou estática da seguinte forma:

```
// Declarado como uma variável global
pcl::PointCloud<PointType>::Ptr source_cloud (new pcl::PointCloud<PointType>);

// Ou declarado como uma variável estática
static pcl::PointCloud<PointType>::Ptr source_cloud (new pcl::PointCloud<PointType>);
```

Se precisar usar a variável diversas vezes dentro da função, você pode declará-la como uma variável local e colocá-la no escopo correto, por exemplo:

```
void myFunction() { // Declare a variável     pcl::PointCloud<PointType>::Ptr source_cloud (new pcl::PointCloud<PointType>)     no início da função ;     // Use a variável no escopo de a variável     // ...     // No final da função, a variável sai do escopo e é destruída } ```


    


    


Observe que esses códigos são apenas exemplos e não podem ser copiados e colados diretamente em seu código. Você precisa escolher um método de declaração de variável apropriado com base na sua situação real e garantir que os nomes das variáveis ​​não sejam repetidos no mesmo escopo.

Reportar erro

erro: inicialização inválida de referência não const do tipo 'Transform& {também conhecido como Eigen::Transform<float, 3, 1>&}' de um rvalue do tipo 'Transform* {também conhecido como Eigen::Transform<float, 3, 1> *}' LidarMotionCompensation( &extr, org_pc, comp_pc,min_time, max_time, &start_pose, &end_pose)

Este erro ocorre porque você está tentando passar um ponteiro para um objeto `Transform` para um parâmetro de função de tipo de referência não const, o que não é permitido. O parâmetro do tipo referência não constante requer que o parâmetro passado para ele seja um lvalue, ou seja, um objeto com nome e endereço de memória. O ponteiro é um rvalue e não pode ser vinculado diretamente a um parâmetro de tipo de referência não constante.

Para resolver esse problema, você pode usar parâmetros do tipo ponteiro ou alterar os parâmetros da função para tipos de referência const. Se você deseja modificar o valor do objeto `Transform` dentro da função, você pode alterar o parâmetro da função para um tipo de ponteiro, como segue:

```
void LidarMotionCompensation(Transform* extr,
                             const pcl::PointCloud<PointType>::Ptr org_pc,
                             pcl::PointCloud<PointType>::Ptr& comp_pc,
                             double min_time, double max_time,
                             Transform* start_pose, Transform* end_pose)
{     // Modifica os objetos apontados por *extr e *start_pose na função } ```


Se você não precisa modificar o valor do objeto `Transform` dentro da função, você pode alterar o parâmetro da função para um tipo de referência constante, como segue:

```
void LidarMotionCompensation(const Transform& extr,
                             const pcl::PointCloud<PointType>::Ptr org_pc,
                             pcl::PointCloud<PointType>::Ptr& comp_pc,
                             double min_time, double max_time,
                             const Transform& start_pose, const Transform& end_pose)
{     // Leia os valores de extr, start_pose e outros parâmetros na função } ```


Observe que ao alterar os parâmetros da função para tipos de referência const, você só pode ler os valores dos parâmetros, e não modificá-los dentro da função. Se precisar modificar o valor desses parâmetros dentro da função, você deve usar parâmetros do tipo ponteiro.

Como chamar esta função na função principal 

Você pode chamar a função `LidarMotionCompensation` na função principal assim:

```
Transform extr, start_pose, end_pose; // define o objeto Transform

// Suponha que os objetos org_pc e comp_pc foram criados e os dados da nuvem de pontos foram carregados

double min_time = 0.0, max_time = 1.0; // Define o intervalo do timestamp

// Chama a função LidarMotionCompensation
LidarMotionCompensation(extr, org_pc, comp_pc, min_time, max_time, start_pose, end_pose);
```

Supõe-se aqui que você definiu os objetos `Transform` `extr`, `start_pose` e ​​`end_pose`, e criou os objetos `org_pc` e `comp_pc` e carregou os dados da nuvem de pontos. Em seguida, você passa esses objetos como parâmetros para a função `LidarMotionCompensation`. Como `org_pc` é um parâmetro do tipo ponteiro constante, você deve passar um ponteiro ou ponteiro inteligente para um objeto `const pcl::PointCloud<PointType>`; e `comp_pc` é um parâmetro de referência do tipo ponteiro, então você precisa declará-lo como um tipo de ponteiro e passe-o como parâmetro de referência usando o operador `&`.

Após a chamada da função, o objeto apontado por `comp_pc` conterá os dados da nuvem de pontos compensados ​​por movimento.

Reportar erro

erro: 'YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION' não é membro de 'Eigen::internal::static_assertion<false>' EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(OtherMode==int(Affine)||OtherMode==int(AffineCompact), Mode!=int(Isometry) ), ^

Esta mensagem de erro indica que você está usando o mecanismo de asserção estática (static_assertion) do `Eigen` e a asserção não é verdadeira, resultando em um erro de compilação.

`YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION` na mensagem de erro é um código de erro definido dentro da biblioteca `Eigen`, que indica que uma operação de conversão de transformação inválida foi executada. Como você não forneceu mais contexto, não consigo identificar a causa exata do erro no momento. No entanto, a julgar pela mensagem de erro, o problema pode estar relacionado à transformação de tipos em `Eigen` (Affine, Isometry, etc.) e conversões para eles.

Para corrigir isso, é recomendável que você examine cuidadosamente as partes do seu código relacionadas às transformações `Eigen`, especialmente o código que envolve transformações. Certifique-se de usar o tipo de transformação correto e de que as transições entre as transformações estejam em conformidade com os requisitos `Eigen`. Além disso, você também pode tentar reduzir o código relevante ao mínimo, de modo a identificar a linha de código específica que causa o problema, para melhor solucionar o erro.

Já sei // construir o quaternion Eigen::Quaternionf quat(tk_q_w, tk_q_x, tk_q_y, tk_q_z); // construir o vetor de tradução Eigen::Translation3f translation(tk_p_x, tk_p_y, tk_p_z); assim construir Eigen::Transform<float , 3, 1> start_pose 

De acordo com as informações que você forneceu, a transformação `start_pose` é composta por um quaternion e um vetor de translação, onde os coeficientes do quaternion são `tk_q_w, tk_q_x, tk_q_y, tk_q_z`, e os coeficientes do vetor de translação são `tk_p_x, tk_p_y, tk_p_z`. O tipo de transformação é `Eigen::Transform<float, 3, 1>`, que representa a transformação afim no sistema de coordenadas tridimensional.

Você pode combinar um quatérnio e um vetor de tradução em uma transformação usando o seguinte código:

```
Eigen::Transform<float, 3, Eigen::Affine> transform = Eigen::Translation3f(tk_p_x, tk_p_y, tk_p_z) * Eigen::Quaternionf(tk_q_w, tk_q_x, tk_q_y, tk_q_z);
```

Aqui, primeiro usamos `Eigen::Translation3f` para construir uma transformação de tradução `translation` e, em seguida, usamos `Eigen::Quaternionf` para construir uma transformação de rotação `quat` e usamos o operador de multiplicação para combiná-los para obter uma simulação completa Transformação projetiva `transformar`.

Observe que como seu tipo de transformação `start_pose` é `Eigen::Transform<float, 3, 1>`, que é uma transformação na forma de um vetor de coluna tridimensional, você precisa alterar o terceiro parâmetro do modelo de seu construtor para `Eigen::Affine`, indicando o uso de transformação afim (Affine).

Além disso, se você tiver outras operações relacionadas à transformação em seu código, será necessário verificar se elas também estão corretas. Por exemplo, mudando

Ao alterar, confirme se a dimensão do objeto nuvem de pontos participante da transformação corresponde ao tipo da matriz de transformação. Para nuvens de pontos 3D, `Eigen::Transform` ou outros tipos de transformação apropriados devem ser usados, e a dimensão da matriz de transformação deve ser $4 \times 4$, porque as informações de tradução precisam ser incluídas.

Se você se deparar com um problema que não consegue resolver, sugiro que forneça mais contexto e trechos de código para que eu possa ajudá-lo melhor a resolvê-lo.

Reportar erro

/usr/bin/ld: não é possível encontrar -lEigen3::Eigen collect2: erro: ld retornou 1 status de saída CMakeFiles/main.dir/build.make:330: receita para o destino 'main' falhou

Esta mensagem de erro significa que seu compilador não consegue encontrar a biblioteca `Eigen3::Eigen` ao vincular. Normalmente, isso é causado porque o compilador não consegue localizar corretamente os arquivos da biblioteca `Eigen3`.

A solução mais comum para este problema é adicionar o caminho da biblioteca `Eigen3` às opções de link durante a compilação. Você pode tentar adicionar o seguinte snippet ao arquivo `CMakeLists.txt`:

```
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
target_link_libraries(your_target_name Eigen3::Eigen)
```

Onde `your_target_name` é o nome do programa alvo que você deseja compilar, como `main` na mensagem de erro postada acima. Aqui, a função `find_package` é usada para encontrar a biblioteca `Eigen3` instalada no sistema e, em seguida, a função `include_directories` é usada para adicionar o caminho do arquivo de cabeçalho ao caminho de pesquisa do compilador, e a `target_link_libraries` é usada para vincule a biblioteca `Eigen3` ao programa alvo.

Se você seguiu as etapas acima para adicionar os trechos de código apropriados, mas ainda não consegue resolver o problema, certifique-se de ter instalado a biblioteca `Eigen3` e adicionado corretamente seu caminho à variável de ambiente do sistema ou ao caminho de pesquisa do CMake.

Observe que se você estiver usando outras ferramentas de construção, como Makefiles, deverá modificar as opções de vinculação de acordo.

Supongo que te gusta

Origin blog.csdn.net/weixin_56337147/article/details/131265130
Recomendado
Clasificación